Salome HOME
Fix regression of mesh_Projection_2D_00/A1 test.
[modules/smesh.git] / src / SMESH / SMESH_MesherHelper.hxx
index 1540751f58e80980b55b10d3258ee67ca602670b..50715cc4f5b57e081a27083a165eb28fb9401fe6 100644 (file)
@@ -117,6 +117,11 @@ class SMESH_EXPORT SMESH_MesherHelper
    */
   static bool IsStructured( SMESH_subMesh* faceSM );
 
+  /*!
+   * \brief Return true if 2D mesh on FACE is distored
+   */
+  static bool IsDistorted2D( SMESH_subMesh* faceSM, bool checkUV=false );
+
   /*!
    * \brief Returns true if given node is medium
     * \param n - node to check
@@ -167,15 +172,15 @@ class SMESH_EXPORT SMESH_MesherHelper
    *   a0   p0    a1
    */
   inline static gp_XY calcTFI(double x, double y,
-                              const gp_XY a0,const gp_XY a1,const gp_XY a2,const gp_XY a3,
-                              const gp_XY p0,const gp_XY p1,const gp_XY p2,const gp_XY p3);
+                              const gp_XY& a0,const gp_XY& a1,const gp_XY& a2,const gp_XY& a3,
+                              const gp_XY& p0,const gp_XY& p1,const gp_XY& p2,const gp_XY& p3);
 
   /*!
    * \brief Same as "gp_XY calcTFI(...)" but in 3D
    */
   inline static gp_XYZ calcTFI(double x, double y,
-                               const gp_XYZ a0,const gp_XYZ a1,const gp_XYZ a2,const gp_XYZ a3,
-                               const gp_XYZ p0,const gp_XYZ p1,const gp_XYZ p2,const gp_XYZ p3);
+                               const gp_XYZ& a0,const gp_XYZ& a1,const gp_XYZ& a2,const gp_XYZ& a3,
+                               const gp_XYZ& p0,const gp_XYZ& p1,const gp_XYZ& p2,const gp_XYZ& p3);
   /*!
    * \brief Count nb of sub-shapes
     * \param shape - the shape
@@ -216,6 +221,8 @@ class SMESH_EXPORT SMESH_MesherHelper
 
   static bool IsSubShape( const TopoDS_Shape& shape, SMESH_Mesh* aMesh );
 
+  static bool IsBlock( const TopoDS_Shape& shape );
+
   static double MaxTolerance( const TopoDS_Shape& shape );
 
   static double GetAngle( const TopoDS_Edge & E1, const TopoDS_Edge & E2,
@@ -587,10 +594,14 @@ public:
    *  \param force3d - true means node creation at the middle between the
    *                   two given nodes, else node position is found on its
    *                   supporting geometrical shape, if any.
+   *  \param expectedSupport - shape type corresponding to element being created
+   *                           , e.g TopAbs_EDGE if SMDSAbs_Edge is created
+   *                           basing on \a n1 and \a n2
    */
   const SMDS_MeshNode* GetMediumNode(const SMDS_MeshNode* n1,
                                      const SMDS_MeshNode* n2,
-                                     const bool force3d);
+                                     const bool           force3d,
+                                     TopAbs_ShapeEnum     expectedSupport=TopAbs_SHAPE);
   /*!
    * \brief Return existing or create a new central node for a quardilateral
    *       quadratic face given its 8 nodes.
@@ -624,7 +635,8 @@ public:
    */
   std::pair<int, TopAbs_ShapeEnum> GetMediumPos(const SMDS_MeshNode* n1,
                                                 const SMDS_MeshNode* n2,
-                                                const bool           useCurSubShape=false);
+                                                const bool           useCurSubShape=false,
+                                                TopAbs_ShapeEnum     expectedSupport=TopAbs_SHAPE);
   /*!
    * \brief Add a link in my data structure
    */
@@ -664,11 +676,14 @@ public:
    *  \param uv2 - UV within a face
    *  \retval gp_Pnt2d - selected UV
    */
-  gp_Pnt2d GetUVOnSeam( const gp_Pnt2d& uv1, const gp_Pnt2d& uv2 ) const;
+  gp_Pnt2d getUVOnSeam( const gp_Pnt2d& uv1, const gp_Pnt2d& uv2 ) const;
 
   const SMDS_MeshNode* getMediumNodeOnComposedWire(const SMDS_MeshNode* n1,
                                                    const SMDS_MeshNode* n2,
                                                    bool                 force3d);
+
+  double getFaceMaxTol( const TopoDS_Shape& face ) const;
+
  private:
 
   // Forbiden copy constructor
@@ -703,9 +718,11 @@ public:
   double          myPar1[2], myPar2[2]; // U and V bounds of a closed periodic surface
   int             myParIndex;     // bounds' index (1-U, 2-V, 3-both)
 
-  typedef std::map< int, GeomAPI_ProjectPointOnSurf* > TID2ProjectorOnSurf;
-  TID2ProjectorOnSurf myFace2Projector;
+  std::map< int, double > myFaceMaxTol;
+
+  typedef std::map< int, GeomAPI_ProjectPointOnSurf* >  TID2ProjectorOnSurf;
   typedef std::map< int, GeomAPI_ProjectPointOnCurve* > TID2ProjectorOnCurve;
+  TID2ProjectorOnSurf  myFace2Projector;
   TID2ProjectorOnCurve myEdge2Projector;
 
   TopoDS_Shape    myShape;
@@ -725,8 +742,8 @@ public:
 //=======================================================================
 inline gp_XY
 SMESH_MesherHelper::calcTFI(double x, double y,
-                            const gp_XY a0,const gp_XY a1,const gp_XY a2,const gp_XY a3,
-                            const gp_XY p0,const gp_XY p1,const gp_XY p2,const gp_XY p3)
+                            const gp_XY& a0,const gp_XY& a1,const gp_XY& a2,const gp_XY& a3,
+                            const gp_XY& p0,const gp_XY& p1,const gp_XY& p2,const gp_XY& p3)
 {
   return
     ((1 - y) * p0 + x * p1 + y * p2 + (1 - x) * p3 ) -
@@ -735,8 +752,8 @@ SMESH_MesherHelper::calcTFI(double x, double y,
 //=======================================================================
 inline gp_XYZ
 SMESH_MesherHelper::calcTFI(double x, double y,
-                            const gp_XYZ a0,const gp_XYZ a1,const gp_XYZ a2,const gp_XYZ a3,
-                            const gp_XYZ p0,const gp_XYZ p1,const gp_XYZ p2,const gp_XYZ p3)
+                            const gp_XYZ& a0,const gp_XYZ& a1,const gp_XYZ& a2,const gp_XYZ& a3,
+                            const gp_XYZ& p0,const gp_XYZ& p1,const gp_XYZ& p2,const gp_XYZ& p3)
 {
   return
     ((1 - y) * p0 + x * p1 + y * p2 + (1 - x) * p3 ) -