Salome HOME
Projection 2D failure due to incorrect detection of distorted result faces
[modules/smesh.git] / src / SMESH / SMESH_MesherHelper.cxx
index 0d4173c28db7da996bdd311c049c1b25ca2cfdc8..c6c51ab37a9bdf0206d269593b9634ceaab1e929 100644 (file)
@@ -941,7 +941,7 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge&   E,
   int  shapeID = n->getshapeId();
   bool infinit = Precision::IsInfinite( u );
   bool zero    = ( u == 0. );
-  if ( force || toCheckPosOnShape( shapeID ) || infinit || zero )
+  if ( force || infinit || zero || toCheckPosOnShape( shapeID ))
   {
     TopLoc_Location loc; double f,l;
     Handle(Geom_Curve) curve = BRep_Tool::Curve( E,loc,f,l );
@@ -958,7 +958,7 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge&   E,
       gp_Pnt nodePnt = SMESH_TNodeXYZ( n );
       if ( !loc.IsIdentity() ) nodePnt.Transform( loc.Transformation().Inverted() );
       gp_Pnt curvPnt;
-      double dist = u;
+      double dist = 2*tol;
       if ( !infinit )
       {
         curvPnt = curve->Value( u );
@@ -2464,7 +2464,7 @@ namespace
 
 //=======================================================================
 //function : IsStructured
-//purpose  : Return true if 2D mesh on FACE is structured
+//purpose  : Return true if 2D mesh on FACE is a structured rectangle
 //=======================================================================
 
 bool SMESH_MesherHelper::IsStructured( SMESH_subMesh* faceSM )
@@ -2559,7 +2559,8 @@ bool SMESH_MesherHelper::IsStructured( SMESH_subMesh* faceSM )
 //purpose  : Return true if 2D mesh on FACE is ditorted
 //=======================================================================
 
-bool SMESH_MesherHelper::IsDistorted2D( SMESH_subMesh* faceSM )
+bool SMESH_MesherHelper::IsDistorted2D( SMESH_subMesh* faceSM,
+                                        bool           checkUV)
 {
   if ( !faceSM || faceSM->GetSubShape().ShapeType() != TopAbs_FACE )
     return false;
@@ -2574,9 +2575,10 @@ bool SMESH_MesherHelper::IsDistorted2D( SMESH_subMesh* faceSM )
   if ( !smDS || smDS->NbElements() == 0 ) return false;
 
   SMDS_ElemIteratorPtr faceIt = smDS->GetElements();
-  double prevArea2D = 0;
+  double prevArea = 0;
   vector< const SMDS_MeshNode* > nodes;
   vector< gp_XY >                uv;
+  bool* toCheckUV = checkUV ? & checkUV : 0;
   while ( faceIt->more() && !haveBadFaces )
   {
     const SMDS_MeshElement* face = faceIt->next();
@@ -2608,18 +2610,18 @@ bool SMESH_MesherHelper::IsDistorted2D( SMESH_subMesh* faceSM )
     // get UVs
     uv.resize( nodes.size() );
     for ( size_t i = 0; i < nodes.size(); ++i )
-      uv[ i ] = helper.GetNodeUV( F, nodes[ i ], inFaceNode );
+      uv[ i ] = helper.GetNodeUV( F, nodes[ i ], inFaceNode, toCheckUV );
 
     // compare orientation of triangles
+    double faceArea = 0;
     for ( int iT = 0, nbT = nodes.size()-2; iT < nbT; ++iT )
     {
       gp_XY v1 = uv[ iT+1 ] - uv[ 0 ];
       gp_XY v2 = uv[ iT+2 ] - uv[ 0 ];
-      double area2D = v2 ^ v1;
-      if (( haveBadFaces = ( area2D * prevArea2D < 0 )))
-        break;
-      prevArea2D = area2D;
+      faceArea += v2 ^ v1;
     }
+    haveBadFaces = ( faceArea * prevArea < 0 );
+    prevArea = faceArea;
   }
 
   return haveBadFaces;