Salome HOME
Fix MinDistance for node-group (SALOME_TESTS/Grids/smesh/imps_09/K0)
[modules/smesh.git] / src / SMESHUtils / SMESH_PolyLine.cxx
index c252afb2c77515a5c4eb68cead4d9ed37a375f9b..82ace285912eba5086e0b76940d3397ee20027bc 100644 (file)
@@ -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;
 
@@ -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 );
+            }
           }
         }