Salome HOME
#16578 EDF - Scibian - ViscousLayer / SIGSEGV
authoreap <eap@opencascade.com>
Thu, 14 Feb 2019 11:22:06 +0000 (14:22 +0300)
committereap <eap@opencascade.com>
Thu, 14 Feb 2019 11:22:06 +0000 (14:22 +0300)
src/SMESH/SMESH_Algo.cxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_Mesh_i.cxx

index 8b2d1c5..6585e10 100644 (file)
@@ -263,6 +263,10 @@ SMESH_Algo::GetUsedHypothesis(SMESH_Mesh &         aMesh,
                               const bool           ignoreAuxiliary) const
 {
   SMESH_Algo* me = const_cast< SMESH_Algo* >( this );
+
+  std::list<const SMESHDS_Hypothesis *> savedHyps; // don't delete the list if 
+  savedHyps.swap( me->_usedHypList );              // it does not change (#16578)
+
   me->_usedHypList.clear();
   if ( const SMESH_HypoFilter* filter = GetCompatibleHypoFilter( ignoreAuxiliary ))
   {
@@ -270,6 +274,9 @@ SMESH_Algo::GetUsedHypothesis(SMESH_Mesh &         aMesh,
     if ( ignoreAuxiliary && _usedHypList.size() > 1 )
       me->_usedHypList.clear(); //only one compatible hypothesis allowed
   }
+  if ( _usedHypList == savedHyps )
+    savedHyps.swap( me->_usedHypList );
+
   return _usedHypList;
 }
 
@@ -287,10 +294,17 @@ SMESH_Algo::GetAppliedHypothesis(SMESH_Mesh &         aMesh,
                                  const bool           ignoreAuxiliary) const
 {
   SMESH_Algo* me = const_cast< SMESH_Algo* >( this );
+
+  std::list<const SMESHDS_Hypothesis *> savedHyps; // don't delete the list if 
+  savedHyps.swap( me->_appliedHypList );           // it does not change (#16578)
+
   me->_appliedHypList.clear();
   if ( const SMESH_HypoFilter* filter = GetCompatibleHypoFilter( ignoreAuxiliary ))
     aMesh.GetHypotheses( aShape, *filter, me->_appliedHypList, false );
 
+  if ( _appliedHypList == savedHyps )
+    savedHyps.swap( me->_appliedHypList );
+
   return _appliedHypList;
 }
 
index 7ef847b..1c064e3 100644 (file)
@@ -7394,16 +7394,16 @@ void SMESH_MeshEditor_i::MakePolyLine(SMESH::ListOfPolySegments& theSegments,
   }
   else if ( theGroupName[0] ) // find/create a group of segments
   {
-    SMESH_Mesh::GroupIteratorPtr grpIt = myMesh->GetGroups();
-    while ( !groupDS && grpIt->more() )
-    {
-      SMESH_Group* group = grpIt->next();
-      if ( group->GetGroupDS()->GetType() == SMDSAbs_Edge &&
-           strcmp( group->GetName(), theGroupName ) == 0 )
-      {
-        groupDS = dynamic_cast< SMESHDS_Group* >( group->GetGroupDS() );
-      }
-    }
+    // SMESH_Mesh::GroupIteratorPtr grpIt = myMesh->GetGroups();
+    // while ( !groupDS && grpIt->more() )
+    // {
+    //   SMESH_Group* group = grpIt->next();
+    //   if ( group->GetGroupDS()->GetType() == SMDSAbs_Edge &&
+    //        strcmp( group->GetName(), theGroupName ) == 0 )
+    //   {
+    //     groupDS = dynamic_cast< SMESHDS_Group* >( group->GetGroupDS() );
+    //   }
+    // }
     if ( !groupDS )
     {
       SMESH::SMESH_Group_var groupVar = myMesh_i->CreateGroup( SMESH::EDGE, theGroupName );
index a926430..32f6589 100644 (file)
@@ -5356,7 +5356,7 @@ void SMESH_Mesh_i::CreateGroupServants()
   while ( groupIt->more() )
   {
     ::SMESH_Group* group = groupIt->next();
-    int            anId = group->GetGroupDS()->GetID();
+    int             anId = group->GetID();
 
     map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.find(anId);
     if ( it != _mapGroups.end() && !CORBA::is_nil( it->second ))