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 SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
64 SMDS_Mesh *AddSubMesh();
66 virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
67 virtual SMDS_MeshNode* AddNode(double x, double y, double z);
69 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
70 virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
71 const SMDS_MeshNode * n2,
73 virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
74 const SMDS_MeshNode * n2);
76 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
77 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
78 const SMDS_MeshNode * n2,
79 const SMDS_MeshNode * n3,
81 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
82 const SMDS_MeshNode * n2,
83 const SMDS_MeshNode * n3);
85 virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
86 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
87 const SMDS_MeshNode * n2,
88 const SMDS_MeshNode * n3,
89 const SMDS_MeshNode * n4,
91 virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
92 const SMDS_MeshNode * n2,
93 const SMDS_MeshNode * n3,
94 const SMDS_MeshNode * n4);
96 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
97 const SMDS_MeshEdge * e2,
98 const SMDS_MeshEdge * e3, int ID);
99 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
100 const SMDS_MeshEdge * e2,
101 const SMDS_MeshEdge * e3);
103 virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
104 const SMDS_MeshEdge * e2,
105 const SMDS_MeshEdge * e3,
106 const SMDS_MeshEdge * e4, int ID);
107 virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
108 const SMDS_MeshEdge * e2,
109 const SMDS_MeshEdge * e3,
110 const SMDS_MeshEdge * e4);
112 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
113 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
114 const SMDS_MeshNode * n2,
115 const SMDS_MeshNode * n3,
116 const SMDS_MeshNode * n4,
118 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
119 const SMDS_MeshNode * n2,
120 const SMDS_MeshNode * n3,
121 const SMDS_MeshNode * n4);
123 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
125 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
126 const SMDS_MeshNode * n2,
127 const SMDS_MeshNode * n3,
128 const SMDS_MeshNode * n4,
129 const SMDS_MeshNode * n5,
131 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
132 const SMDS_MeshNode * n2,
133 const SMDS_MeshNode * n3,
134 const SMDS_MeshNode * n4,
135 const SMDS_MeshNode * n5);
137 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
138 int n5, int n6, int ID);
139 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
140 const SMDS_MeshNode * n2,
141 const SMDS_MeshNode * n3,
142 const SMDS_MeshNode * n4,
143 const SMDS_MeshNode * n5,
144 const SMDS_MeshNode * n6,
146 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
147 const SMDS_MeshNode * n2,
148 const SMDS_MeshNode * n3,
149 const SMDS_MeshNode * n4,
150 const SMDS_MeshNode * n5,
151 const SMDS_MeshNode * n6);
153 virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
154 int n5, int n6, int n7, int n8, int ID);
155 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
156 const SMDS_MeshNode * n2,
157 const SMDS_MeshNode * n3,
158 const SMDS_MeshNode * n4,
159 const SMDS_MeshNode * n5,
160 const SMDS_MeshNode * n6,
161 const SMDS_MeshNode * n7,
162 const SMDS_MeshNode * n8,
164 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
165 const SMDS_MeshNode * n2,
166 const SMDS_MeshNode * n3,
167 const SMDS_MeshNode * n4,
168 const SMDS_MeshNode * n5,
169 const SMDS_MeshNode * n6,
170 const SMDS_MeshNode * n7,
171 const SMDS_MeshNode * n8);
173 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
174 const SMDS_MeshFace * f2,
175 const SMDS_MeshFace * f3,
176 const SMDS_MeshFace * f4, int ID);
177 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
178 const SMDS_MeshFace * f2,
179 const SMDS_MeshFace * f3,
180 const SMDS_MeshFace * f4);
182 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
183 const SMDS_MeshFace * f2,
184 const SMDS_MeshFace * f3,
185 const SMDS_MeshFace * f4,
186 const SMDS_MeshFace * f5, int ID);
187 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
188 const SMDS_MeshFace * f2,
189 const SMDS_MeshFace * f3,
190 const SMDS_MeshFace * f4,
191 const SMDS_MeshFace * f5);
193 virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
194 const SMDS_MeshFace * f2,
195 const SMDS_MeshFace * f3,
196 const SMDS_MeshFace * f4,
197 const SMDS_MeshFace * f5,
198 const SMDS_MeshFace * f6, int ID);
199 virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
200 const SMDS_MeshFace * f2,
201 const SMDS_MeshFace * f3,
202 const SMDS_MeshFace * f4,
203 const SMDS_MeshFace * f5,
204 const SMDS_MeshFace * f6);
206 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
209 virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
212 virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
214 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
215 (std::vector<int> nodes_ids,
216 std::vector<int> quantities,
219 virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
220 (std::vector<const SMDS_MeshNode*> nodes,
221 std::vector<int> quantities,
224 virtual SMDS_MeshVolume* AddPolyhedralVolume
225 (std::vector<const SMDS_MeshNode*> nodes,
226 std::vector<int> quantities);
228 virtual void RemoveElement(const SMDS_MeshElement * elem,
229 std::list<const SMDS_MeshElement *>& removedElems,
230 std::list<const SMDS_MeshElement *>& removedNodes,
231 const bool removenodes = false);
232 virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
233 virtual void RemoveNode(const SMDS_MeshNode * node);
234 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
235 virtual void RemoveFace(const SMDS_MeshFace * face);
236 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
238 virtual bool RemoveFromParent();
239 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
241 static bool ChangeElementNodes(const SMDS_MeshElement * elem,
242 const SMDS_MeshNode * nodes[],
244 static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
245 std::vector<const SMDS_MeshNode*> nodes,
246 std::vector<int> quantities);
248 virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
249 // Renumber all nodes or elements.
251 const SMDS_MeshNode *FindNode(int idnode) const;
252 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
253 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
254 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
255 const SMDS_MeshElement *FindElement(int IDelem) const;
256 static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
257 const SMDS_MeshNode * n2);
258 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
259 const SMDS_MeshNode *n2,
260 const SMDS_MeshNode *n3);
261 static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
262 const SMDS_MeshNode *n2,
263 const SMDS_MeshNode *n3,
264 const SMDS_MeshNode *n4);
266 const SMDS_MeshFace *FindFace(std::vector<int> nodes_ids) const;
267 static const SMDS_MeshFace* FindFace(std::vector<const SMDS_MeshNode *> nodes);
269 int MaxNodeID() const;
270 int MinNodeID() const;
271 int MaxElementID() const;
272 int MinElementID() const;
278 int NbVolumes() const;
279 int NbSubMesh() const;
280 void DumpNodes() const;
281 void DumpEdges() const;
282 void DumpFaces() const;
283 void DumpVolumes() const;
284 void DebugStats() const;
285 SMDS_Mesh *boundaryFaces();
286 SMDS_Mesh *boundaryEdges();
287 virtual ~SMDS_Mesh();
288 bool hasConstructionEdges();
289 bool hasConstructionFaces();
290 bool hasInverseElements();
291 void setConstructionEdges(bool);
292 void setConstructionFaces(bool);
293 void setInverseElements(bool);
296 * Checks if the element is present in mesh.
297 * Useful to determine dead pointers.
298 * Use this function for debug purpose only! Do not check in the code
299 * using it even in _DEBUG_ mode
301 bool Contains (const SMDS_MeshElement* elem) const;
303 typedef NCollection_Map<SMDS_MeshNode *> SetOfNodes;
304 typedef NCollection_Map<SMDS_MeshEdge *> SetOfEdges;
305 typedef NCollection_Map<SMDS_MeshFace *> SetOfFaces;
306 typedef NCollection_Map<SMDS_MeshVolume *> SetOfVolumes;
309 SMDS_Mesh(SMDS_Mesh * parent);
311 SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
312 const SMDS_MeshNode * node2,
313 const SMDS_MeshNode * node3);
314 SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
315 const SMDS_MeshNode * node2,
316 const SMDS_MeshNode * node3,
317 const SMDS_MeshNode * node4);
318 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
319 const SMDS_MeshNode * n2);
320 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
321 const SMDS_MeshNode *n2,
322 const SMDS_MeshNode *n3);
323 SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
324 const SMDS_MeshNode *n2,
325 const SMDS_MeshNode *n3,
326 const SMDS_MeshNode *n4);
328 bool registerElement(int ID, SMDS_MeshElement * element);
330 void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
331 const SMDS_MeshElement * element,
332 std::set<const SMDS_MeshElement*>& nodes);
339 SetOfVolumes myVolumes;
341 std::list<SMDS_Mesh *> myChildren;
342 SMDS_MeshElementIDFactory *myNodeIDFactory;
343 SMDS_MeshElementIDFactory *myElementIDFactory;
345 bool myHasConstructionEdges;
346 bool myHasConstructionFaces;
347 bool myHasInverseElements;