X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=bf7e8a620668fa84733bcd274761fd265eee9570;hb=bd4cadfcf065d6c5079ca6edd42d3ffd69402a83;hp=a0dec46dc3d39e2c8f08e42a312c008a5dba7a7b;hpb=787fff00679978dcfe51335e456ae5c55fd6558a;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index a0dec46dc..bf7e8a620 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -19,6 +19,7 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_MeshEditor.hxx // Created : Mon Apr 12 14:56:19 2004 @@ -33,8 +34,9 @@ #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 #include #include @@ -51,89 +53,42 @@ 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 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 Searcher for the node closest to point */ -// ============================================================ - +//======================================================================= struct SMESH_NodeSearcher { virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; + virtual void MoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ) = 0; }; - //======================================================================= /*! - * auxiliary class + * \brief Find elements of given type where the given point is IN or ON. + * Returns nb of found elements and elements them-selves. + * Another task is to find out if the given point is out of closed 2D mesh. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements */ //======================================================================= -class SMESH_MeshEditor_PathPoint { -public: - SMESH_MeshEditor_PathPoint() { - myPnt.SetCoord(99., 99., 99.); - myTgt.SetCoord(1.,0.,0.); - myAngle=0.; - myPrm=0.; - } - void SetPnt(const gp_Pnt& aP3D){ - myPnt=aP3D; - } - void SetTangent(const gp_Dir& aTgt){ - myTgt=aTgt; - } - void SetAngle(const double& aBeta){ - myAngle=aBeta; - } - void SetParameter(const double& aPrm){ - myPrm=aPrm; - } - const gp_Pnt& Pnt()const{ - return myPnt; - } - const gp_Dir& Tangent()const{ - return myTgt; - } - double Angle()const{ - return myAngle; - } - double Parameter()const{ - return myPrm; - } - -protected: - gp_Pnt myPnt; - gp_Dir myTgt; - double myAngle; - double myPrm; -}; +struct SMESH_ElementSearcher +{ + virtual int FindElementsByPoint(const gp_Pnt& point, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; + + virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0; + + /*! + * \brief Return elements possibly intersecting the line + */ + virtual void GetElementsNearLine( const gp_Ax1& line, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; +}; // ============================================================ /*! @@ -141,8 +96,8 @@ protected: */ // ============================================================ -class SMESH_EXPORT SMESH_MeshEditor { - +class SMESH_EXPORT SMESH_MeshEditor +{ public: SMESH_MeshEditor( SMESH_Mesh* theMesh ); @@ -153,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 @@ -228,6 +183,13 @@ public: SMESH::Controls::NumericalFunctorPtr theCriterion); + enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2, HEXA_TO_24 = 3 };//! > 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. 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 + */ + static bool isOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ); + + int SimplifyFace (const std::vector faceNodes, std::vector& poly_nodes, std::vector& quantities) const; @@ -391,7 +365,7 @@ public: typedef std::list< std::list< int > > TListOfListOfElementsID; void FindEqualElements(std::set & theElements, - TListOfListOfElementsID & theGroupsOfElementsID); + TListOfListOfElementsID & theGroupsOfElementsID); // Return list of group of elements build on the same nodes. // Search among theElements or in the whole mesh if theElements is empty. @@ -488,24 +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. - - -// static int SortQuadNodes (const SMDS_Mesh * theMesh, -// int theNodeIds[] ); -// // Set 4 nodes of a quadrangle face in a good order. -// // Swap 1<->2 or 2<->3 nodes and correspondingly return -// // 1 or 2 else 0. -// -// static bool SortHexaNodes (const SMDS_Mesh * theMesh, -// int theNodeIds[] ); -// // Set 8 nodes of a hexahedron in a good order. -// // Return success status + // 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, @@ -521,6 +489,11 @@ public: SMESHDS_Mesh * aMesh); // replace elemToRm by elemToAdd in the all groups + static void ReplaceElemInGroups (const SMDS_MeshElement* elemToRm, + const std::vector& elemToAdd, + SMESHDS_Mesh * aMesh); + // replace elemToRm by elemToAdd in the all groups + /*! * \brief Return nodes linked to the given one in elements of the type */ @@ -528,14 +501,16 @@ public: TIDSortedElemSet & linkedNodes, SMDSAbs_ElementType type = SMDSAbs_All ); - static const SMDS_MeshElement* - FindFaceInSet(const SMDS_MeshNode* n1, - const SMDS_MeshNode* n2, - const TIDSortedElemSet& elemSet, - const TIDSortedElemSet& avoidSet); + static const SMDS_MeshElement* FindFaceInSet(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const TIDSortedElemSet& elemSet, + const TIDSortedElemSet& avoidSet, + int* i1=0, + int* i2=0); // Return a face having linked nodes n1 and n2 and which is // - not in avoidSet, // - in elemSet provided that !elemSet.empty() + // i1 and i2 optionally returns indices of n1 and n2 /*! * \brief Find corresponding nodes in two sets of faces @@ -550,11 +525,11 @@ public: */ static Sew_Error FindMatchingNodes(std::set& theSide1, std::set& theSide2, - const SMDS_MeshNode* theFirstNode1, - const SMDS_MeshNode* theFirstNode2, - const SMDS_MeshNode* theSecondNode1, - const SMDS_MeshNode* theSecondNode2, - TNodeNodeMap & nReplaceMap); + const SMDS_MeshNode* theFirstNode1, + const SMDS_MeshNode* theFirstNode2, + const SMDS_MeshNode* theSecondNode1, + const SMDS_MeshNode* theSecondNode2, + TNodeNodeMap & theNodeReplaceMap); /*! * \brief Returns true if given node is medium @@ -576,6 +551,9 @@ public: const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } + + bool DoubleNodes( const std::list< int >& theListOfNodes, + const std::list< int >& theListOfModifiedElems ); bool DoubleNodes( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, @@ -584,8 +562,30 @@ public: bool DoubleNodesInRegion( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, const TopoDS_Shape& theShape ); + + bool DoubleNodesOnGroupBoundaries( const std::vector& theElems, + bool createJointElems); -private: + /*! + * \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(); + + 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 @@ -649,30 +649,42 @@ private: const int nbSteps, SMESH_SequenceOfElemPtr& srcElements); - /*! - * auxilary for ExtrusionAlongTrack - */ - Extrusion_Error MakeEdgePathPoints(std::list& aPrms, - const TopoDS_Edge& aTrackEdge, - bool FirstIsStart, - list& LPP); - Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements, - list& fullList, - const bool theHasAngles, - list& theAngles, - const bool theLinearVariation, - const bool theHasRefPoint, - const gp_Pnt& theRefPoint, - const bool theMakeGroups); - void LinearAngleVariation(const int NbSteps, - list& theAngles); - - bool doubleNodes( SMESHDS_Mesh* theMeshDS, - const TIDSortedElemSet& theElems, - const TIDSortedElemSet& theNodesNot, - std::map< const SMDS_MeshNode*, - const SMDS_MeshNode* >& theNodeNodeMap, - const bool theIsDoubleElem ); + struct SMESH_MeshEditor_PathPoint + { + gp_Pnt myPnt; + gp_Dir myTgt; + double myAngle, myPrm; + + SMESH_MeshEditor_PathPoint(): myPnt(99., 99., 99.), myTgt(1.,0.,0.), myAngle(0), myPrm(0) {} + void SetPnt (const gp_Pnt& aP3D) { myPnt =aP3D; } + void SetTangent (const gp_Dir& aTgt) { myTgt =aTgt; } + void SetAngle (const double& aBeta) { myAngle=aBeta; } + void SetParameter(const double& aPrm) { myPrm =aPrm; } + const gp_Pnt& Pnt ()const { return myPnt; } + const gp_Dir& Tangent ()const { return myTgt; } + double Angle ()const { return myAngle; } + double Parameter ()const { return myPrm; } + }; + Extrusion_Error MakeEdgePathPoints(std::list& aPrms, + const TopoDS_Edge& aTrackEdge, + bool aFirstIsStart, + std::list& aLPP); + Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements, + std::list& theFullList, + const bool theHasAngles, + std::list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); + void LinearAngleVariation(const int NbSteps, + list& theAngles); + + bool doubleNodes( SMESHDS_Mesh* theMeshDS, + const TIDSortedElemSet& theElems, + const TIDSortedElemSet& theNodesNot, + std::map< const SMDS_MeshNode*, const SMDS_MeshNode* >& theNodeNodeMap, + const bool theIsDoubleElem ); private: