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 "SMDS_MeshNode.hxx"
31 #include "SMDS_MeshEdge.hxx"
32 #include "SMDS_MeshFace.hxx"
33 #include "SMDS_MeshVolume.hxx"
34 #include "SMDS_MeshElementIDFactory.hxx"
35 #include "SMDS_ElemIterator.hxx"
36 #include <NCollection_Map.hxx>
38 #include <boost/shared_ptr.hpp>
42 typedef SMDS_Iterator<const SMDS_MeshNode *> SMDS_NodeIterator;
43 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshNode *> > SMDS_NodeIteratorPtr;
44 typedef SMDS_Iterator<const SMDS_MeshEdge *> SMDS_EdgeIterator;
45 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshEdge *> > SMDS_EdgeIteratorPtr;
46 typedef SMDS_Iterator<const SMDS_MeshFace *> SMDS_FaceIterator;
47 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshFace *> > SMDS_FaceIteratorPtr;
48 typedef SMDS_Iterator<const SMDS_MeshVolume *> SMDS_VolumeIterator;
49 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshVolume *> > SMDS_VolumeIteratorPtr;
51 class SMDS_Mesh:public SMDS_MeshObject{
56 SMDS_NodeIteratorPtr nodesIterator() const;
57 SMDS_EdgeIteratorPtr edgesIterator() const;
58 SMDS_FaceIteratorPtr facesIterator() const;
59 SMDS_VolumeIteratorPtr volumesIterator() const;
60 SMDS_ElemIteratorPtr elementsIterator() const;
62 SMDS_Mesh *AddSubMesh();
64 virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
65 virtual SMDS_MeshNode* AddNode(double x, double y, double z);
67 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
68 virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
69 const SMDS_MeshNode * n2,
71 virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
72 const SMDS_MeshNode * n2);
74 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
75 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
76 const SMDS_MeshNode * n2,
77 const SMDS_MeshNode * n3,
79 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
80 const SMDS_MeshNode * n2,
81 const SMDS_MeshNode * n3);
83 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
84 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
85 const SMDS_MeshNode * n2,
86 const SMDS_MeshNode * n3,
87 const SMDS_MeshNode * n4,
89 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
90 const SMDS_MeshNode * n2,
91 const SMDS_MeshNode * n3,
92 const SMDS_MeshNode * n4);
94 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
95 const SMDS_MeshEdge * e2,
96 const SMDS_MeshEdge * e3, int ID);
97 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
98 const SMDS_MeshEdge * e2,
99 const SMDS_MeshEdge * e3);
101 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
102 const SMDS_MeshEdge * e2,
103 const SMDS_MeshEdge * e3,
104 const SMDS_MeshEdge * e4, int ID);
105 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
106 const SMDS_MeshEdge * e2,
107 const SMDS_MeshEdge * e3,
108 const SMDS_MeshEdge * e4);
110 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
111 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
112 const SMDS_MeshNode * n2,
113 const SMDS_MeshNode * n3,
114 const SMDS_MeshNode * n4,
116 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
117 const SMDS_MeshNode * n2,
118 const SMDS_MeshNode * n3,
119 const SMDS_MeshNode * n4);
121 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
123 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
124 const SMDS_MeshNode * n2,
125 const SMDS_MeshNode * n3,
126 const SMDS_MeshNode * n4,
127 const SMDS_MeshNode * n5,
129 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
130 const SMDS_MeshNode * n2,
131 const SMDS_MeshNode * n3,
132 const SMDS_MeshNode * n4,
133 const SMDS_MeshNode * n5);
135 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
136 int n5, int n6, int ID);
137 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
138 const SMDS_MeshNode * n2,
139 const SMDS_MeshNode * n3,
140 const SMDS_MeshNode * n4,
141 const SMDS_MeshNode * n5,
142 const SMDS_MeshNode * n6,
144 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
145 const SMDS_MeshNode * n2,
146 const SMDS_MeshNode * n3,
147 const SMDS_MeshNode * n4,
148 const SMDS_MeshNode * n5,
149 const SMDS_MeshNode * n6);
151 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
152 int n5, int n6, int n7, int n8, int ID);
153 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
154 const SMDS_MeshNode * n2,
155 const SMDS_MeshNode * n3,
156 const SMDS_MeshNode * n4,
157 const SMDS_MeshNode * n5,
158 const SMDS_MeshNode * n6,
159 const SMDS_MeshNode * n7,
160 const SMDS_MeshNode * n8,
162 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
163 const SMDS_MeshNode * n2,
164 const SMDS_MeshNode * n3,
165 const SMDS_MeshNode * n4,
166 const SMDS_MeshNode * n5,
167 const SMDS_MeshNode * n6,
168 const SMDS_MeshNode * n7,
169 const SMDS_MeshNode * n8);
171 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
172 const SMDS_MeshFace * f2,
173 const SMDS_MeshFace * f3,
174 const SMDS_MeshFace * f4, int ID);
175 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
176 const SMDS_MeshFace * f2,
177 const SMDS_MeshFace * f3,
178 const SMDS_MeshFace * f4);
180 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
181 const SMDS_MeshFace * f2,
182 const SMDS_MeshFace * f3,
183 const SMDS_MeshFace * f4,
184 const SMDS_MeshFace * f5, int ID);
185 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
186 const SMDS_MeshFace * f2,
187 const SMDS_MeshFace * f3,
188 const SMDS_MeshFace * f4,
189 const SMDS_MeshFace * f5);
191 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
192 const SMDS_MeshFace * f2,
193 const SMDS_MeshFace * f3,
194 const SMDS_MeshFace * f4,
195 const SMDS_MeshFace * f5,
196 const SMDS_MeshFace * f6, int ID);
197 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
198 const SMDS_MeshFace * f2,
199 const SMDS_MeshFace * f3,
200 const SMDS_MeshFace * f4,
201 const SMDS_MeshFace * f5,
202 const SMDS_MeshFace * f6);
204 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
207 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
210 virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
212 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
213 (std::vector<int> nodes_ids,
214 std::vector<int> quantities,
217 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
218 (std::vector<const SMDS_MeshNode*> nodes,
219 std::vector<int> quantities,
222 virtual SMDS_MeshVolume* AddPolyhedralVolume
223 (std::vector<const SMDS_MeshNode*> nodes,
224 std::vector<int> quantities);
226 virtual void RemoveElement(const SMDS_MeshElement * elem,
227 std::list<const SMDS_MeshElement *>& removedElems,
228 std::list<const SMDS_MeshElement *>& removedNodes,
229 const bool removenodes = false);
230 virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
231 virtual void RemoveNode(const SMDS_MeshNode * node);
232 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
233 virtual void RemoveFace(const SMDS_MeshFace * face);
234 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
236 virtual bool RemoveFromParent();
237 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
239 static bool ChangeElementNodes(const SMDS_MeshElement * elem,
240 const SMDS_MeshNode * nodes[],
242 static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
243 std::vector<const SMDS_MeshNode*> nodes,
244 std::vector<int> quantities);
246 virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
247 // Renumber all nodes or elements.
249 const SMDS_MeshNode *FindNode(int idnode) const;
250 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
251 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
252 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
253 const SMDS_MeshElement *FindElement(int IDelem) const;
254 static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
255 const SMDS_MeshNode * n2);
256 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
257 const SMDS_MeshNode *n2,
258 const SMDS_MeshNode *n3);
259 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
260 const SMDS_MeshNode *n2,
261 const SMDS_MeshNode *n3,
262 const SMDS_MeshNode *n4);
264 const SMDS_MeshFace *FindFace(std::vector<int> nodes_ids) const;
265 static const SMDS_MeshFace* FindFace(std::vector<const SMDS_MeshNode *> nodes);
267 int MaxNodeID() const;
268 int MinNodeID() const;
269 int MaxElementID() const;
270 int MinElementID() const;
276 int NbVolumes() const;
277 int NbSubMesh() const;
278 void DumpNodes() const;
279 void DumpEdges() const;
280 void DumpFaces() const;
281 void DumpVolumes() const;
282 void DebugStats() const;
283 SMDS_Mesh *boundaryFaces();
284 SMDS_Mesh *boundaryEdges();
285 virtual ~SMDS_Mesh();
286 bool hasConstructionEdges();
287 bool hasConstructionFaces();
288 bool hasInverseElements();
289 void setConstructionEdges(bool);
290 void setConstructionFaces(bool);
291 void setInverseElements(bool);
294 * Checks if the element is present in mesh.
295 * Useful to determine dead pointers.
296 * Use this function for debug purpose only! Do not check in the code
297 * using it even in _DEBUG_ mode
299 bool Contains (const SMDS_MeshElement* elem) const;
301 typedef NCollection_Map<SMDS_MeshNode *> SetOfNodes;
302 typedef NCollection_Map<SMDS_MeshEdge *> SetOfEdges;
303 typedef NCollection_Map<SMDS_MeshFace *> SetOfFaces;
304 typedef NCollection_Map<SMDS_MeshVolume *> SetOfVolumes;
307 SMDS_Mesh(SMDS_Mesh * parent);
309 SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
310 const SMDS_MeshNode * node2,
311 const SMDS_MeshNode * node3);
312 SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
313 const SMDS_MeshNode * node2,
314 const SMDS_MeshNode * node3,
315 const SMDS_MeshNode * node4);
316 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
317 const SMDS_MeshNode * n2);
318 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
319 const SMDS_MeshNode *n2,
320 const SMDS_MeshNode *n3);
321 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
322 const SMDS_MeshNode *n2,
323 const SMDS_MeshNode *n3,
324 const SMDS_MeshNode *n4);
326 bool registerElement(int ID, SMDS_MeshElement * element);
328 void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
329 const SMDS_MeshElement * element,
330 std::set<const SMDS_MeshElement*>& nodes);
337 SetOfVolumes myVolumes;
339 std::list<SMDS_Mesh *> myChildren;
340 SMDS_MeshElementIDFactory *myNodeIDFactory;
341 SMDS_MeshElementIDFactory *myElementIDFactory;
343 bool myHasConstructionEdges;
344 bool myHasConstructionFaces;
345 bool myHasInverseElements;