X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_PolyLine.cxx;h=dd79006ba8eed9beae0535a7c428a7e0f7b96ca6;hb=HEAD;hp=c252afb2c77515a5c4eb68cead4d9ed37a375f9b;hpb=385d4cede5f752d0eec26c306f3b5e14511e2a3d;p=modules%2Fsmesh.git diff --git a/src/SMESHUtils/SMESH_PolyLine.cxx b/src/SMESHUtils/SMESH_PolyLine.cxx index c252afb2c..dd79006ba 100644 --- a/src/SMESHUtils/SMESH_PolyLine.cxx +++ b/src/SMESHUtils/SMESH_PolyLine.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2018-2019 OPEN CASCADE +// Copyright (C) 2018-2024 CEA, EDF, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -154,7 +154,10 @@ namespace if ( !path.SetCutAtCorner( cornerNode, fIt->next(), plnNorm, plnOrig )) continue; - if ( !myAvoidSet.insert( path.myNode1.Node() ).second || + if ( path.myDot1 == 0 && + !myAvoidSet.insert( path.myNode1.Node() ).second ) + continue; + if ( path.myDot2 == 0 && !myAvoidSet.insert( path.myNode2.Node() ).second ) continue; @@ -356,7 +359,7 @@ namespace { SMESH_MeshAlgos::PolySegment& polySeg = mySegments[ iSeg ]; - if ( ( polySeg.myXYZ[0] - polySeg.myXYZ[1] ).SquareModulus() == 0 ) + if (( polySeg.myXYZ[0] - polySeg.myXYZ[1] ).SquareModulus() == 0 ) { myPaths[ iSeg ].AddPoint( polySeg.myXYZ[0] ); myPaths[ iSeg ].AddPoint( polySeg.myXYZ[1] ); @@ -418,7 +421,7 @@ namespace if ( face2 ) polySeg.myFace[ iP ] = face2; else - ;// ?? + {} // todo: ?? for ( int i = 0; i < 3; ++i ) { nodes[ i ] = polySeg.myFace[ iP ]->GetNode( i ); @@ -494,28 +497,37 @@ namespace << " in a PolySegment " << iSeg ); if ( path.myDot1 == 0. && - path.myDot2 == 0. && - paths.size() - nbPaths >= 2 ) // use a face non-parallel to the plane + path.myDot2 == 0. ) { - const SMDS_MeshElement* goodFace = 0; - for ( size_t j = nbPaths; j < paths.size(); ++j ) + if ( paths.size() - nbPaths >= 2 ) // use a face non-parallel to the plane { - path = paths[j]; - if ( path.Extend( plnNorm, plnOrig )) - goodFace = paths[j].myFace; - else - paths[j].myFace = 0; - } - if ( !goodFace ) - throw SALOME_Exception ( SMESH_Comment("Cant move from point ") << iP+1 - << " of a PolySegment " << iSeg ); - for ( size_t j = nbPaths; j < paths.size(); ++j ) - if ( !paths[j].myFace ) + const SMDS_MeshElement* goodFace = 0; + for ( size_t j = nbPaths; j < paths.size(); ++j ) { - paths[j].myFace = goodFace; - paths[j].myNodeInd1 = goodFace->GetNodeIndex( paths[j].myNode1.Node() ); - paths[j].myNodeInd2 = goodFace->GetNodeIndex( paths[j].myNode2.Node() ); + path = paths[j]; + if ( path.Extend( plnNorm, plnOrig )) + goodFace = paths[j].myFace; + else + paths[j].myFace = 0; } + if ( !goodFace ) + throw SALOME_Exception ( SMESH_Comment("Cant move from point ") << iP+1 + << " of a PolySegment " << iSeg ); + for ( size_t j = nbPaths; j < paths.size(); ++j ) + if ( !paths[j].myFace ) + { + paths[j].myFace = goodFace; + paths[j].myNodeInd1 = goodFace->GetNodeIndex( paths[j].myNode1.Node() ); + paths[j].myNodeInd2 = goodFace->GetNodeIndex( paths[j].myNode2.Node() ); + } + } + else // use the sole found face + { + path = paths.back(); + std::swap( path.myNode1, path.myNode2 ); + std::swap( path.myNodeInd1, path.myNodeInd2 ); + paths.push_back( path ); + } } }