1 // Copyright (C) 2007-2016 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, or (at your option) any later version.
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
29 #include "SMESH_SMDS.hxx"
31 #include "SMDS_MeshElement.hxx"
33 class SMDS_EXPORT SMDS_MeshInfo
37 inline SMDS_MeshInfo();
38 inline SMDS_MeshInfo& operator=(const SMDS_MeshInfo& other);
41 inline int NbElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
42 inline int NbElements(SMDSAbs_EntityType type) const { return NbEntities(type); }
43 inline int NbElements(SMDSAbs_GeometryType type) const { return NbElementsOfGeom(type); }
45 inline int NbEntities(SMDSAbs_EntityType type) const;
46 inline int NbElementsOfGeom(SMDSAbs_GeometryType geom) const;
48 int NbNodes() const { return myNbNodes; }
49 int Nb0DElements() const { return myNb0DElements; }
50 int NbBalls() const { return myNbBalls; }
51 inline int NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const;
53 inline int NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const;
54 inline int NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const;
55 inline int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) const;
56 int NbBiQuadTriangles() const { return myNbBiQuadTriangles; }
57 int NbBiQuadQuadrangles() const { return myNbBiQuadQuadrangles; }
58 inline int NbPolygons(SMDSAbs_ElementOrder order = ORDER_ANY) const;
60 inline int NbVolumes (SMDSAbs_ElementOrder order = ORDER_ANY) const;
61 inline int NbTetras (SMDSAbs_ElementOrder order = ORDER_ANY) const;
62 inline int NbHexas (SMDSAbs_ElementOrder order = ORDER_ANY) const;
63 inline int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) const;
64 inline int NbPrisms (SMDSAbs_ElementOrder order = ORDER_ANY) const;
65 inline int NbHexPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) const;
66 int NbTriQuadHexas() const { return myNbTriQuadHexas; }
67 int NbQuadPrisms() const { return myNbQuadPrisms; }
68 int NbBiQuadPrisms() const { return myNbBiQuadPrisms; }
69 int NbPolyhedrons() const { return myNbPolyhedrons; }
72 inline void addWithPoly(const SMDS_MeshElement* el);
73 inline void setNb(const SMDSAbs_EntityType geomType, const int nb);
76 friend class SMDS_Mesh;
78 // methods to count NOT POLY elements
79 inline void remove(const SMDS_MeshElement* el);
80 inline void add (const SMDS_MeshElement* el);
81 inline int index(SMDSAbs_ElementType type, int nbNodes) const;
82 // methods to remove elements of ANY kind
83 inline void RemoveEdge(const SMDS_MeshElement* el);
84 inline void RemoveFace(const SMDS_MeshElement* el);
85 inline void RemoveVolume(const SMDS_MeshElement* el);
91 int myNbEdges , myNbQuadEdges ;
92 int myNbTriangles , myNbQuadTriangles, myNbBiQuadTriangles ;
93 int myNbQuadrangles, myNbQuadQuadrangles, myNbBiQuadQuadrangles;
94 int myNbPolygons , myNbQuadPolygons;
96 int myNbTetras , myNbQuadTetras ;
97 int myNbHexas , myNbQuadHexas, myNbTriQuadHexas;
98 int myNbPyramids, myNbQuadPyramids;
99 int myNbPrisms , myNbQuadPrisms, myNbBiQuadPrisms;
103 std::vector<int*> myNb; // pointers to myNb... fields
104 std::vector<int> myShift; // shift to get an index in myNb by elem->NbNodes()
107 inline SMDS_MeshInfo::SMDS_MeshInfo():
111 myNbEdges (0), myNbQuadEdges (0),
112 myNbTriangles (0), myNbQuadTriangles (0), myNbBiQuadTriangles(0),
113 myNbQuadrangles(0), myNbQuadQuadrangles(0), myNbBiQuadQuadrangles(0),
114 myNbPolygons (0), myNbQuadPolygons (0),
115 myNbTetras (0), myNbQuadTetras (0),
116 myNbHexas (0), myNbQuadHexas (0), myNbTriQuadHexas(0),
117 myNbPyramids (0), myNbQuadPyramids(0),
118 myNbPrisms (0), myNbQuadPrisms (0), myNbBiQuadPrisms(0),
122 // Number of nodes in standard element types (. - actual nb, * - after the shift)
128 // ====================
129 // 0 ------------------ - DON't USE 0!!!
158 // So to have a unique index for each type basing on nb of nodes, we use a shift:
159 myShift.resize(SMDSAbs_NbElementTypes, 0);
161 myShift[ SMDSAbs_Face ] = +15;// 3->18, 4->19, etc.
162 myShift[ SMDSAbs_Edge ] = +14;// 2->16, 3->17
163 myShift[ SMDSAbs_0DElement ] = +2; // 1->3
164 myShift[ SMDSAbs_Ball ] = +1; // 1->2
166 myNb.resize( index( SMDSAbs_Volume,27 ) + 1, NULL);
168 myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
169 myNb[ index( SMDSAbs_0DElement,1 )] = & myNb0DElements;
170 myNb[ index( SMDSAbs_Ball,1 )] = & myNbBalls;
172 myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
173 myNb[ index( SMDSAbs_Edge,3 )] = & myNbQuadEdges;
175 myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
176 myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
177 myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
178 myNb[ index( SMDSAbs_Face,7 )] = & myNbBiQuadTriangles;
179 myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
180 myNb[ index( SMDSAbs_Face,9 )] = & myNbBiQuadQuadrangles;
182 myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
183 myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
184 myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
185 myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
186 myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
187 myNb[ index( SMDSAbs_Volume, 12)] = & myNbHexPrism;
188 myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
189 myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
190 myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
191 myNb[ index( SMDSAbs_Volume, 27)] = & myNbTriQuadHexas;
194 inline SMDS_MeshInfo& // operator=
195 SMDS_MeshInfo::operator=(const SMDS_MeshInfo& other)
196 { for ( size_t i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=(*other.myNb[i]);
197 myNbPolygons = other.myNbPolygons;
198 myNbQuadPolygons = other.myNbQuadPolygons;
199 myNbPolyhedrons = other.myNbPolyhedrons;
204 SMDS_MeshInfo::Clear()
205 { for ( size_t i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=0;
206 myNbPolygons=myNbQuadPolygons=myNbPolyhedrons=0;
210 SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes) const
211 { return nbNodes + myShift[ type ]; }
213 inline void // remove
214 SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
215 { --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
218 SMDS_MeshInfo::add(const SMDS_MeshElement* el)
219 { ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
221 inline void // addWithPoly
222 SMDS_MeshInfo::addWithPoly(const SMDS_MeshElement* el) {
223 switch ( el->GetEntityType() ) {
224 case SMDSEntity_Polygon: ++myNbPolygons; break;
225 case SMDSEntity_Quad_Polygon: ++myNbQuadPolygons; break;
226 case SMDSEntity_Polyhedra: ++myNbPolyhedrons; break;
230 inline void // RemoveEdge
231 SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
232 { if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
234 inline void // RemoveFace
235 SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el) {
236 switch ( el->GetEntityType() ) {
237 case SMDSEntity_Polygon: --myNbPolygons; break;
238 case SMDSEntity_Quad_Polygon: --myNbQuadPolygons; break;
243 inline void // RemoveVolume
244 SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
245 { if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }
247 inline int // NbEdges
248 SMDS_MeshInfo::NbEdges (SMDSAbs_ElementOrder order) const
249 { return order == ORDER_ANY ? myNbEdges+myNbQuadEdges : order == ORDER_LINEAR ? myNbEdges : myNbQuadEdges; }
251 inline int // NbFaces
252 SMDS_MeshInfo::NbFaces (SMDSAbs_ElementOrder order) const
253 { return NbTriangles(order)+NbQuadrangles(order)+(order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons ); }
255 inline int // NbTriangles
256 SMDS_MeshInfo::NbTriangles (SMDSAbs_ElementOrder order) const
257 { return order == ORDER_ANY ? myNbTriangles+myNbQuadTriangles+myNbBiQuadTriangles : order == ORDER_LINEAR ? myNbTriangles : myNbQuadTriangles+myNbBiQuadTriangles; }
259 inline int // NbQuadrangles
260 SMDS_MeshInfo::NbQuadrangles(SMDSAbs_ElementOrder order) const
261 { return order == ORDER_ANY ? myNbQuadrangles+myNbQuadQuadrangles+myNbBiQuadQuadrangles : order == ORDER_LINEAR ? myNbQuadrangles : myNbQuadQuadrangles+myNbBiQuadQuadrangles; }
263 inline int // NbPolygons
264 SMDS_MeshInfo::NbPolygons(SMDSAbs_ElementOrder order) const
265 { return order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons; }
267 inline int // NbVolumes
268 SMDS_MeshInfo::NbVolumes (SMDSAbs_ElementOrder order) const
269 { return NbTetras(order) + NbHexas(order) + NbPyramids(order) + NbPrisms(order) + NbHexPrisms(order) + (order == ORDER_QUADRATIC ? 0 : myNbPolyhedrons); }
271 inline int // NbTetras
272 SMDS_MeshInfo::NbTetras (SMDSAbs_ElementOrder order) const
273 { return order == ORDER_ANY ? myNbTetras+myNbQuadTetras : order == ORDER_LINEAR ? myNbTetras : myNbQuadTetras; }
275 inline int // NbHexas
276 SMDS_MeshInfo::NbHexas (SMDSAbs_ElementOrder order) const
277 { return order == ORDER_ANY ? myNbHexas+myNbQuadHexas+myNbTriQuadHexas : order == ORDER_LINEAR ? myNbHexas : myNbQuadHexas+myNbTriQuadHexas; }
279 inline int // NbPyramids
280 SMDS_MeshInfo::NbPyramids(SMDSAbs_ElementOrder order) const
281 { return order == ORDER_ANY ? myNbPyramids+myNbQuadPyramids : order == ORDER_LINEAR ? myNbPyramids : myNbQuadPyramids; }
283 inline int // NbPrisms
284 SMDS_MeshInfo::NbPrisms (SMDSAbs_ElementOrder order) const
285 { return order == ORDER_ANY ? myNbPrisms+myNbQuadPrisms : order == ORDER_LINEAR ? myNbPrisms : myNbQuadPrisms; }
287 inline int // NbHexPrisms
288 SMDS_MeshInfo::NbHexPrisms (SMDSAbs_ElementOrder order) const
289 { return order == ORDER_ANY ? myNbHexPrism : order == ORDER_LINEAR ? myNbHexPrism : 0; }
291 inline int // NbElements
292 SMDS_MeshInfo::NbElements(SMDSAbs_ElementType type) const
297 for ( size_t i=1+index( SMDSAbs_Node,1 ); i<myNb.size(); ++i ) if ( myNb[i] ) nb += *myNb[i];
298 nb += myNbPolygons + myNbQuadPolygons + myNbPolyhedrons;
301 nb = ( myNbTetras+ myNbPyramids+ myNbPrisms+ myNbHexas+ myNbHexPrism+
302 myNbQuadTetras+ myNbQuadPyramids+ myNbQuadPrisms+ myNbBiQuadPrisms + myNbQuadHexas+ myNbTriQuadHexas+
306 nb = ( myNbTriangles+ myNbQuadrangles+
307 myNbQuadTriangles+ myNbBiQuadTriangles+
308 myNbQuadQuadrangles+ myNbBiQuadQuadrangles+ myNbPolygons+ myNbQuadPolygons );
311 nb = myNbEdges + myNbQuadEdges;
316 case SMDSAbs_0DElement:
327 inline int // NbEntities
328 SMDS_MeshInfo::NbEntities(SMDSAbs_EntityType type) const
331 case SMDSEntity_Node: return myNbNodes;
332 case SMDSEntity_Edge: return myNbEdges;
333 case SMDSEntity_Quad_Edge: return myNbQuadEdges;
334 case SMDSEntity_Triangle: return myNbTriangles;
335 case SMDSEntity_Quad_Triangle: return myNbQuadTriangles;
336 case SMDSEntity_BiQuad_Triangle: return myNbBiQuadTriangles;
337 case SMDSEntity_Quadrangle: return myNbQuadrangles;
338 case SMDSEntity_Quad_Quadrangle: return myNbQuadQuadrangles;
339 case SMDSEntity_BiQuad_Quadrangle:return myNbBiQuadQuadrangles;
340 case SMDSEntity_Polygon: return myNbPolygons;
341 case SMDSEntity_Tetra: return myNbTetras;
342 case SMDSEntity_Quad_Tetra: return myNbQuadTetras;
343 case SMDSEntity_Pyramid: return myNbPyramids;
344 case SMDSEntity_Quad_Pyramid: return myNbQuadPyramids;
345 case SMDSEntity_Hexa: return myNbHexas;
346 case SMDSEntity_Quad_Hexa: return myNbQuadHexas;
347 case SMDSEntity_TriQuad_Hexa: return myNbTriQuadHexas;
348 case SMDSEntity_Penta: return myNbPrisms;
349 case SMDSEntity_Quad_Penta: return myNbQuadPrisms;
350 case SMDSEntity_BiQuad_Penta: return myNbBiQuadPrisms;
351 case SMDSEntity_Hexagonal_Prism: return myNbHexPrism;
352 case SMDSEntity_Polyhedra: return myNbPolyhedrons;
353 case SMDSEntity_0D: return myNb0DElements;
354 case SMDSEntity_Ball: return myNbBalls;
355 case SMDSEntity_Quad_Polygon: return myNbQuadPolygons;
356 case SMDSEntity_Quad_Polyhedra:
357 case SMDSEntity_Last:
363 inline int // NbElementsOfGeom
364 SMDS_MeshInfo::NbElementsOfGeom(SMDSAbs_GeometryType geom) const
368 case SMDSGeom_POINT: return myNb0DElements;
370 case SMDSGeom_EDGE: return (myNbEdges +
373 case SMDSGeom_TRIANGLE: return (myNbTriangles +
375 myNbBiQuadTriangles );
376 case SMDSGeom_QUADRANGLE: return (myNbQuadrangles +
377 myNbQuadQuadrangles +
378 myNbBiQuadQuadrangles );
379 case SMDSGeom_POLYGON: return (myNbPolygons + myNbQuadPolygons );
381 case SMDSGeom_TETRA: return (myNbTetras +
383 case SMDSGeom_PYRAMID: return (myNbPyramids +
385 case SMDSGeom_HEXA: return (myNbHexas +
388 case SMDSGeom_PENTA: return (myNbPrisms +
390 case SMDSGeom_HEXAGONAL_PRISM: return myNbHexPrism;
391 case SMDSGeom_POLYHEDRA: return myNbPolyhedrons;
393 case SMDSGeom_BALL: return myNbBalls;
402 SMDS_MeshInfo::setNb(const SMDSAbs_EntityType geomType, const int nb)
405 case SMDSEntity_Node: myNbNodes = nb; break;
406 case SMDSEntity_0D: myNb0DElements = nb; break;
407 case SMDSEntity_Ball: myNbBalls = nb; break;
408 case SMDSEntity_BiQuad_Quadrangle:myNbBiQuadQuadrangles = nb; break;
409 case SMDSEntity_BiQuad_Triangle: myNbBiQuadTriangles = nb; break;
410 case SMDSEntity_Edge: myNbEdges = nb; break;
411 case SMDSEntity_Hexa: myNbHexas = nb; break;
412 case SMDSEntity_Hexagonal_Prism: myNbHexPrism = nb; break;
413 case SMDSEntity_Penta: myNbPrisms = nb; break;
414 case SMDSEntity_Polygon: myNbPolygons = nb; break;
415 case SMDSEntity_Polyhedra: myNbPolyhedrons = nb; break;
416 case SMDSEntity_Pyramid: myNbPyramids = nb; break;
417 case SMDSEntity_Quad_Edge: myNbQuadEdges = nb; break;
418 case SMDSEntity_Quad_Hexa: myNbQuadHexas = nb; break;
419 case SMDSEntity_Quad_Penta: myNbQuadPrisms = nb; break;
420 case SMDSEntity_BiQuad_Penta: myNbBiQuadPrisms = nb; break;
421 case SMDSEntity_Quad_Pyramid: myNbQuadPyramids = nb; break;
422 case SMDSEntity_Quad_Quadrangle: myNbQuadQuadrangles = nb; break;
423 case SMDSEntity_Quad_Tetra: myNbQuadTetras = nb; break;
424 case SMDSEntity_Quad_Triangle: myNbQuadTriangles = nb; break;
425 case SMDSEntity_Quadrangle: myNbQuadrangles = nb; break;
426 case SMDSEntity_Tetra: myNbTetras = nb; break;
427 case SMDSEntity_TriQuad_Hexa: myNbTriQuadHexas = nb; break;
428 case SMDSEntity_Triangle: myNbTriangles = nb; break;
429 case SMDSEntity_Quad_Polygon: myNbQuadPolygons = nb; break;
430 case SMDSEntity_Quad_Polyhedra:
431 case SMDSEntity_Last: