X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=bf7e8a620668fa84733bcd274761fd265eee9570;hb=bd4cadfcf065d6c5079ca6edd42d3ffd69402a83;hp=d9f4b5d28a737e19894bb570146b6c9f0cb7f594;hpb=9357f5c87098aff2b95b754d69f66c76d2df9c24;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index d9f4b5d28..bf7e8a620 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -34,8 +34,7 @@ #include "SMDS_MeshElement.hxx" #include "SMESH_Controls.hxx" #include "SMESH_Mesh.hxx" -#include "SMESH_SequenceOfElemPtr.hxx" -#include "SMESH_SequenceOfNode.hxx" +#include "SMESH_TypeDefs.hxx" #include @@ -54,16 +53,6 @@ class gp_Pnt; class SMESH_MesherHelper; -typedef std::map > TElemOfElemListMap; -typedef std::map TNodeNodeMap; - -//!< Set of elements sorted by ID, to be used to assure predictability of edition -typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; - -typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; - - //======================================================================= /*! * \brief Searcher for the node closest to point @@ -92,35 +81,13 @@ struct SMESH_ElementSearcher std::vector< const SMDS_MeshElement* >& foundElems)=0; virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0; -}; - -//======================================================================= -/*! - * \brief A sorted pair of nodes - */ -//======================================================================= -struct SMESH_TLink: public NLink -{ - SMESH_TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 ) - { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); } - SMESH_TLink(const NLink& link ):NLink( link ) - { if ( first->GetID() < second->GetID() ) std::swap( first, second ); } - const SMDS_MeshNode* node1() const { return first; } - const SMDS_MeshNode* node2() const { return second; } -}; - -//======================================================================= -/*! - * \brief SMESH_TLink knowing its orientation - */ -//======================================================================= - -struct SMESH_OrientedLink: public SMESH_TLink -{ - bool _reversed; - SMESH_OrientedLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ) - : SMESH_TLink( n1, n2 ), _reversed( n1 != node1() ) {} + /*! + * \brief Return elements possibly intersecting the line + */ + virtual void GetElementsNearLine( const gp_Ax1& line, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; }; // ============================================================ @@ -131,27 +98,6 @@ struct SMESH_OrientedLink: public SMESH_TLink class SMESH_EXPORT SMESH_MeshEditor { -public: - //------------------------------------------ - /*! - * \brief SMDS_MeshNode -> gp_XYZ convertor - */ - //------------------------------------------ - struct TNodeXYZ : public gp_XYZ - { - const SMDS_MeshNode* _node; - TNodeXYZ( const SMDS_MeshElement* e):gp_XYZ(0,0,0),_node(0) { - if (e) { - ASSERT( e->GetType() == SMDSAbs_Node ); - _node = static_cast(e); - SetCoord( _node->X(), _node->Y(), _node->Z() ); - } - } - double Distance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).Modulus(); } - double SquareDistance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).SquareModulus(); } - bool operator==(const TNodeXYZ& other) const { return _node == other._node; } - }; - public: SMESH_MeshEditor( SMESH_Mesh* theMesh ); @@ -162,16 +108,16 @@ public: SMDS_MeshElement* AddElement(const std::vector & nodes, const SMDSAbs_ElementType type, const bool isPoly, - const int ID = 0); + const int ID = -1); /*! * \brief Add element */ SMDS_MeshElement* AddElement(const std::vector & nodeIDs, const SMDSAbs_ElementType type, const bool isPoly, - const int ID = 0); + const int ID = -1); - bool Remove (const std::list< int >& theElemIDs, const bool isNodes); + int Remove (const std::list< int >& theElemIDs, const bool isNodes); // Remove a node or an element. // Modify a compute state of sub-meshes which become empty @@ -237,7 +183,7 @@ public: SMESH::Controls::NumericalFunctorPtr theCriterion); - enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2 };//!& theScaleFact, - const bool theCopy, - const bool theMakeGroups, - SMESH_Mesh* theTargetMesh=0); - typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - void FindCoincidentNodes (std::set & theNodes, - const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes); + void FindCoincidentNodes (TIDSortedNodeSet & theNodes, + const double theTolerance, + TListOfListOfNodes & theGroupsOfNodes); // Return list of group of nodes close to each other within theTolerance. // Search among theNodes or in the whole mesh if theNodes is empty. /*! - * \brief Return SMESH_NodeSearcher + * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it */ SMESH_NodeSearcher* GetNodeSearcher(); /*! - * \brief Return SMESH_ElementSearcher + * \brief Return SMESH_ElementSearcher. The caller is responsible for deleteing it */ SMESH_ElementSearcher* GetElementSearcher(); + SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt ); /*! * \brief Return true if the point is IN or ON of the element */ @@ -532,12 +462,18 @@ public: // theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2. void ConvertToQuadratic(const bool theForce3d); - //converts all mesh to quadratic one, deletes old elements, replacing - //them with quadratic ones with the same id. + // Converts all mesh to quadratic one, deletes old elements, replacing + // them with quadratic ones with the same id. + // If theForce3d = 1; this results in the medium node lying at the + // middle of the line segments connecting start and end node of a mesh + // element + // If theForce3d = 0; this results in the medium node lying at the + // geometrical edge from which the mesh element is built bool ConvertFromQuadratic(); - //converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing - //them with ordinary mesh elements with the same id. + // Converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing + // them with ordinary mesh elements with the same id. + // Returns true in case of success, false otherwise. static void AddToSameGroups (const SMDS_MeshElement* elemToAdd, const SMDS_MeshElement* elemInGroups, @@ -627,14 +563,29 @@ public: const TIDSortedElemSet& theNodesNot, const TopoDS_Shape& theShape ); + bool DoubleNodesOnGroupBoundaries( const std::vector& theElems, + bool createJointElems); + /*! * \brief Generated skin mesh (containing 2D cells) from 3D mesh * The created 2D mesh elements based on nodes of free faces of boundary volumes * \return TRUE if operation has been completed successfully, FALSE otherwise */ bool Make2DMeshFrom3D(); - -private: + + enum Bnd_Dimension { BND_2DFROM3D, BND_1DFROM3D, BND_1DFROM2D }; + + int MakeBoundaryMesh(const TIDSortedElemSet& elements, + Bnd_Dimension dimension, + SMESH_Group* group = 0, + SMESH_Mesh* targetMesh = 0, + bool toCopyElements = false, + bool toCopyExistingBondary = false, + bool toAddExistingBondary = false, + bool aroundElements = false); + + + private: /*! * \brief Convert elements contained in a submesh to quadratic