Salome HOME
Fix regressions
[modules/smesh.git] / src / SMESH / SMESH_subMesh.cxx
index fdea4fed2434d9910a27945657cc74a3a41f7d0c..19f10229a442b7929e16a2c930e80312d21541e1 100644 (file)
@@ -1279,24 +1279,34 @@ static void cleanSubMesh( SMESH_subMesh * subMesh )
       if ( nbElems > 0 )
       {
         // start from elem with max ID to avoid filling the pool of IDs
-        const SMDS_MeshElement * lastElem = subMeshDS->GetElement( nbElems-1 );
-        bool rev = ( lastElem->GetID() == meshDS->MaxElementID() );
+        bool rev = true;
         SMDS_ElemIteratorPtr ite = subMeshDS->GetElements( rev );
+        const SMDS_MeshElement * lastElem = ite->next();
+        rev = ( lastElem->GetID() == meshDS->MaxElementID() );
+        if ( !rev )
+          ite = subMeshDS->GetElements( rev );
+        else
+          meshDS->RemoveFreeElement( lastElem, subMeshDS );
         while (ite->more()) {
           const SMDS_MeshElement * elt = ite->next();
-          meshDS->RemoveFreeElement(elt, 0);
+          meshDS->RemoveFreeElement( elt, subMeshDS );
         }
       }
       int nbNodes = subMeshDS->NbNodes();
       if ( nbNodes > 0 )
       {
-        const SMDS_MeshNode * lastNode = subMeshDS->GetNode( nbNodes-1 );
-        bool rev = ( lastNode->GetID() == meshDS->MaxNodeID() );
+        bool rev = true;
         SMDS_NodeIteratorPtr itn = subMeshDS->GetNodes( rev );
+        const SMDS_MeshNode * lastNode = itn->next();
+        rev = ( lastNode->GetID() == meshDS->MaxNodeID() );
+        if ( !rev )
+          itn = subMeshDS->GetNodes( rev );
+        else
+          meshDS->RemoveNode( lastNode );
         while (itn->more()) {
           const SMDS_MeshNode * node = itn->next();
           if ( node->NbInverseElements() == 0 )
-            meshDS->RemoveFreeNode(node, 0);
+            meshDS->RemoveFreeNode( node, subMeshDS );
           else // for StdMeshers_CompositeSegment_1D: node in one submesh, edge in another
             meshDS->RemoveNode(node);
         }