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"
40 class SMDSControl_BoundaryEdges;
42 class SMDS_Mesh:public SMDS_MeshObject
49 SMDS_Iterator<const SMDS_MeshNode *> * nodesIterator() const;
50 SMDS_Iterator<const SMDS_MeshEdge *> * edgesIterator() const;
51 SMDS_Iterator<const SMDS_MeshFace *> * facesIterator() const;
52 SMDS_Iterator<const SMDS_MeshVolume *> * volumesIterator() const;
54 SMDS_Mesh *AddSubMesh();
55 virtual SMDS_MeshNode* AddNode(double x, double y, double z);
56 virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
58 virtual SMDS_MeshEdge* AddEdge(
59 const SMDS_MeshNode * n1,
60 const SMDS_MeshNode * n2);
61 virtual SMDS_MeshFace* AddFace(
62 const SMDS_MeshNode * n1,
63 const SMDS_MeshNode * n2,
64 const SMDS_MeshNode * n3);
65 virtual SMDS_MeshFace* AddFace(
66 const SMDS_MeshNode * n1,
67 const SMDS_MeshNode * n2,
68 const SMDS_MeshNode * n3,
69 const SMDS_MeshNode * n4);
70 virtual SMDS_MeshVolume* AddVolume(
71 const SMDS_MeshNode * n1,
72 const SMDS_MeshNode * n2,
73 const SMDS_MeshNode * n3,
74 const SMDS_MeshNode * n4);
75 virtual SMDS_MeshVolume* AddVolume(
76 const SMDS_MeshNode * n1,
77 const SMDS_MeshNode * n2,
78 const SMDS_MeshNode * n3,
79 const SMDS_MeshNode * n4,
80 const SMDS_MeshNode * n5);
81 virtual SMDS_MeshVolume* AddVolume(
82 const SMDS_MeshNode * n1,
83 const SMDS_MeshNode * n2,
84 const SMDS_MeshNode * n3,
85 const SMDS_MeshNode * n4,
86 const SMDS_MeshNode * n5,
87 const SMDS_MeshNode * n6);
88 virtual SMDS_MeshVolume* AddVolume(
89 const SMDS_MeshNode * n1,
90 const SMDS_MeshNode * n2,
91 const SMDS_MeshNode * n3,
92 const SMDS_MeshNode * n4,
93 const SMDS_MeshNode * n5,
94 const SMDS_MeshNode * n6,
95 const SMDS_MeshNode * n7,
96 const SMDS_MeshNode * n8);
98 SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
99 SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
100 SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
102 SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
104 SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
106 SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
107 int n5, int n6, int ID);
108 SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
109 int n5, int n6, int n7, int n8, int ID);
111 SMDS_MeshEdge* AddEdgeWithID(
112 const SMDS_MeshNode * n1,
113 const SMDS_MeshNode * n2, int ID);
114 SMDS_MeshFace* AddFaceWithID(
115 const SMDS_MeshNode * n1,
116 const SMDS_MeshNode * n2,
117 const SMDS_MeshNode * n3, int ID);
118 SMDS_MeshFace* AddFaceWithID(
119 const SMDS_MeshNode * n1,
120 const SMDS_MeshNode * n2,
121 const SMDS_MeshNode * n3,
122 const SMDS_MeshNode * n4, int ID);
123 SMDS_MeshVolume* AddVolumeWithID(
124 const SMDS_MeshNode * n1,
125 const SMDS_MeshNode * n2,
126 const SMDS_MeshNode * n3,
127 const SMDS_MeshNode * n4, int ID);
128 SMDS_MeshVolume* AddVolumeWithID(
129 const SMDS_MeshNode * n1,
130 const SMDS_MeshNode * n2,
131 const SMDS_MeshNode * n3,
132 const SMDS_MeshNode * n4,
133 const SMDS_MeshNode * n5, int ID);
134 SMDS_MeshVolume* AddVolumeWithID(
135 const SMDS_MeshNode * n1,
136 const SMDS_MeshNode * n2,
137 const SMDS_MeshNode * n3,
138 const SMDS_MeshNode * n4,
139 const SMDS_MeshNode * n5,
140 const SMDS_MeshNode * n6, int ID);
141 SMDS_MeshVolume* AddVolumeWithID(
142 const SMDS_MeshNode * n1,
143 const SMDS_MeshNode * n2,
144 const SMDS_MeshNode * n3,
145 const SMDS_MeshNode * n4,
146 const SMDS_MeshNode * n5,
147 const SMDS_MeshNode * n6,
148 const SMDS_MeshNode * n7,
149 const SMDS_MeshNode * n8, int ID);
151 virtual void RemoveElement(const SMDS_MeshElement * elem, const bool removenodes =
153 virtual void RemoveNode(const SMDS_MeshNode * node);
154 virtual void RemoveEdge(const SMDS_MeshEdge * edge);
155 virtual void RemoveFace(const SMDS_MeshFace * face);
156 virtual void RemoveVolume(const SMDS_MeshVolume * volume);
158 virtual bool RemoveFromParent();
159 virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
161 const SMDS_MeshNode *FindNode(int idnode) const;
162 const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
163 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
164 const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
165 const SMDS_MeshElement *FindElement(int IDelem) const;
170 int NbVolumes() const;
171 int NbSubMesh() const;
172 void DumpNodes() const;
173 void DumpEdges() const;
174 void DumpFaces() const;
175 void DumpVolumes() const;
176 void DebugStats() const;
177 SMDS_Mesh *boundaryFaces();
178 SMDS_Mesh *boundaryEdges();
179 virtual ~SMDS_Mesh();
180 bool hasConstructionEdges();
181 bool hasConstructionFaces();
182 bool hasInverseElements();
183 void setConstructionEdges(bool);
184 void setConstructionFaces(bool);
185 void setInverseElements(bool);
188 SMDS_Mesh(SMDS_Mesh * parent);
189 SMDS_MeshFace * createTriangle(SMDS_MeshNode * node1,
190 SMDS_MeshNode * node2, SMDS_MeshNode * node3);
191 SMDS_MeshFace * createQuadrangle(SMDS_MeshNode * node1,
192 SMDS_MeshNode * node2, SMDS_MeshNode * node3, SMDS_MeshNode * node4);
193 const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
194 const SMDS_MeshNode * n2) const;
195 SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
196 const SMDS_MeshNode * n2);
197 SMDS_MeshFace* FindFaceOrCreate(
198 const SMDS_MeshNode *n1,
199 const SMDS_MeshNode *n2,
200 const SMDS_MeshNode *n3);
201 const SMDS_MeshFace* FindFace(
202 const SMDS_MeshNode *n1,
203 const SMDS_MeshNode *n2,
204 const SMDS_MeshNode *n3,
205 const SMDS_MeshNode *n4) const;
206 SMDS_MeshFace* FindFaceOrCreate(
207 const SMDS_MeshNode *n1,
208 const SMDS_MeshNode *n2,
209 const SMDS_MeshNode *n3,
210 const SMDS_MeshNode *n4);
211 void addChildrenWithNodes(set<const SMDS_MeshElement*>& setOfChildren,
212 const SMDS_MeshElement * element, set<const SMDS_MeshElement*>& nodes);
215 typedef set<SMDS_MeshNode *> SetOfNodes;
216 typedef set<SMDS_MeshEdge *> SetOfEdges;
217 typedef set<SMDS_MeshFace *> SetOfFaces;
218 typedef set<SMDS_MeshVolume *> SetOfVolumes;
223 SetOfVolumes myVolumes;
225 list<SMDS_Mesh *> myChildren;
226 SMDS_MeshElementIDFactory *myNodeIDFactory;
227 SMDS_MeshElementIDFactory *myElementIDFactory;
229 bool myHasConstructionEdges;
230 bool myHasConstructionFaces;
231 bool myHasInverseElements;