1 // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESH_MeshEditor.hxx
25 // Created : Mon Apr 12 14:56:19 2004
26 // Author : Edward AGAPOV (eap)
30 #ifndef SMESH_MeshEditor_HeaderFile
31 #define SMESH_MeshEditor_HeaderFile
33 #include "SMESH_Mesh.hxx"
34 #include "SMESH_Controls.hxx"
39 class SMDS_MeshElement;
45 class SMESH_MeshEditor {
48 SMESH_MeshEditor( SMESH_Mesh* theMesh );
50 bool Remove (const std::list< int >& theElemIDs, const bool isNodes);
51 // Remove a node or an element.
52 // Modify a compute state of sub-meshes which become empty
54 bool InverseDiag (const SMDS_MeshElement * theTria1,
55 const SMDS_MeshElement * theTria2 );
56 // Replace two neighbour triangles with ones built on the same 4 nodes
57 // but having other common link.
58 // Return False if args are improper
60 bool InverseDiag (const SMDS_MeshNode * theNode1,
61 const SMDS_MeshNode * theNode2 );
62 // Replace two neighbour triangles sharing theNode1-theNode2 link
63 // with ones built on the same 4 nodes but having other common link.
64 // Return false if proper faces not found
66 bool DeleteDiag (const SMDS_MeshNode * theNode1,
67 const SMDS_MeshNode * theNode2 );
68 // Replace two neighbour triangles sharing theNode1-theNode2 link
69 // with a quadrangle built on the same 4 nodes.
70 // Return false if proper faces not found
72 bool Reorient (const SMDS_MeshElement * theFace);
73 // Reverse the normal of theFace
74 // Return false if theFace is null
77 bool TriToQuad (std::set<const SMDS_MeshElement*> & theElems,
78 SMESH::Controls::NumericalFunctorPtr theCriterion,
79 const double theMaxAngle);
80 // Fuse neighbour triangles into quadrangles.
81 // theCriterion is used to choose a neighbour to fuse with.
82 // theMaxAngle is a max angle between element normals at which
83 // fusion is still performed; theMaxAngle is mesured in radians.
85 bool QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
86 SMESH::Controls::NumericalFunctorPtr theCriterion);
87 // Cut quadrangles into triangles.
88 // theCriterion is used to choose a diagonal to cut
90 bool QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
91 const bool the13Diag);
92 // Cut quadrangles into triangles
95 enum SmoothMethod { LAPLACIAN = 0, CENTROIDAL };
97 void Smooth (std::set<const SMDS_MeshElement*> & theElements,
98 std::set<const SMDS_MeshNode*> & theFixedNodes,
99 const SmoothMethod theSmoothMethod,
100 const int theNbIterations,
101 double theTgtAspectRatio = 1.0);
102 // Smooth theElements using theSmoothMethod during theNbIterations
103 // or until a worst element has aspect ratio <= theTgtAspectRatio.
104 // Aspect Ratio varies in range [1.0, inf].
105 // If theElements is empty, the whole mesh is smoothed.
106 // theFixedNodes contains additionally fixed nodes. Nodes built
107 // on edges and boundary nodes are always fixed.
110 void RotationSweep (std::set<const SMDS_MeshElement*> & theElements,
111 const gp_Ax1& theAxis,
112 const double theAngle,
113 const int theNbSteps,
114 const double theToler);
115 // Generate new elements by rotation of theElements around theAxis
116 // by theAngle by theNbSteps
118 void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
119 const gp_Vec& theStep,
120 const int theNbSteps);
121 // Generate new elements by extrusion of theElements
122 // by theStep by theNbSteps
125 void Transform (std::set<const SMDS_MeshElement*> & theElements,
126 const gp_Trsf& theTrsf,
128 // Move or copy theElements applying theTrsf to their nodes
131 typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
133 void FindCoincidentNodes (const double theTolerance,
134 TListOfListOfNodes & theGroupsOfNodes);
135 // Return list of group of nodes close to each other within theTolerance
137 void MergeNodes (TListOfListOfNodes & theNodeGroups);
138 // In each group, the cdr of nodes are substituted by the first one
141 void MergeEqualElements();
142 // Remove all but one of elements built on the same nodes.
143 // Return nb of successfully merged groups.
145 bool SewFreeBorder (const SMDS_MeshNode* theBorderFirstNode,
146 const SMDS_MeshNode* theBorderSecondNode,
147 const SMDS_MeshNode* theBorderLastNode,
148 const SMDS_MeshNode* theSide2FirstNode,
149 const SMDS_MeshNode* theSide2SecondNode,
150 const SMDS_MeshNode* theSide2ThirdNode = 0,
151 bool theSide2IsFreeBorder = true);
152 // Sew the free border to the side2 by replacing nodes in
153 // elements on the free border with nodes of the elements
154 // of the side 2. If nb of links in the free border and
155 // between theSide2FirstNode and theSide2LastNode are different,
156 // additional nodes are inserted on a link provided that no
157 // volume elements share the splitted link.
158 // The side 2 is a free border if theSide2IsFreeBorder == true.
159 // Sewing is peformed between the given first, second and last
160 // nodes on the sides.
161 // theBorderFirstNode is merged with theSide2FirstNode.
162 // if (!theSide2IsFreeBorder) then theSide2SecondNode gives
163 // the last node on the side 2, which will be merged with
164 // theBorderLastNode.
165 // if (theSide2IsFreeBorder) then theSide2SecondNode will
166 // be merged with theBorderSecondNode.
167 // if (theSide2IsFreeBorder && theSide2ThirdNode == 0) then
168 // the 2 free borders are sewn link by link and no additional
169 // nodes are inserted.
170 // Return false, if sewing failed.
172 bool SewSideElements (std::set<const SMDS_MeshElement*>& theSide1,
173 std::set<const SMDS_MeshElement*>& theSide2,
174 const SMDS_MeshNode* theFirstNode1ToMerge,
175 const SMDS_MeshNode* theFirstNode2ToMerge,
176 const SMDS_MeshNode* theSecondNode1ToMerge,
177 const SMDS_MeshNode* theSecondNode2ToMerge);
178 // Sew two sides of a mesh. Nodes belonging to theSide1 are
179 // merged with nodes of elements of theSide2.
180 // Number of elements in theSide1 and in theSide2 must be
181 // equal and they should have similar node connectivity.
182 // The nodes to merge should belong to side s borders and
183 // the first node should be linked to the second.
185 void InsertNodesIntoLink(const SMDS_MeshElement* theFace,
186 const SMDS_MeshNode* theBetweenNode1,
187 const SMDS_MeshNode* theBetweenNode2,
188 std::list<const SMDS_MeshNode*>& theNodesToInsert);
189 // insert theNodesToInsert into theFace between theBetweenNode1
190 // and theBetweenNode2 and split theElement.
192 static int SortQuadNodes (const SMDS_Mesh * theMesh,
194 // Set 4 nodes of a quadrangle face in a good order.
195 // Swap 1<->2 or 2<->3 nodes and correspondingly return
198 static bool SortHexaNodes (const SMDS_Mesh * theMesh,
200 // Set 8 nodes of a hexahedron in a good order.
201 // Return success status
204 int FindShape (const SMDS_MeshElement * theElem);
205 // Return an index of the shape theElem is on
206 // or zero if a shape not found
209 SMESH_Mesh * GetMesh() { return myMesh; }
211 SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }