Salome HOME
#19982 EDF 21954 - Compute mesh fails
authoreap <eap@opencascade.com>
Mon, 12 Oct 2020 08:47:53 +0000 (11:47 +0300)
committereap <eap@opencascade.com>
Mon, 12 Oct 2020 08:47:53 +0000 (11:47 +0300)
src/StdMeshers/CMakeLists.txt
src/StdMeshers/StdMeshers_FaceSide.cxx

index 2947ada60c304967ae0c4174d097159b42bbac51..87e4db8ebcc8929e4e19d5af901ca0f23e1bdcd6 100644 (file)
@@ -62,6 +62,7 @@ SET(_link_LIBRARIES
   ${GEOM_GEOMUtils}
   SMESHimpl
   SMESHDS
+  SMESHUtils
   ${TBB_LIBS}
 )
 
index da593c9c364ccf4431173d699bb6b0f62c8ada33..6d0e8a97a3fb6ef38617075378057ca3f32b7d80 100644 (file)
@@ -181,6 +181,41 @@ StdMeshers_FaceSide::StdMeshers_FaceSide(const TopoDS_Face&            theFace,
 
   } // loop on edges
 
+  // orient seam edges (#19982)
+  const 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 );