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_Iterator.hxx"
37 #include <boost/shared_ptr.hpp>
41 class SMDSControl_BoundaryEdges;
43 typedef SMDS_Iterator<const SMDS_MeshNode *> SMDS_NodeIterator;
44 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshNode *> > SMDS_NodeIteratorPtr;
45 typedef SMDS_Iterator<const SMDS_MeshEdge *> SMDS_EdgeIterator;
46 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshEdge *> > SMDS_EdgeIteratorPtr;
47 typedef SMDS_Iterator<const SMDS_MeshFace *> SMDS_FaceIterator;
48 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshFace *> > SMDS_FaceIteratorPtr;
49 typedef SMDS_Iterator<const SMDS_MeshVolume *> SMDS_VolumeIterator;
50 typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshVolume *> > SMDS_VolumeIteratorPtr;
52 class SMDS_Mesh:public SMDS_MeshObject{
57 SMDS_NodeIteratorPtr nodesIterator() const;
58 SMDS_EdgeIteratorPtr edgesIterator() const;
59 SMDS_FaceIteratorPtr facesIterator() const;
60 SMDS_VolumeIteratorPtr volumesIterator() 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 void RemoveElement(const SMDS_MeshElement * elem,
205 list<const SMDS_MeshElement *>& removedElems,
206 list<const SMDS_MeshElement *>& removedNodes,
207 const bool removenodes = false);
208 virtual void RemoveElement(const SMDS_MeshElement * elem, const bool removenodes = false);
209 virtual void RemoveNode(const SMDS_MeshNode * node);
210 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
211 virtual void RemoveFace(const SMDS_MeshFace * face);
212 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
214 virtual bool RemoveFromParent();
215 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
217 const SMDS_MeshNode *FindNode(int idnode) const;
218 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
219 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
220 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
221 const SMDS_MeshElement *FindElement(int IDelem) const;
226 int NbVolumes() const;
227 int NbSubMesh() const;
228 void DumpNodes() const;
229 void DumpEdges() const;
230 void DumpFaces() const;
231 void DumpVolumes() const;
232 void DebugStats() const;
233 SMDS_Mesh *boundaryFaces();
234 SMDS_Mesh *boundaryEdges();
235 virtual ~SMDS_Mesh();
236 bool hasConstructionEdges();
237 bool hasConstructionFaces();
238 bool hasInverseElements();
239 void setConstructionEdges(bool);
240 void setConstructionFaces(bool);
241 void setInverseElements(bool);
244 * Checks if the element is present in mesh.
245 * Useful to determine dead pointers.
246 * Use this function for debug purpose only! Do not check in the code
247 * using it even in _DEBUG_ mode
249 bool Contains (const SMDS_MeshElement* elem) const;
251 typedef set<SMDS_MeshNode *> SetOfNodes;
252 typedef set<SMDS_MeshEdge *> SetOfEdges;
253 typedef set<SMDS_MeshFace *> SetOfFaces;
254 typedef set<SMDS_MeshVolume *> SetOfVolumes;
257 SMDS_Mesh(SMDS_Mesh * parent);
259 SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
260 const SMDS_MeshNode * node2,
261 const SMDS_MeshNode * node3);
263 SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
264 const SMDS_MeshNode * node2,
265 const SMDS_MeshNode * node3,
266 const SMDS_MeshNode * node4);
268 bool registerElement(int ID, SMDS_MeshElement * element);
270 const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
271 const SMDS_MeshNode * n2) const;
273 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
274 const SMDS_MeshNode * n2);
276 const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
277 const SMDS_MeshNode *n2,
278 const SMDS_MeshNode *n3) const;
280 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
281 const SMDS_MeshNode *n2,
282 const SMDS_MeshNode *n3);
284 const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
285 const SMDS_MeshNode *n2,
286 const SMDS_MeshNode *n3,
287 const SMDS_MeshNode *n4) const;
289 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
290 const SMDS_MeshNode *n2,
291 const SMDS_MeshNode *n3,
292 const SMDS_MeshNode *n4);
294 void addChildrenWithNodes(set<const SMDS_MeshElement*>& setOfChildren,
295 const SMDS_MeshElement * element,
296 set<const SMDS_MeshElement*>& nodes);
303 SetOfVolumes myVolumes;
305 list<SMDS_Mesh *> myChildren;
306 SMDS_MeshElementIDFactory *myNodeIDFactory;
307 SMDS_MeshElementIDFactory *myElementIDFactory;
309 bool myHasConstructionEdges;
310 bool myHasConstructionFaces;
311 bool myHasInverseElements;