Salome HOME
bos #20282 EDF 22320 - general compute fails
[modules/smesh.git] / src / StdMeshers / StdMeshers_FaceSide.cxx
index 6c6d4c2bedea7e66064297b9546acd6899b052b4..a9c254e096edeb155f9e4680fbfde2191b0458a1 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -181,6 +181,41 @@ StdMeshers_FaceSide::StdMeshers_FaceSide(const TopoDS_Face&            theFace,
 
   } // loop on edges
 
+  // orient seam edges (#19982)
+  const double tol = Precision::Confusion();
+  if ( NbEdges() > 1 && !myC2d[0].IsNull() )
+    for ( int i = 0; i < NbEdges(); ++i )
+    {
+      int iPrev = SMESH_MesherHelper::WrapIndex( i - 1, NbEdges() );
+      if ( !BRep_Tool::IsClosed( myEdge[i], myFace ) || !myC2d[iPrev] )
+        continue;
+      gp_Pnt2d pLastPrev = myC2d[iPrev]->Value( myLast[iPrev] );
+      gp_Pnt2d pFirst    = myC2d[i]->Value( myFirst[i] );
+      if ( pLastPrev.IsEqual( pFirst, tol ))
+        continue; // OK
+      pFirst = myC2d[i]->Value( myLast[i] );
+      if ( pLastPrev.IsEqual( pFirst, tol ))
+      {
+        std::swap( myFirst[i], myLast[i] );
+        continue;
+      }
+      TopoDS_Edge E = myEdge[i];
+      E.Reverse();
+      Handle(Geom2d_Curve) c2dRev = BRep_Tool::CurveOnSurface( E, myFace, myFirst[i], myLast[i] );
+      pFirst = c2dRev->Value( myFirst[i] );
+      if ( pLastPrev.IsEqual( pFirst, tol ))
+      {
+        myC2d[i] = c2dRev;
+        continue;
+      }
+      pFirst = c2dRev->Value( myLast[i] );
+      if ( pLastPrev.IsEqual( pFirst, tol ))
+      {
+        myC2d[i] = c2dRev;
+        std::swap( myFirst[i], myLast[i] );
+      }
+    }
+
   // count nodes and segments
   NbPoints( /*update=*/true );
 
@@ -450,6 +485,7 @@ const std::vector<UVPtStruct>& StdMeshers_FaceSide::GetUVPtStruct(bool   isXCons
         for ( size_t j = 0; j < u2nodeVec.size(); ++j )
           u2node.insert( u2node.end(), u2nodeVec[j] );
       }
+      continue;
     } // loop on myEdge's
 
     // Add 2nd VERTEX node for a last EDGE