Salome HOME
22711: [CEA 1297] Regression of mesh with a projection on a spherical face
authoreap <eap@opencascade.com>
Mon, 29 Sep 2014 11:50:55 +0000 (15:50 +0400)
committereap <eap@opencascade.com>
Mon, 29 Sep 2014 11:50:55 +0000 (15:50 +0400)
 In fixDistortedFaces() care of face planarity and degenerated edges

src/StdMeshers/StdMeshers_Projection_2D.cxx

index b4f3e3b5546ab8c426b877f7f7a36970b36dee59..5e4586bed89df5e2216ee2f60c8e728b1f03a711 100644 (file)
@@ -51,6 +51,7 @@
 #include <BRep_Tool.hxx>
 #include <Bnd_B2d.hxx>
 #include <GeomAPI_ProjectPointOnSurf.hxx>
 #include <BRep_Tool.hxx>
 #include <Bnd_B2d.hxx>
 #include <GeomAPI_ProjectPointOnSurf.hxx>
+#include <GeomLib_IsPlanarSurface.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
@@ -935,13 +936,23 @@ namespace {
       for ( size_t i = 0; i < nodes.size(); ++n, ++i )
         nodes[ i ] = *n;
 
       for ( size_t i = 0; i < nodes.size(); ++n, ++i )
         nodes[ i ] = *n;
 
-      // get UVs
+      // avoid elems on degenarate shapes as UV on them can be wrong
+      if ( helper.HasDegeneratedEdges() )
+      {
+        bool isOnDegen = false;
+        for ( size_t i = 0; ( i < nodes.size() && !isOnDegen ); ++i )
+          isOnDegen = helper.IsDegenShape( nodes[ i ]->getshapeId() );
+        if ( isOnDegen )
+          continue;
+      }
+      // prepare to getting UVs
       const SMDS_MeshNode* inFaceNode = 0;
       if ( helper.HasSeam() )
         for ( size_t i = 0; ( i < nodes.size() && !inFaceNode ); ++i )
           if ( !helper.IsSeamShape( nodes[ i ]->getshapeId() ))
             inFaceNode = nodes[ i ];
 
       const SMDS_MeshNode* inFaceNode = 0;
       if ( helper.HasSeam() )
         for ( size_t i = 0; ( i < nodes.size() && !inFaceNode ); ++i )
           if ( !helper.IsSeamShape( nodes[ i ]->getshapeId() ))
             inFaceNode = nodes[ i ];
 
+      // get UVs
       uv.resize( nodes.size() );
       for ( size_t i = 0; i < nodes.size(); ++i )
         uv[ i ] = helper.GetNodeUV( F, nodes[ i ], inFaceNode );
       uv.resize( nodes.size() );
       for ( size_t i = 0; i < nodes.size(); ++i )
         uv[ i ] = helper.GetNodeUV( F, nodes[ i ], inFaceNode );
@@ -989,10 +1000,15 @@ namespace {
       SMESH_MeshEditor:: SmoothMethod algo =
         isConcaveBoundary ? SMESH_MeshEditor::CENTROIDAL : SMESH_MeshEditor::LAPLACIAN;
 
       SMESH_MeshEditor:: SmoothMethod algo =
         isConcaveBoundary ? SMESH_MeshEditor::CENTROIDAL : SMESH_MeshEditor::LAPLACIAN;
 
+      // smooth in 2D or 3D?
+      TopLoc_Location loc;
+      Handle(Geom_Surface) surface = BRep_Tool::Surface( F, loc );
+      bool isPlanar = GeomLib_IsPlanarSurface( surface ).IsPlanar();
+
       // smoothing
       set<const SMDS_MeshNode*> fixedNodes;
       editor.Smooth( faces, fixedNodes, algo, /*nbIterations=*/ 10,
       // smoothing
       set<const SMDS_MeshNode*> fixedNodes;
       editor.Smooth( faces, fixedNodes, algo, /*nbIterations=*/ 10,
-                     /*theTgtAspectRatio=*/1.0, /*the2D=*/false);
+                     /*theTgtAspectRatio=*/1.0, /*the2D=*/!isPlanar);
     }
   }
 
     }
   }