Salome HOME
Fix crashes caused by mesh compacting
authoreap <eap@opencascade.com>
Thu, 28 Sep 2017 14:47:26 +0000 (17:47 +0300)
committereap <eap@opencascade.com>
Thu, 28 Sep 2017 14:47:26 +0000 (17:47 +0300)
doc/salome/examples/ex_MakePolyLine.py
src/SMESH/SMESH_MeshEditor.cxx

index 354a1d765bb8f446fe2a64735bf15f87b253c9f7..530d39cd766eef265f0aab9964f06fe40398eabb 100644 (file)
@@ -23,8 +23,11 @@ Mesh_1.Compute()
 # define arguments for MakePolyLine
 
 segments = []
+# between nodes 20 and 1, default plane
 segments.append( SMESH.PolySegment( 20, 0, 1, 0, smesh.MakeDirStruct(0,0,0) ))
+# between nodes 1 and 100, default plane
 segments.append( SMESH.PolySegment( 1, 0, 200, 0, smesh.MakeDirStruct(0,0,0) ))
+# between nodes 200 and edge (578, 577), plane includes vector (1,1,1)
 segments.append( SMESH.PolySegment( 200, 0, 578, 577, smesh.MakeDirStruct(1,1,1) ))
 
 Mesh_1.MakePolyLine( segments, "1D group")
index 8c5de25a4ecc0d718a90975f45c77294fb8d6a39..f9d0348c79d4fa19f71d878b98a8bbe20bbd3f1a 100644 (file)
@@ -12878,19 +12878,23 @@ namespace // utils for MakePolyLine
 
   void Path::Remove( std::vector< Path > & paths, size_t& i )
   {
-    size_t j = paths.size() - 1; // last item to be removed
-    if ( i < j )
+    if ( paths.size() > 1 )
     {
-      paths[ i ].myPoints.swap( paths[ j ].myPoints );
-      paths[ i ].myFace     = paths[ j ].myFace;
-      paths[ i ].myNodeInd1 = paths[ j ].myNodeInd1;
-      paths[ i ].myNodeInd2 = paths[ j ].myNodeInd2;
-      paths[ i ].myNode1    = paths[ j ].myNode1;
-      paths[ i ].myNode2    = paths[ j ].myNode2;
-      paths[ i ].myLength   = paths[ j ].myLength;
+      size_t j = paths.size() - 1; // last item to be removed
+      if ( i < j )
+      {
+        paths[ i ].myPoints.swap( paths[ j ].myPoints );
+        paths[ i ].myFace     = paths[ j ].myFace;
+        paths[ i ].myNodeInd1 = paths[ j ].myNodeInd1;
+        paths[ i ].myNodeInd2 = paths[ j ].myNodeInd2;
+        paths[ i ].myNode1    = paths[ j ].myNode1;
+        paths[ i ].myNode2    = paths[ j ].myNode2;
+        paths[ i ].myLength   = paths[ j ].myLength;
+      }
     }
     paths.pop_back();
-    --i;
+    if ( i > 0 )
+      --i;
   }
 
   //================================================================================
@@ -13183,7 +13187,7 @@ void SMESH_MeshEditor::MakePolyLine( TListOfPolySegments&   theSegments,
   SMESHUtils::Deleter<SMESH_ElementSearcher> delSearcher;
   if ( !searcher )
   {
-    searcher = SMESH_MeshAlgos::GetElementSearcher( *myMesh->GetMeshDS() );
+    searcher = SMESH_MeshAlgos::GetElementSearcher( *GetMeshDS() );
     delSearcher._obj = searcher;
   }
 
@@ -13217,6 +13221,9 @@ void SMESH_MeshEditor::MakePolyLine( TListOfPolySegments&   theSegments,
     }
   }
 
+  // assure that inverse elements are constructed, avoid their concurrent building in threads
+  GetMeshDS()->nodesIterator()->next()->NbInverseElements();
+
   // find paths
 
   PolyPathCompute algo( theSegments, segPaths, myMesh );