X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MesherHelper.hxx;h=41544a3f48304abe137fba028bdcb420a3cd7abd;hp=4ae2101ec968743f1cf3f4f73b49d8101192b8ae;hb=79b1ac2b6df9117f16f11d444b1f165d477a1813;hpb=984c4ffdd7df62aeaedc544cd0b8e64ff8f53f1a diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 4ae2101ec..41544a3f4 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -20,12 +20,13 @@ // File: SMESH_MesherHelper.hxx // Created: 15.02.06 14:48:09 // Author: Sergey KUUL -// Copyright: Open CASCADE 2006 #ifndef SMESH_MesherHelper_HeaderFile #define SMESH_MesherHelper_HeaderFile +#include "SMESH_SMESH.hxx" + #include #include #include @@ -48,33 +49,14 @@ typedef map::iterator ItNLinkNode; * is called. */ -class SMESH_MesherHelper -{ - public: - // ---------- PUBLIC METHODS ---------- - - /// Empty constructor - SMESH_MesherHelper(SMESH_Mesh& theMesh) - { myMesh=(void *)&theMesh; myCreateQuadratic = false; myShapeID=-1;} - - SMESH_Mesh* GetMesh() const - { return (SMESH_Mesh*)myMesh; } - - /// Copy constructor - //Standard_EXPORT SMESH_MesherHelper (const SMESH_MesherHelper& theOther); - - /// Destructor - //Standard_EXPORT virtual ~SMESH_MesherHelper (); - - /** - * Check submesh for given shape - * Check if all elements on this shape - * are quadratic, if yes => set true to myCreateQuadratic - * (default value is false). Also fill myNLinkNodeMap - * Returns myCreateQuadratic - */ - bool IsQuadraticSubMesh(const TopoDS_Shape& theShape); +typedef std::vector TNodeColumn; +typedef std::map< double, TNodeColumn > TParam2ColumnMap; +class SMESH_EXPORT SMESH_MesherHelper +{ +public: + // ---------- PUBLIC UTILITIES ---------- + /*! * \brief Returns true if given node is medium * \param n - node to check @@ -84,85 +66,113 @@ class SMESH_MesherHelper static bool IsMedium(const SMDS_MeshNode* node, const SMDSAbs_ElementType typeToCheck = SMDSAbs_All); - /** - * Auxilary function for filling myNLinkNodeMap + /*! + * \brief Load nodes bound to face into a map of node columns + * \param theParam2ColumnMap - map of node columns to fill + * \param theFace - the face on which nodes are searched for + * \param theBaseEdge - the edge nodes of which are columns' bases + * \param theMesh - the mesh containing nodes + * \retval bool - false if something is wrong + * + * The key of the map is a normalized parameter of each + * base node on theBaseEdge. + * This method works in supposition that nodes on the face + * forms a rectangular grid and elements can be quardrangles or triangles */ - void AddNLinkNode(const SMDS_MeshNode* n1, - const SMDS_MeshNode* n2, - const SMDS_MeshNode* n12); - - /** - * Auxilary function for filling myNLinkNodeMap + static bool LoadNodeColumns(TParam2ColumnMap & theParam2ColumnMap, + const TopoDS_Face& theFace, + const TopoDS_Edge& theBaseEdge, + SMESHDS_Mesh* theMesh); + /*! + * \brief Return support shape of a node + * \param node - the node + * \param meshDS - mesh DS + * \retval TopoDS_Shape - found support shape */ - void AddNLinkNodeMap(const NLinkNodeMap& aMap) - { myNLinkNodeMap.insert(aMap.begin(), aMap.end()); } + static const TopoDS_Shape& GetSubShapeByNode(const SMDS_MeshNode* node, + SMESHDS_Mesh* meshDS) + { return meshDS->IndexToShape( node->GetPosition()->GetShapeId() ); } - /** - * Returns myNLinkNodeMap + /*! + * \brief Return a valid node index, fixing the given one if necessary + * \param ind - node index + * \param nbNodes - total nb of nodes + * \retval int - valid node index */ - const NLinkNodeMap& GetNLinkNodeMap() { return myNLinkNodeMap; } + static int WrapIndex(const int ind, const int nbNodes) { + if ( ind < 0 ) return nbNodes + ind % nbNodes; + if ( ind >= nbNodes ) return ind % nbNodes; + return ind; + } +public: + // ---------- PUBLIC INSTANCE METHODS ---------- + + // constructor + SMESH_MesherHelper(SMESH_Mesh& theMesh); + + SMESH_Mesh* GetMesh() const { return myMesh; } + + SMESHDS_Mesh* GetMeshDS() const { return GetMesh()->GetMeshDS(); } + /*! - * \brief Return node UV on face - * \param F - the face - * \param n - the node - * \param inFaceNode - a node of element being created located inside a face - * \retval gp_XY - resulting UV - * - * Auxilary function called form GetMediumNode() + * Check submesh for given shape: if all elements on this shape are quadratic, + * quadratic elements will be created. Also fill myNLinkNodeMap */ - gp_XY GetNodeUV(const TopoDS_Face& F, - const SMDS_MeshNode* n, - const SMDS_MeshNode* inFaceNode=0); - + bool IsQuadraticSubMesh(const TopoDS_Shape& theShape); /*! - * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..) - * \param F - the face - * \retval bool - return true if the face is periodic - * - * if F is Null, answer about subshape set through IsQuadraticSubMesh() or - * SetSubShape() + * \brief Set order of elements to create without calling IsQuadraticSubMesh() */ - bool GetNodeUVneedInFaceNode(const TopoDS_Face& F = TopoDS_Face()) const; - + void SetIsQuadratic(const bool theBuildQuadratic) + { myCreateQuadratic = theBuildQuadratic; } /*! - * \brief Return U on edge - * \param F - the edge - * \param n - the node - * \retval double - resulting U - * - * Auxilary function called from GetMediumNode() + * \brief Return myCreateQuadratic flag */ - double GetNodeU(const TopoDS_Edge& E, - const SMDS_MeshNode* n); - + bool GetIsQuadratic() const { return myCreateQuadratic; } - /** - * Special function for search or creation medium node + /*! + * \brief To set created elements on the shape set by IsQuadraticSubMesh() + * or the next methods. By defaul elements are set on the shape if + * a mesh has no shape to be meshed */ - const SMDS_MeshNode* GetMediumNode(const SMDS_MeshNode* n1, - const SMDS_MeshNode* n2, - const bool force3d); + void SetElementsOnShape(bool toSet) { mySetElemOnShape = toSet; } - /** - * Special function for creation quadratic edge + /*! + * \brief Set shape to make elements on without calling IsQuadraticSubMesh() + */ + void SetSubShape(const int subShapeID);//!==SMESHDS_Mesh::ShapeToIndex(shape) + void SetSubShape(const TopoDS_Shape& subShape); + /*! + * \brief Return ID of the shape set by IsQuadraticSubMesh() or SetSubShape() + * \retval int - shape index in SMESHDS */ - SMDS_QuadraticEdge* AddQuadraticEdge(const SMDS_MeshNode* n1, - const SMDS_MeshNode* n2, - const int id = 0, - const bool force3d = true); + int GetSubShapeID() const { return myShapeID; } + /*! + * \brief Return the shape set by IsQuadraticSubMesh() or SetSubShape() + */ + TopoDS_Shape GetSubShape() const { return myShape; } - /** - * Special function for creation quadratic triangle + /*! + * Creates a node + */ + SMDS_MeshNode* AddNode(double x, double y, double z, int ID = 0); + /*! + * Creates quadratic or linear edge + */ + SMDS_MeshEdge* AddEdge(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const int id = 0, + const bool force3d = true); + /*! + * Creates quadratic or linear triangle */ SMDS_MeshFace* AddFace(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, const SMDS_MeshNode* n3, const int id=0, const bool force3d = false); - - /** - * Special function for creation quadratic quadrangle + /*! + * Creates quadratic or linear quadrangle */ SMDS_MeshFace* AddFace(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, @@ -170,9 +180,8 @@ class SMESH_MesherHelper const SMDS_MeshNode* n4, const int id = 0, const bool force3d = false); - - /** - * Special function for creation quadratic tetraahedron + /*! + * Creates quadratic or linear tetraahedron */ SMDS_MeshVolume* AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, @@ -180,9 +189,18 @@ class SMESH_MesherHelper const SMDS_MeshNode* n4, const int id = 0, const bool force3d = true); - - /** - * Special function for creation quadratic pentahedron + /*! + * Creates quadratic or linear pyramid + */ + SMDS_MeshVolume* AddVolume(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const SMDS_MeshNode* n3, + const SMDS_MeshNode* n4, + const SMDS_MeshNode* n5, + const int id = 0, + const bool force3d = true); + /*! + * Creates quadratic or linear pentahedron */ SMDS_MeshVolume* AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, @@ -192,9 +210,8 @@ class SMESH_MesherHelper const SMDS_MeshNode* n6, const int id = 0, const bool force3d = true); - - /** - * Special function for creation quadratic hexahedron + /*! + * Creates quadratic or linear hexahedron */ SMDS_MeshVolume* AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, @@ -206,33 +223,98 @@ class SMESH_MesherHelper const SMDS_MeshNode* n8, const int id = 0, bool force3d = true); - - /*! - * \brief Set order of elements to create - * \param theBuildQuadratic - to build quadratic or not - * - * To be used for quadratic elements creation without preceding - * IsQuadraticSubMesh() or AddQuadraticEdge() call + * \brief Return U of the given node on the edge */ - void SetKeyIsQuadratic(const bool theBuildQuadratic) - { myCreateQuadratic = theBuildQuadratic; } + double GetNodeU(const TopoDS_Edge& theEdge, + const SMDS_MeshNode* theNode); + /*! + * \brief Return node UV on face + * \param inFaceNode - a node of element being created located inside a face + */ + gp_XY GetNodeUV(const TopoDS_Face& F, + const SMDS_MeshNode* n, + const SMDS_MeshNode* inFaceNode=0) const; + /*! + * \brief Check if inFaceNode argument is necessary for call GetNodeUV(F,..) + * \retval bool - return true if the face is periodic + * + * if F is Null, answer about subshape set through IsQuadraticSubMesh() or + * SetSubShape() + */ + bool GetNodeUVneedInFaceNode(const TopoDS_Face& F = TopoDS_Face()) const; /*! - * \brief Set shape to make elements on - * \param subShape, subShapeID - shape or its ID (==SMESHDS_Mesh::ShapeToIndex(shape)) + * \brief Check if shape is a degenerated edge or it's vertex + * \param subShape - edge or vertex index in SMESHDS + * \retval bool - true if subShape is a degenerated shape + * + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called */ - void SetSubShape(const int subShapeID); - void SetSubShape(const TopoDS_Shape& subShape); + bool IsDegenShape(const int subShape) const + { return myDegenShapeIds.find( subShape ) != myDegenShapeIds.end(); } + /*! + * \brief Check if shape is a seam edge or it's vertex + * \param subShape - edge or vertex index in SMESHDS + * \retval bool - true if subShape is a seam shape + * + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called + */ + bool IsSeamShape(const int subShape) const + { return mySeamShapeIds.find( subShape ) != mySeamShapeIds.end(); } + /*! + * \brief Check if shape is a seam edge or it's vertex + * \param subShape - edge or vertex + * \retval bool - true if subShape is a seam shape + * + * It works only if IsQuadraticSubMesh() or SetSubShape() has been called + */ + bool IsSeamShape(const TopoDS_Shape& subShape) const + { return IsSeamShape( GetMeshDS()->ShapeToIndex( subShape )); } + /*! + * \brief Check if the shape set through IsQuadraticSubMesh() or SetSubShape() + * has a seam edge + * \retval bool - true if it has + */ + bool HasSeam() const { return !mySeamShapeIds.empty(); } + /*! + * \brief Return index of periodic parametric direction of a closed face + * \retval int - 1 for U, 2 for V direction + */ + int GetPeriodicIndex() const { return myParIndex; } + /** + * Special function for search or creation medium node + */ + const SMDS_MeshNode* GetMediumNode(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const bool force3d); /*! - * \brief Return shape or its ID, on which created elements are added - * \retval TopoDS_Shape, int - shape or its ID + * Auxilary function for filling myNLinkNodeMap + */ + void AddNLinkNode(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const SMDS_MeshNode* n12); + /** + * Auxilary function for filling myNLinkNodeMap + */ + void AddNLinkNodeMap(const NLinkNodeMap& aMap) + { myNLinkNodeMap.insert(aMap.begin(), aMap.end()); } + + /** + * Returns myNLinkNodeMap */ - int GetSubShapeID() { return myShapeID; } - TopoDS_Shape GetSubShape() { return myShape; } + const NLinkNodeMap& GetNLinkNodeMap() const { return myNLinkNodeMap; } - protected: + /** + * Check mesh without geometry for: if all elements on this shape are quadratic, + * quadratic elements will be created. + * Used then generated 3D mesh without geometry. + */ + enum MType{ LINEAR, QUADRATIC, COMP }; + MType IsQuadraticMesh(); + +protected: /*! * \brief Select UV on either of 2 pcurves of a seam edge, closest to the given UV @@ -244,20 +326,24 @@ class SMESH_MesherHelper private: - void* myMesh; + // Forbiden copy constructor + SMESH_MesherHelper (const SMESH_MesherHelper& theOther) {}; - int myShapeID; - - // Key for creation quadratic faces - bool myCreateQuadratic; - - // special map for using during creation quadratic faces - NLinkNodeMap myNLinkNodeMap; + // special map for using during creation of quadratic elements + NLinkNodeMap myNLinkNodeMap; + std::set< int > myDegenShapeIds; std::set< int > mySeamShapeIds; double myPar1, myPar2; // bounds of a closed periodic surface int myParIndex; // bounds' index (1-U, 2-V) + TopoDS_Shape myShape; + SMESH_Mesh* myMesh; + int myShapeID; + + // to create quadratic elements + bool myCreateQuadratic; + bool mySetElemOnShape; };