X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=0bb91f730c6f4dc91fd5a6d37cab829a070ff4de;hb=65854639b940b82190a50c8ab2568a48436ea318;hp=10b7f9fa991d41545f33e110743bd99b4744520b;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 10b7f9fa9..0bb91f730 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -41,6 +41,7 @@ class SMDS_MeshFace; class SMDS_MeshNode; class gp_Ax1; class gp_Vec; +class gp_Pnt; class SMESH_MeshEditor { public: @@ -69,9 +70,8 @@ class SMESH_MeshEditor { // with a quadrangle built on the same 4 nodes. // Return false if proper faces not found - bool Reorient (const SMDS_MeshElement * theFace); - // Reverse the normal of theFace - // Return false if theFace is null + bool Reorient (const SMDS_MeshElement * theElement); + // Reverse theElement orientation bool TriToQuad (std::set & theElems, @@ -98,13 +98,16 @@ class SMESH_MeshEditor { std::set & theFixedNodes, const SmoothMethod theSmoothMethod, const int theNbIterations, - double theTgtAspectRatio = 1.0); + double theTgtAspectRatio = 1.0, + const bool the2D = true); // Smooth theElements using theSmoothMethod during theNbIterations // or until a worst element has aspect ratio <= theTgtAspectRatio. // Aspect Ratio varies in range [1.0, inf]. // If theElements is empty, the whole mesh is smoothed. // theFixedNodes contains additionally fixed nodes. Nodes built // on edges and boundary nodes are always fixed. + // If the2D, smoothing is performed using UV parameters of nodes + // on geometrical faces void RotationSweep (std::set & theElements, @@ -121,18 +124,44 @@ class SMESH_MeshEditor { // Generate new elements by extrusion of theElements // by theStep by theNbSteps + enum Extrusion_Error { + EXTR_OK, + EXTR_NO_ELEMENTS, + EXTR_PATH_NOT_EDGE, + EXTR_BAD_PATH_SHAPE, + EXTR_BAD_STARTING_NODE, + EXTR_BAD_ANGLES_NUMBER, + EXTR_CANT_GET_TANGENT + }; + + Extrusion_Error ExtrusionAlongTrack (std::set & theElements, + SMESH_subMesh* theTrackPattern, + const SMDS_MeshNode* theNodeStart, + const bool theHasAngles, + std::list& theAngles, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint); + // 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, const gp_Trsf& theTrsf, const bool theCopy); // Move or copy theElements applying theTrsf to their nodes - typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; - void FindCoincidentNodes (const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes); - // Return list of group of nodes close to each other within theTolerance + void FindCoincidentNodes (std::set & 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. + + int SimplifyFace (const vector faceNodes, + vector& poly_nodes, + vector& quantities) const; + // Split face, defined by , into several faces by repeating nodes. + // Is used by MergeNodes() void MergeNodes (TListOfListOfNodes & theNodeGroups); // In each group, the cdr of nodes are substituted by the first one @@ -169,7 +198,9 @@ class SMESH_MeshEditor { const SMDS_MeshNode* theSide2FirstNode, const SMDS_MeshNode* theSide2SecondNode, const SMDS_MeshNode* theSide2ThirdNode = 0, - bool theSide2IsFreeBorder = true); + const bool theSide2IsFreeBorder = true, + const bool toCreatePolygons = false, + const bool toCreatePolyedrs = false); // Sew the free border to the side2 by replacing nodes in // elements on the free border with nodes of the elements // of the side 2. If nb of links in the free border and @@ -206,21 +237,41 @@ class SMESH_MeshEditor { void InsertNodesIntoLink(const SMDS_MeshElement* theFace, const SMDS_MeshNode* theBetweenNode1, const SMDS_MeshNode* theBetweenNode2, - std::list& theNodesToInsert); - // insert theNodesToInsert into theFace between theBetweenNode1 - // and theBetweenNode2 and split theElement. - - 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 - + std::list& theNodesToInsert, + const bool toCreatePoly = false); + // insert theNodesToInsert into theFace between theBetweenNode1 and theBetweenNode2. + // If toCreatePoly is true, replace theFace by polygon, else split theFace. + + void UpdateVolumes (const SMDS_MeshNode* theBetweenNode1, + const SMDS_MeshNode* theBetweenNode2, + std::list& theNodesToInsert); + // insert theNodesToInsert into all volumes, containing link + // theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2. + +// 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 + + static void AddToSameGroups (const SMDS_MeshElement* elemToAdd, + const SMDS_MeshElement* elemInGroups, + SMESHDS_Mesh * aMesh); + // Add elemToAdd to the groups the elemInGroups belongs to + + static const SMDS_MeshElement* + FindFaceInSet(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const std::set& elemSet, + const std::set& avoidSet); + // Return a face having linked nodes n1 and n2 and which is + // - not in avoidSet, + // - in elemSet provided that !elemSet.empty() int FindShape (const SMDS_MeshElement * theElem); // Return an index of the shape theElem is on