X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=d4f54833ae574dacf157d599aa2f7d4ea926213c;hp=834cd8e8725e0e3acbb2470a53771d77e548f5cb;hb=88141f757b048eaa5aae0be49faaf274448bbcaf;hpb=004925bca40d46c25cf9cc837193335163c2d44f diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 834cd8e87..d4f54833a 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -30,8 +30,6 @@ #include "SMESH_SMESH.hxx" #include "SMESH_MeshEditor.hxx" // needed for many meshers -#include -#include #include #include @@ -42,8 +40,11 @@ #include #include -class GeomAPI_ProjectPointOnSurf; class GeomAPI_ProjectPointOnCurve; +class GeomAPI_ProjectPointOnSurf; +class SMDS_MeshNode; +class SMESHDS_Hypothesis; +class SMESH_Gen; class SMESH_ProxyMesh; typedef std::map TLinkNodeMap; @@ -51,7 +52,7 @@ typedef std::map::iterator ItTLinkNode; typedef SMDS_Iterator PShapeIterator; typedef boost::shared_ptr< PShapeIterator > PShapeIteratorPtr; - + typedef std::vector TNodeColumn; typedef std::map< double, TNodeColumn > TParam2ColumnMap; @@ -121,7 +122,9 @@ class SMESH_EXPORT SMESH_MesherHelper /*! * \brief Return true if 2D mesh on FACE is distored */ - static bool IsDistorted2D( SMESH_subMesh* faceSM, bool checkUV=false ); + static bool IsDistorted2D( SMESH_subMesh* faceSM, + bool checkUV = false, + SMESH_MesherHelper* faceHelper = NULL); /*! * \brief Returns true if given node is medium @@ -186,7 +189,7 @@ class SMESH_EXPORT SMESH_MesherHelper * \brief Count nb of sub-shapes * \param shape - the shape * \param type - the type of sub-shapes to count - * \param ignoreSame - if true, use map not to count same shapes, esle use explorer + * \param ignoreSame - if true, use map not to count same shapes, else use explorer * \retval int - the calculated number */ static int Count(const TopoDS_Shape& shape, @@ -200,11 +203,12 @@ class SMESH_EXPORT SMESH_MesherHelper const SMESH_Mesh& mesh, TopAbs_ShapeEnum ancestorType=TopAbs_SHAPE); /*! - * \brief Return iterator on ancestors of the given type + * \brief Return iterator on ancestors of the given type, included into a container shape */ static PShapeIteratorPtr GetAncestors(const TopoDS_Shape& shape, const SMESH_Mesh& mesh, - TopAbs_ShapeEnum ancestorType); + TopAbs_ShapeEnum ancestorType, + const TopoDS_Shape* container = 0); /*! * \brief Find a common ancestor, of the given type, of two shapes */ @@ -248,12 +252,12 @@ public: // constructor SMESH_MesherHelper(SMESH_Mesh& theMesh); - SMESH_Gen* GetGen() const { return GetMesh()->GetGen(); } + SMESH_Gen* GetGen() const; SMESH_Mesh* GetMesh() const { return myMesh; } - SMESHDS_Mesh* GetMeshDS() const { return GetMesh()->GetMeshDS(); } - + SMESHDS_Mesh* GetMeshDS() const; + /*! * Check submesh for given shape: if all elements on this shape are quadratic, * quadratic elements will be created. Also fill myTLinkNodeMap @@ -316,6 +320,17 @@ public: * \brief Return the shape set by IsQuadraticSubMesh() or SetSubShape() */ const TopoDS_Shape& GetSubShape() const { return myShape; } + /*! + * \brief Copy shape information from another helper to improve performance + * since SetSubShape() can be time consuming if there are many edges + */ + void CopySubShapeInfo(const SMESH_MesherHelper& other); + + + /*! + * \brief Convert a shape to its index in the SMESHDS_Mesh + */ + int ShapeToIndex( const TopoDS_Shape& S ) const; /*! * Creates a node (!Note ID before u=0.,v0.) @@ -546,9 +561,15 @@ public: /*! * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() * has a degenerated edges - * \retval bool - true if it has + * \retval bool - true if there are degenerated edges */ bool HasDegeneratedEdges() const { return !myDegenShapeIds.empty(); } + /*! + * \brief Return a number of degenerated edges in the shape set through + * IsQuadraticSubMesh() or SetSubShape() + * \retval size_t - nb edges + */ + size_t NbDegeneratedEdges() const { return myDegenShapeIds.size(); } /*! * \brief Check if shape is a seam edge or it's vertex @@ -569,7 +590,7 @@ public: * Seam shape has two 2D alternative represenations on the face */ bool IsSeamShape(const TopoDS_Shape& subShape) const - { return IsSeamShape( GetMeshDS()->ShapeToIndex( subShape )); } + { return IsSeamShape( ShapeToIndex( subShape )); } /*! * \brief Return true if an edge or a vertex encounters twice in face wire * \param subShape - Id of edge or vertex @@ -581,7 +602,7 @@ public: * \param subShape - edge or vertex */ bool IsRealSeam(const TopoDS_Shape& subShape) const - { return IsRealSeam( GetMeshDS()->ShapeToIndex( subShape)); } + { return IsRealSeam( ShapeToIndex( subShape )); } /*! * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() * has a seam edge, i.e. an edge that has two parametric representations @@ -595,6 +616,12 @@ public: * \retval bool - true if it has */ bool HasRealSeam() const { return HasSeam() && ( *mySeamShapeIds.begin() < 0 ); } + /*! + * \brief Return a number of real seam edges in the shape set through + * IsQuadraticSubMesh() or SetSubShape(). A real seam edge encounters twice in a wire + * \retval size_t - nb of real seams + */ + size_t NbRealSeam() const; /*! * \brief Return index of periodic parametric direction of a closed face * \retval int - 1 for U, 2 for V direction @@ -604,6 +631,10 @@ public: * \brief Return an alternative parameter for a node on seam */ double GetOtherParam(const double param) const; + /*! + * \brief Check if UV is on seam. Return 0 if not, 1 for U seam, 2 for V seam + */ + int IsOnSeam(const gp_XY& uv) const; /*! * \brief Return existing or create new medium nodes between given ones @@ -686,6 +717,7 @@ public: static void WriteShape(const TopoDS_Shape& s); + protected: /*! @@ -702,9 +734,10 @@ public: double getFaceMaxTol( const TopoDS_Shape& face ) const; + private: - // Forbiden copy constructor + // forbidden copy constructor SMESH_MesherHelper (const SMESH_MesherHelper& theOther); // key of a map of bi-quadratic face to it's central node