1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File : SMDS_MeshInfo.hxx
21 // Created : Mon Sep 24 18:32:41 2007
22 // Author : Edward AGAPOV (eap)
24 #ifndef SMDS_MeshInfo_HeaderFile
25 #define SMDS_MeshInfo_HeaderFile
30 #include "SMESH_SMDS.hxx"
32 #include "SMDS_MeshElement.hxx"
34 class SMDS_EXPORT SMDS_MeshInfo
38 inline SMDS_MeshInfo();
39 inline SMDS_MeshInfo& operator=(const SMDS_MeshInfo& other);
42 inline int NbElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
43 inline int NbEntities(SMDSAbs_EntityType type) const;
45 int NbNodes() const { return myNbNodes; }
46 int Nb0DElements() const { return myNb0DElements; }
47 int NbBalls() const { return myNbBalls; }
48 inline int NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const;
50 inline int NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const;
51 inline int NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const;
52 inline int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) const;
53 int NbBiQuadQuadrangles() const { return myNbBiQuadQuadrangles; }
54 int NbPolygons() const { return myNbPolygons; }
56 inline int NbVolumes (SMDSAbs_ElementOrder order = ORDER_ANY) const;
57 inline int NbTetras (SMDSAbs_ElementOrder order = ORDER_ANY) const;
58 inline int NbHexas (SMDSAbs_ElementOrder order = ORDER_ANY) const;
59 inline int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) const;
60 inline int NbPrisms (SMDSAbs_ElementOrder order = ORDER_ANY) const;
61 inline int NbHexPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) const;
62 int NbTriQuadHexas() const { return myNbTriQuadHexas; }
63 int NbPolyhedrons() const { return myNbPolyhedrons; }
66 inline void addWithPoly(const SMDS_MeshElement* el);
67 inline void setNb(const SMDSAbs_EntityType geomType, const int nb);
70 friend class SMDS_Mesh;
72 // methods to count NOT POLY elements
73 inline void remove(const SMDS_MeshElement* el);
74 inline void add (const SMDS_MeshElement* el);
75 inline int index(SMDSAbs_ElementType type, int nbNodes) const;
76 // methods to remove elements of ANY kind
77 inline void RemoveEdge(const SMDS_MeshElement* el);
78 inline void RemoveFace(const SMDS_MeshElement* el);
79 inline void RemoveVolume(const SMDS_MeshElement* el);
85 int myNbEdges , myNbQuadEdges ;
86 int myNbTriangles , myNbQuadTriangles ;
87 int myNbQuadrangles, myNbQuadQuadrangles, myNbBiQuadQuadrangles;
90 int myNbTetras , myNbQuadTetras ;
91 int myNbHexas , myNbQuadHexas, myNbTriQuadHexas;
92 int myNbPyramids, myNbQuadPyramids;
93 int myNbPrisms , myNbQuadPrisms ;
97 std::vector<int*> myNb; // pointers to myNb... fields
98 std::vector<int> myShift; // shift to get an index in myNb by elem->NbNodes()
101 inline SMDS_MeshInfo::SMDS_MeshInfo():
105 myNbEdges (0), myNbQuadEdges (0),
106 myNbTriangles (0), myNbQuadTriangles (0),
107 myNbQuadrangles(0), myNbQuadQuadrangles(0), myNbBiQuadQuadrangles(0),
109 myNbTetras (0), myNbQuadTetras (0),
110 myNbHexas (0), myNbQuadHexas (0), myNbTriQuadHexas(0),
111 myNbPyramids (0), myNbQuadPyramids(0),
112 myNbPrisms (0), myNbQuadPrisms (0),
116 // Number of nodes in standard element types (. - actual nb, * - after the shift)
122 // ====================
123 // 0 ------------------ - DON't USE 0!!!
152 // So to have a unique index for each type basing on nb of nodes, we use a shift:
153 myShift.resize(SMDSAbs_NbElementTypes, 0);
155 myShift[ SMDSAbs_Face ] = +13;// 3->16, 4->17, 6->19, 8->21, 9->22
156 myShift[ SMDSAbs_Edge ] = +5; // 2->7, 4->9
157 myShift[ SMDSAbs_0DElement ] = +2; // 1->3
158 myShift[ SMDSAbs_Ball ] = +1; // 1->2
160 myNb.resize( index( SMDSAbs_Volume,27 ) + 1, NULL);
162 myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
163 myNb[ index( SMDSAbs_0DElement,1 )] = & myNb0DElements;
164 myNb[ index( SMDSAbs_Ball,1 )] = & myNbBalls;
166 myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
167 myNb[ index( SMDSAbs_Edge,4 )] = & myNbQuadEdges;
169 myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
170 myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
171 myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
172 myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
173 myNb[ index( SMDSAbs_Face,9 )] = & myNbBiQuadQuadrangles;
175 myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
176 myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
177 myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
178 myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
179 myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
180 myNb[ index( SMDSAbs_Volume, 12)] = & myNbHexPrism;
181 myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
182 myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
183 myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
184 myNb[ index( SMDSAbs_Volume, 27)] = & myNbTriQuadHexas;
187 inline SMDS_MeshInfo& // operator=
188 SMDS_MeshInfo::operator=(const SMDS_MeshInfo& other)
189 { for ( int i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=(*other.myNb[i]);
190 myNbPolygons = other.myNbPolygons;
191 myNbPolyhedrons = other.myNbPolyhedrons;
196 SMDS_MeshInfo::Clear()
197 { for ( int i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=0;
198 myNbPolygons=myNbPolyhedrons=0;
202 SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes) const
203 { return nbNodes + myShift[ type ]; }
205 inline void // remove
206 SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
207 { --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
210 SMDS_MeshInfo::add(const SMDS_MeshElement* el)
211 { ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
213 inline void // addWithPoly
214 SMDS_MeshInfo::addWithPoly(const SMDS_MeshElement* el)
217 ++( el->GetType()==SMDSAbs_Face ? myNbPolygons : myNbPolyhedrons );
221 inline void // RemoveEdge
222 SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
223 { if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
225 inline void // RemoveFace
226 SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el)
227 { if ( el->IsPoly() ) --myNbPolygons; else remove( el ); }
229 inline void // RemoveVolume
230 SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
231 { if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }
233 inline int // NbEdges
234 SMDS_MeshInfo::NbEdges (SMDSAbs_ElementOrder order) const
235 { return order == ORDER_ANY ? myNbEdges+myNbQuadEdges : order == ORDER_LINEAR ? myNbEdges : myNbQuadEdges; }
237 inline int // NbFaces
238 SMDS_MeshInfo::NbFaces (SMDSAbs_ElementOrder order) const
239 { return NbTriangles(order)+NbQuadrangles(order)+(order == ORDER_QUADRATIC ? 0 : myNbPolygons); }
241 inline int // NbTriangles
242 SMDS_MeshInfo::NbTriangles (SMDSAbs_ElementOrder order) const
243 { return order == ORDER_ANY ? myNbTriangles+myNbQuadTriangles : order == ORDER_LINEAR ? myNbTriangles : myNbQuadTriangles; }
245 inline int // NbQuadrangles
246 SMDS_MeshInfo::NbQuadrangles(SMDSAbs_ElementOrder order) const
247 { return order == ORDER_ANY ? myNbQuadrangles+myNbQuadQuadrangles+myNbBiQuadQuadrangles : order == ORDER_LINEAR ? myNbQuadrangles : myNbQuadQuadrangles+myNbBiQuadQuadrangles; }
249 inline int // NbVolumes
250 SMDS_MeshInfo::NbVolumes (SMDSAbs_ElementOrder order) const
251 { return NbTetras(order) + NbHexas(order) + NbPyramids(order) + NbPrisms(order) + NbHexPrisms(order) + (order == ORDER_QUADRATIC ? 0 : myNbPolyhedrons); }
253 inline int // NbTetras
254 SMDS_MeshInfo::NbTetras (SMDSAbs_ElementOrder order) const
255 { return order == ORDER_ANY ? myNbTetras+myNbQuadTetras : order == ORDER_LINEAR ? myNbTetras : myNbQuadTetras; }
257 inline int // NbHexas
258 SMDS_MeshInfo::NbHexas (SMDSAbs_ElementOrder order) const
259 { return order == ORDER_ANY ? myNbHexas+myNbQuadHexas+myNbTriQuadHexas : order == ORDER_LINEAR ? myNbHexas : myNbQuadHexas+myNbTriQuadHexas; }
261 inline int // NbPyramids
262 SMDS_MeshInfo::NbPyramids(SMDSAbs_ElementOrder order) const
263 { return order == ORDER_ANY ? myNbPyramids+myNbQuadPyramids : order == ORDER_LINEAR ? myNbPyramids : myNbQuadPyramids; }
265 inline int // NbPrisms
266 SMDS_MeshInfo::NbPrisms (SMDSAbs_ElementOrder order) const
267 { return order == ORDER_ANY ? myNbPrisms+myNbQuadPrisms : order == ORDER_LINEAR ? myNbPrisms : myNbQuadPrisms; }
269 inline int // NbHexPrisms
270 SMDS_MeshInfo::NbHexPrisms (SMDSAbs_ElementOrder order) const
271 { return order == ORDER_ANY ? myNbHexPrism : order == ORDER_LINEAR ? myNbHexPrism : 0; }
273 inline int // NbElements
274 SMDS_MeshInfo::NbElements(SMDSAbs_ElementType type) const
279 for ( int i=1+index( SMDSAbs_Node,1 ); i<myNb.size(); ++i ) if ( myNb[i] ) nb += *myNb[i];
280 nb += myNbPolygons + myNbPolyhedrons;
283 nb = myNbTetras+ myNbPyramids+ myNbPrisms+ myNbHexas+ myNbHexPrism+
284 myNbQuadTetras+ myNbQuadPyramids+ myNbQuadPrisms+ myNbQuadHexas+ myNbTriQuadHexas+
288 nb = myNbTriangles+ myNbQuadrangles+
289 myNbQuadTriangles+ myNbQuadQuadrangles+ myNbBiQuadQuadrangles+ myNbPolygons;
292 nb = myNbEdges + myNbQuadEdges;
297 case SMDSAbs_0DElement:
309 SMDS_MeshInfo::NbEntities(SMDSAbs_EntityType type) const
312 case SMDSEntity_Node: return myNbNodes;
313 case SMDSEntity_Edge: return myNbEdges;
314 case SMDSEntity_Quad_Edge: return myNbQuadEdges;
315 case SMDSEntity_Triangle: return myNbTriangles;
316 case SMDSEntity_Quad_Triangle: return myNbQuadTriangles;
317 case SMDSEntity_Quadrangle: return myNbQuadrangles;
318 case SMDSEntity_Quad_Quadrangle: return myNbQuadQuadrangles;
319 case SMDSEntity_BiQuad_Quadrangle:return myNbBiQuadQuadrangles;
320 case SMDSEntity_Polygon: return myNbPolygons;
321 case SMDSEntity_Tetra: return myNbTetras;
322 case SMDSEntity_Quad_Tetra: return myNbQuadTetras;
323 case SMDSEntity_Pyramid: return myNbPyramids;
324 case SMDSEntity_Quad_Pyramid: return myNbQuadPyramids;
325 case SMDSEntity_Hexa: return myNbHexas;
326 case SMDSEntity_Quad_Hexa: return myNbQuadHexas;
327 case SMDSEntity_TriQuad_Hexa: return myNbTriQuadHexas;
328 case SMDSEntity_Penta: return myNbPrisms;
329 case SMDSEntity_Quad_Penta: return myNbQuadPrisms;
330 case SMDSEntity_Hexagonal_Prism: return myNbHexPrism;
331 case SMDSEntity_Polyhedra: return myNbPolyhedrons;
332 case SMDSEntity_0D: return myNb0DElements;
333 case SMDSEntity_Ball: return myNbBalls;
334 case SMDSEntity_Quad_Polygon:
335 case SMDSEntity_Quad_Polyhedra:
342 SMDS_MeshInfo::setNb(const SMDSAbs_EntityType geomType, const int nb)
345 case SMDSEntity_Node: myNbNodes = nb; break;
346 case SMDSEntity_0D: myNb0DElements = nb; break;
347 case SMDSEntity_Ball: myNbBalls = nb; break;
348 case SMDSEntity_BiQuad_Quadrangle:myNbBiQuadQuadrangles = nb; break;
349 case SMDSEntity_Edge: myNbEdges = nb; break;
350 case SMDSEntity_Hexa: myNbHexas = nb; break;
351 case SMDSEntity_Hexagonal_Prism: myNbHexPrism = nb; break;
352 case SMDSEntity_Penta: myNbPrisms = nb; break;
353 case SMDSEntity_Polygon: myNbPolygons = nb; break;
354 case SMDSEntity_Polyhedra: myNbPolyhedrons = nb; break;
355 case SMDSEntity_Pyramid: myNbPyramids = nb; break;
356 case SMDSEntity_Quad_Edge: myNbQuadEdges = nb; break;
357 case SMDSEntity_Quad_Hexa: myNbQuadHexas = nb; break;
358 case SMDSEntity_Quad_Penta: myNbQuadPrisms = nb; break;
359 case SMDSEntity_Quad_Pyramid: myNbQuadPyramids = nb; break;
360 case SMDSEntity_Quad_Quadrangle: myNbQuadQuadrangles = nb; break;
361 case SMDSEntity_Quad_Tetra: myNbQuadTetras = nb; break;
362 case SMDSEntity_Quad_Triangle: myNbQuadTriangles = nb; break;
363 case SMDSEntity_Quadrangle: myNbQuadrangles = nb; break;
364 case SMDSEntity_Tetra: myNbTetras = nb; break;
365 case SMDSEntity_TriQuad_Hexa: myNbTriQuadHexas = nb; break;
366 case SMDSEntity_Triangle: myNbTriangles = nb; break;
367 case SMDSEntity_Quad_Polygon:
368 case SMDSEntity_Quad_Polyhedra: