From e1969210a97c4c790d0147cdaddd22116c05838e Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 28 Sep 2017 17:47:26 +0300 Subject: [PATCH] Fix crashes caused by mesh compacting --- doc/salome/examples/ex_MakePolyLine.py | 3 +++ src/SMESH/SMESH_MeshEditor.cxx | 29 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/doc/salome/examples/ex_MakePolyLine.py b/doc/salome/examples/ex_MakePolyLine.py index 354a1d765..530d39cd7 100644 --- a/doc/salome/examples/ex_MakePolyLine.py +++ b/doc/salome/examples/ex_MakePolyLine.py @@ -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") diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 8c5de25a4..f9d0348c7 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -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 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 ); -- 2.30.2