1 // SMESH SMDS : implementaion of Salome mesh data structure
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 : SMDS_Mesh.hxx
27 #ifndef _SMDS_Mesh_HeaderFile
28 #define _SMDS_Mesh_HeaderFile
30 #include "SMESH_SMDS.hxx"
32 #include "SMDS_MeshNode.hxx"
33 #include "SMDS_MeshEdge.hxx"
34 #include "SMDS_MeshFace.hxx"
35 #include "SMDS_MeshVolume.hxx"
36 #include "SMDS_MeshElementIDFactory.hxx"
37 #include "SMDS_ElemIterator.hxx"
38 #include <NCollection_Map.hxx>
40 #include <boost/shared_ptr.hpp>
44 typedef SMDS_Iterator<const SMDS_MeshNode *> SMDS_NodeIterator;
45 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshNode *> > SMDS_NodeIteratorPtr;
46 typedef SMDS_Iterator<const SMDS_MeshEdge *> SMDS_EdgeIterator;
47 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshEdge *> > SMDS_EdgeIteratorPtr;
48 typedef SMDS_Iterator<const SMDS_MeshFace *> SMDS_FaceIterator;
49 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshFace *> > SMDS_FaceIteratorPtr;
50 typedef SMDS_Iterator<const SMDS_MeshVolume *> SMDS_VolumeIterator;
51 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshVolume *> > SMDS_VolumeIteratorPtr;
53 class SMDS_EXPORT SMDS_Mesh:public SMDS_MeshObject{
58 SMDS_NodeIteratorPtr nodesIterator() const;
59 SMDS_EdgeIteratorPtr edgesIterator() const;
60 SMDS_FaceIteratorPtr facesIterator() const;
61 SMDS_VolumeIteratorPtr volumesIterator() const;
62 SMDS_ElemIteratorPtr elementsIterator() const;
64 SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
66 SMDS_Mesh *AddSubMesh();
68 virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
69 virtual SMDS_MeshNode* AddNode(double x, double y, double z);
71 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
72 virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
73 const SMDS_MeshNode * n2,
75 virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
76 const SMDS_MeshNode * n2);
78 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
79 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
80 const SMDS_MeshNode * n2,
81 const SMDS_MeshNode * n3,
83 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
84 const SMDS_MeshNode * n2,
85 const SMDS_MeshNode * n3);
87 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
88 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
89 const SMDS_MeshNode * n2,
90 const SMDS_MeshNode * n3,
91 const SMDS_MeshNode * n4,
93 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
94 const SMDS_MeshNode * n2,
95 const SMDS_MeshNode * n3,
96 const SMDS_MeshNode * n4);
98 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
99 const SMDS_MeshEdge * e2,
100 const SMDS_MeshEdge * e3, int ID);
101 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
102 const SMDS_MeshEdge * e2,
103 const SMDS_MeshEdge * e3);
105 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
106 const SMDS_MeshEdge * e2,
107 const SMDS_MeshEdge * e3,
108 const SMDS_MeshEdge * e4, int ID);
109 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
110 const SMDS_MeshEdge * e2,
111 const SMDS_MeshEdge * e3,
112 const SMDS_MeshEdge * e4);
114 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
115 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
116 const SMDS_MeshNode * n2,
117 const SMDS_MeshNode * n3,
118 const SMDS_MeshNode * n4,
120 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
121 const SMDS_MeshNode * n2,
122 const SMDS_MeshNode * n3,
123 const SMDS_MeshNode * n4);
125 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
127 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
128 const SMDS_MeshNode * n2,
129 const SMDS_MeshNode * n3,
130 const SMDS_MeshNode * n4,
131 const SMDS_MeshNode * n5,
133 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
134 const SMDS_MeshNode * n2,
135 const SMDS_MeshNode * n3,
136 const SMDS_MeshNode * n4,
137 const SMDS_MeshNode * n5);
139 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
140 int n5, int n6, int ID);
141 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
142 const SMDS_MeshNode * n2,
143 const SMDS_MeshNode * n3,
144 const SMDS_MeshNode * n4,
145 const SMDS_MeshNode * n5,
146 const SMDS_MeshNode * n6,
148 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
149 const SMDS_MeshNode * n2,
150 const SMDS_MeshNode * n3,
151 const SMDS_MeshNode * n4,
152 const SMDS_MeshNode * n5,
153 const SMDS_MeshNode * n6);
155 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
156 int n5, int n6, int n7, int n8, int ID);
157 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
158 const SMDS_MeshNode * n2,
159 const SMDS_MeshNode * n3,
160 const SMDS_MeshNode * n4,
161 const SMDS_MeshNode * n5,
162 const SMDS_MeshNode * n6,
163 const SMDS_MeshNode * n7,
164 const SMDS_MeshNode * n8,
166 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
167 const SMDS_MeshNode * n2,
168 const SMDS_MeshNode * n3,
169 const SMDS_MeshNode * n4,
170 const SMDS_MeshNode * n5,
171 const SMDS_MeshNode * n6,
172 const SMDS_MeshNode * n7,
173 const SMDS_MeshNode * n8);
175 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
176 const SMDS_MeshFace * f2,
177 const SMDS_MeshFace * f3,
178 const SMDS_MeshFace * f4, int ID);
179 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
180 const SMDS_MeshFace * f2,
181 const SMDS_MeshFace * f3,
182 const SMDS_MeshFace * f4);
184 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
185 const SMDS_MeshFace * f2,
186 const SMDS_MeshFace * f3,
187 const SMDS_MeshFace * f4,
188 const SMDS_MeshFace * f5, int ID);
189 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
190 const SMDS_MeshFace * f2,
191 const SMDS_MeshFace * f3,
192 const SMDS_MeshFace * f4,
193 const SMDS_MeshFace * f5);
195 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
196 const SMDS_MeshFace * f2,
197 const SMDS_MeshFace * f3,
198 const SMDS_MeshFace * f4,
199 const SMDS_MeshFace * f5,
200 const SMDS_MeshFace * f6, int ID);
201 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
202 const SMDS_MeshFace * f2,
203 const SMDS_MeshFace * f3,
204 const SMDS_MeshFace * f4,
205 const SMDS_MeshFace * f5,
206 const SMDS_MeshFace * f6);
208 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
211 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
214 virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
216 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
217 (std::vector<int> nodes_ids,
218 std::vector<int> quantities,
221 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
222 (std::vector<const SMDS_MeshNode*> nodes,
223 std::vector<int> quantities,
226 virtual SMDS_MeshVolume* AddPolyhedralVolume
227 (std::vector<const SMDS_MeshNode*> nodes,
228 std::vector<int> quantities);
230 virtual void RemoveElement(const SMDS_MeshElement * elem,
231 std::list<const SMDS_MeshElement *>& removedElems,
232 std::list<const SMDS_MeshElement *>& removedNodes,
233 const bool removenodes = false);
234 virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
235 virtual void RemoveNode(const SMDS_MeshNode * node);
236 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
237 virtual void RemoveFace(const SMDS_MeshFace * face);
238 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
240 virtual bool RemoveFromParent();
241 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
243 static bool ChangeElementNodes(const SMDS_MeshElement * elem,
244 const SMDS_MeshNode * nodes[],
246 static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
247 std::vector<const SMDS_MeshNode*> nodes,
248 std::vector<int> quantities);
250 virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
251 // Renumber all nodes or elements.
253 const SMDS_MeshNode *FindNode(int idnode) const;
254 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
255 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
256 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
257 const SMDS_MeshElement *FindElement(int IDelem) const;
258 static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
259 const SMDS_MeshNode * n2);
260 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
261 const SMDS_MeshNode *n2,
262 const SMDS_MeshNode *n3);
263 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
264 const SMDS_MeshNode *n2,
265 const SMDS_MeshNode *n3,
266 const SMDS_MeshNode *n4);
268 const SMDS_MeshFace *FindFace(std::vector<int> nodes_ids) const;
269 static const SMDS_MeshFace* FindFace(std::vector<const SMDS_MeshNode *> nodes);
271 int MaxNodeID() const;
272 int MinNodeID() const;
273 int MaxElementID() const;
274 int MinElementID() const;
280 int NbVolumes() const;
281 int NbSubMesh() const;
282 void DumpNodes() const;
283 void DumpEdges() const;
284 void DumpFaces() const;
285 void DumpVolumes() const;
286 void DebugStats() const;
287 SMDS_Mesh *boundaryFaces();
288 SMDS_Mesh *boundaryEdges();
289 virtual ~SMDS_Mesh();
290 bool hasConstructionEdges();
291 bool hasConstructionFaces();
292 bool hasInverseElements();
293 void setConstructionEdges(bool);
294 void setConstructionFaces(bool);
295 void setInverseElements(bool);
298 * Checks if the element is present in mesh.
299 * Useful to determine dead pointers.
300 * Use this function for debug purpose only! Do not check in the code
301 * using it even in _DEBUG_ mode
303 bool Contains (const SMDS_MeshElement* elem) const;
305 typedef NCollection_Map<SMDS_MeshNode *> SetOfNodes;
306 typedef NCollection_Map<SMDS_MeshEdge *> SetOfEdges;
307 typedef NCollection_Map<SMDS_MeshFace *> SetOfFaces;
308 typedef NCollection_Map<SMDS_MeshVolume *> SetOfVolumes;
311 SMDS_Mesh(SMDS_Mesh * parent);
313 SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
314 const SMDS_MeshNode * node2,
315 const SMDS_MeshNode * node3);
316 SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
317 const SMDS_MeshNode * node2,
318 const SMDS_MeshNode * node3,
319 const SMDS_MeshNode * node4);
320 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
321 const SMDS_MeshNode * n2);
322 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
323 const SMDS_MeshNode *n2,
324 const SMDS_MeshNode *n3);
325 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
326 const SMDS_MeshNode *n2,
327 const SMDS_MeshNode *n3,
328 const SMDS_MeshNode *n4);
330 bool registerElement(int ID, SMDS_MeshElement * element);
332 void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
333 const SMDS_MeshElement * element,
334 std::set<const SMDS_MeshElement*>& nodes);
341 SetOfVolumes myVolumes;
343 std::list<SMDS_Mesh *> myChildren;
344 SMDS_MeshElementIDFactory *myNodeIDFactory;
345 SMDS_MeshElementIDFactory *myElementIDFactory;
347 bool myHasConstructionEdges;
348 bool myHasConstructionFaces;
349 bool myHasInverseElements;