X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=50715cc4f5b57e081a27083a165eb28fb9401fe6;hp=91d7d10411ac35a193e61ac081b50fdd59fc7846;hb=e2e93f9c3107d4feff48df594e68bb8c209b549d;hpb=440a39776f695f06775edb1ff51b893470d6c8b2 diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 91d7d1041..50715cc4f 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -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 @@ -130,6 +135,7 @@ class SMESH_EXPORT SMESH_MesherHelper * \param node - the node * \param meshDS - mesh DS * \retval TopoDS_Shape - found support shape + * \sa SMESH_Algo::VertexNode( const TopoDS_Vertex&, SMESHDS_Mesh* ) */ static TopoDS_Shape GetSubShapeByNode(const SMDS_MeshNode* node, const SMESHDS_Mesh* meshDS); @@ -166,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 @@ -215,10 +221,13 @@ 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, - const TopoDS_Face & F, gp_Vec* faceNormal=0); + const TopoDS_Face & F, const TopoDS_Vertex & V, + gp_Vec* faceNormal=0); static bool IsClosedEdge( const TopoDS_Edge& anEdge ); @@ -585,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. @@ -622,7 +635,8 @@ public: */ std::pair 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 */ @@ -635,9 +649,9 @@ public: void AddTLinkNodeMap(const TLinkNodeMap& aMap) { myTLinkNodeMap.insert(aMap.begin(), aMap.end()); } - void AddTLinks(const SMDS_MeshEdge* edge); - void AddTLinks(const SMDS_MeshFace* face); - void AddTLinks(const SMDS_MeshVolume* vol); + bool AddTLinks(const SMDS_MeshEdge* edge); + bool AddTLinks(const SMDS_MeshFace* face); + bool AddTLinks(const SMDS_MeshVolume* vol); /** * Returns myTLinkNodeMap @@ -662,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 @@ -701,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; @@ -723,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 ) - @@ -733,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 ) -