X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=3c891d1a3fc3024ccad6f15e7e63dba8ddb07dab;hb=af7f9c70572ad1982fe56ad1fbfda1d50f7bcaf0;hp=ea02a7a7c105e3229b86d7d7e560ae850f3c450a;hpb=868e306e098d4ca6bfd1d183f0a57fb9cb805086;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index ea02a7a7c..3c891d1a3 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -17,7 +17,7 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -32,6 +32,11 @@ #include "SMESH_Mesh.hxx" #include "SMESH_Controls.hxx" +#include "SMESH_SequenceOfNode.hxx" +#include "SMESH_SequenceOfElemPtr.hxx" +#include "gp_Dir.hxx" +#include "TColStd_HSequenceOfReal.hxx" +#include "SMESH_MesherHelper.hxx" #include #include @@ -39,6 +44,9 @@ typedef map > TElemOfElemListMap; +typedef map RemoveQuadNodeMap; +typedef map::iterator ItRemoveQuadNodeMap; + class SMDS_MeshElement; class SMDS_MeshFace; class SMDS_MeshNode; @@ -47,7 +55,17 @@ class gp_Vec; class gp_Pnt; class SMESH_MeshEditor { - public: +public: + + // define a set of elements sorted by ID, to be used to assure + // predictability of edition + struct TIDCompare { + bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) + { return e1->GetID() < e2->GetID(); } + }; + typedef set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; + +public: SMESH_MeshEditor( SMESH_Mesh* theMesh ); @@ -85,7 +103,7 @@ class SMESH_MeshEditor { * is still performed; theMaxAngle is mesured in radians. * \retval bool - Success or not. */ - bool TriToQuad (std::set & theElems, + bool TriToQuad (std::map & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion, const double theMaxAngle); @@ -95,7 +113,7 @@ class SMESH_MeshEditor { * \param theCriterion - Is used to choose a diagonal for splitting. * \retval bool - Success or not. */ - bool QuadToTri (std::set & theElems, + bool QuadToTri (std::map & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion); /*! @@ -104,7 +122,7 @@ class SMESH_MeshEditor { * \param the13Diag - Is used to choose a diagonal for splitting. * \retval bool - Success or not. */ - bool QuadToTri (std::set & theElems, + bool QuadToTri (std::map & theElems, const bool the13Diag); /*! @@ -119,7 +137,7 @@ class SMESH_MeshEditor { enum SmoothMethod { LAPLACIAN = 0, CENTROIDAL }; - void Smooth (std::set & theElements, + void Smooth (std::map & theElements, std::set & theFixedNodes, const SmoothMethod theSmoothMethod, const int theNbIterations, @@ -135,7 +153,7 @@ class SMESH_MeshEditor { // on geometrical faces - void RotationSweep (std::set & theElements, + void RotationSweep (std::map & theElements, const gp_Ax1& theAxis, const double theAngle, const int theNbSteps, @@ -153,6 +171,15 @@ class SMESH_MeshEditor { EXTRUSION_FLAG_SEW = 0x02 }; + /*! + * special structire for control of extrusion functionality + */ + struct ExtrusParam { + gp_Dir myDir; // direction of extrusion + Handle(TColStd_HSequenceOfReal) mySteps; // magnitudes for each step + SMESH_SequenceOfNode myNodes; // nodes for using in sewing + }; + /*! * Create new node in the mesh with given coordinates * (auxilary for advanced extrusion) @@ -160,29 +187,46 @@ class SMESH_MeshEditor { const SMDS_MeshNode* CreateNode(const double x, const double y, const double z, - const double tolnode); + const double tolnode, + SMESH_SequenceOfNode& aNodes); /*! - * Generate new elements by extrusion of theElements - * by theStep by theNbSteps - * param theHistory returns history of extrusion + * Generate new elements by extrusion of theElements + * It is a method used in .idl file. All functionality + * is implemented in the next method (see below) which + * is used in the cuurent method. + * param theElems - list of elements for extrusion + * param newElemsMap returns history of extrusion * param theFlags set flags for performing extrusion (see description * of enum ExtrusionFlags for additional information) * param theTolerance - uses for comparing locations of nodes if flag * EXTRUSION_FLAG_SEW is set */ - //void ExtrusionSweep (std::set & theElements, - // const gp_Vec& theStep, - // const int theNbSteps); void ExtrusionSweep - (set & theElems, + (map & theElems, const gp_Vec& theStep, const int theNbSteps, TElemOfElemListMap& newElemsMap, - //SMESH_DataMapOfElemPtrSequenceOfElemPtr& theHistory, const int theFlags = EXTRUSION_FLAG_BOUNDARY, const double theTolerance = 1.e-6); + /*! + * Generate new elements by extrusion of theElements + * param theElems - list of elements for extrusion + * param newElemsMap returns history of extrusion + * param theFlags set flags for performing extrusion (see description + * of enum ExtrusionFlags for additional information) + * param theTolerance - uses for comparing locations of nodes if flag + * EXTRUSION_FLAG_SEW is set + * param theParams - special structure for manage of extrusion + */ + void ExtrusionSweep (map & theElems, + ExtrusParam& theParams, + TElemOfElemListMap& newElemsMap, + const int theFlags, + const double theTolerance); + + // Generate new elements by extrusion of theElements // by theStep by theNbSteps @@ -196,7 +240,7 @@ class SMESH_MeshEditor { EXTR_CANT_GET_TANGENT }; - Extrusion_Error ExtrusionAlongTrack (std::set & theElements, + Extrusion_Error ExtrusionAlongTrack (std::map & theElements, SMESH_subMesh* theTrackPattern, const SMDS_MeshNode* theNodeStart, const bool theHasAngles, @@ -206,7 +250,7 @@ class SMESH_MeshEditor { // Generate new elements by extrusion of theElements along path given by theTrackPattern, // theHasAngles are the rotation angles, base point can be given by theRefPoint - void Transform (std::set & theElements, + void Transform (std::map & theElements, const gp_Trsf& theTrsf, const bool theCopy); // Move or copy theElements applying theTrsf to their nodes @@ -283,8 +327,8 @@ class SMESH_MeshEditor { // nodes are inserted. // Return false, if sewing failed. - Sew_Error SewSideElements (std::set& theSide1, - std::set& theSide2, + Sew_Error SewSideElements (std::map& theSide1, + std::map& theSide2, const SMDS_MeshNode* theFirstNode1ToMerge, const SMDS_MeshNode* theFirstNode2ToMerge, const SMDS_MeshNode* theSecondNode1ToMerge, @@ -310,6 +354,15 @@ class SMESH_MeshEditor { // insert theNodesToInsert into all volumes, containing link // 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. + + 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. @@ -326,28 +379,68 @@ class SMESH_MeshEditor { SMESHDS_Mesh * aMesh); // Add elemToAdd to the groups the elemInGroups belongs to + static void RemoveElemFromGroups (const SMDS_MeshElement* removeelem, + SMESHDS_Mesh * aMesh); + // remove elemToAdd from the groups + static const SMDS_MeshElement* FindFaceInSet(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, - const std::set& elemSet, - const std::set& avoidSet); + const std::map& elemSet, + const std::map& avoidSet); // Return a face having linked nodes n1 and n2 and which is // - not in avoidSet, // - in elemSet provided that !elemSet.empty() + /*! + * \brief Returns true if given node is medium + * \param n - node to check + * \param typeToCheck - type of elements containing the node to ask about node status + * \retval bool - check result + */ + static bool IsMedium(const SMDS_MeshNode* node, + const SMDSAbs_ElementType typeToCheck = SMDSAbs_All); + int FindShape (const SMDS_MeshElement * theElem); // Return an index of the shape theElem is on // or zero if a shape not found - SMESH_Mesh * GetMesh() { return myMesh; } SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } - private: + SMESH_SequenceOfElemPtr GetLastCreatedNodes() { return myLastCreatedNodes; } + + SMESH_SequenceOfElemPtr GetLastCreatedElems() { return myLastCreatedElems; } + +private: + + void ConvertElemToQuadratic(SMESHDS_SubMesh *theSm, + SMESH_MesherHelper* theHelper, + const bool theForce3d); + //Auxiliary function for "ConvertToQuadratic" is intended to convert + //elements contained in submesh to quadratic + + void RemoveQuadElem( SMESHDS_SubMesh *theSm, + SMDS_ElemIteratorPtr theItr, + RemoveQuadNodeMap& theRemoveNodeMap); + //Auxiliary function for "ConvertFromQuadratic" is intended to convert quadratic + //element to ordinary and for removing quadratic nodes + +private: SMESH_Mesh * myMesh; + /*! + * Sequence for keeping nodes created during last operation + */ + SMESH_SequenceOfElemPtr myLastCreatedNodes; + + /*! + * Sequence for keeping elements created during last operation + */ + SMESH_SequenceOfElemPtr myLastCreatedElems; + }; #endif