1 // Copyright (C) 2007-2022 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 #include <smIdType.hxx>
35 class SMDS_EXPORT SMDS_MeshInfo
39 inline SMDS_MeshInfo();
40 inline SMDS_MeshInfo& operator=(const SMDS_MeshInfo& other);
43 inline smIdType NbElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
44 inline smIdType NbElements(SMDSAbs_EntityType type) const { return NbEntities(type); }
45 inline smIdType NbElements(SMDSAbs_GeometryType type) const { return NbElementsOfGeom(type); }
47 inline smIdType NbEntities(SMDSAbs_EntityType type) const;
48 inline smIdType NbElementsOfGeom(SMDSAbs_GeometryType geom) const;
50 smIdType NbNodes() const { return myNbNodes; }
51 smIdType Nb0DElements() const { return myNb0DElements; }
52 smIdType NbBalls() const { return myNbBalls; }
53 inline smIdType NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const;
55 inline smIdType NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const;
56 inline smIdType NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const;
57 inline smIdType NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) const;
58 smIdType NbBiQuadTriangles() const { return myNbBiQuadTriangles; }
59 smIdType NbBiQuadQuadrangles() const { return myNbBiQuadQuadrangles; }
60 inline smIdType NbPolygons(SMDSAbs_ElementOrder order = ORDER_ANY) const;
62 inline smIdType NbVolumes (SMDSAbs_ElementOrder order = ORDER_ANY) const;
63 inline smIdType NbTetras (SMDSAbs_ElementOrder order = ORDER_ANY) const;
64 inline smIdType NbHexas (SMDSAbs_ElementOrder order = ORDER_ANY) const;
65 inline smIdType NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) const;
66 inline smIdType NbPrisms (SMDSAbs_ElementOrder order = ORDER_ANY) const;
67 inline smIdType NbHexPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) const;
68 smIdType NbTriQuadHexas() const { return myNbTriQuadHexas; }
69 smIdType NbQuadPrisms() const { return myNbQuadPrisms; }
70 smIdType NbBiQuadPrisms() const { return myNbBiQuadPrisms; }
71 smIdType NbPolyhedrons() const { return myNbPolyhedrons; }
74 inline void addWithPoly(const SMDS_MeshElement* el);
75 inline void setNb(const SMDSAbs_EntityType geomType, const smIdType nb);
78 friend class SMDS_Mesh;
80 // methods to count NOT POLY elements
81 inline void remove(const SMDS_MeshElement* el);
82 inline void add (const SMDS_MeshElement* el);
83 inline smIdType index(SMDSAbs_ElementType type, int nbNodes) const;
84 // methods to remove elements of ANY kind
85 inline void RemoveEdge(const SMDS_MeshElement* el);
86 inline void RemoveFace(const SMDS_MeshElement* el);
87 inline void RemoveVolume(const SMDS_MeshElement* el);
91 smIdType myNb0DElements;
93 smIdType myNbEdges , myNbQuadEdges ;
94 smIdType myNbTriangles , myNbQuadTriangles, myNbBiQuadTriangles ;
95 smIdType myNbQuadrangles, myNbQuadQuadrangles, myNbBiQuadQuadrangles;
96 smIdType myNbPolygons , myNbQuadPolygons;
98 smIdType myNbTetras , myNbQuadTetras ;
99 smIdType myNbHexas , myNbQuadHexas, myNbTriQuadHexas;
100 smIdType myNbPyramids, myNbQuadPyramids;
101 smIdType myNbPrisms , myNbQuadPrisms, myNbBiQuadPrisms;
102 smIdType myNbHexPrism;
103 smIdType myNbPolyhedrons;
105 std::vector<smIdType*> myNb; // pointers to myNb... fields
106 std::vector<int> myShift; // shift to get an index in myNb by elem->NbNodes()
109 inline SMDS_MeshInfo::SMDS_MeshInfo():
113 myNbEdges (0), myNbQuadEdges (0),
114 myNbTriangles (0), myNbQuadTriangles (0), myNbBiQuadTriangles(0),
115 myNbQuadrangles(0), myNbQuadQuadrangles(0), myNbBiQuadQuadrangles(0),
116 myNbPolygons (0), myNbQuadPolygons (0),
117 myNbTetras (0), myNbQuadTetras (0),
118 myNbHexas (0), myNbQuadHexas (0), myNbTriQuadHexas(0),
119 myNbPyramids (0), myNbQuadPyramids(0),
120 myNbPrisms (0), myNbQuadPrisms (0), myNbBiQuadPrisms(0),
124 // Number of nodes in standard element types (. - actual nb, * - after the shift)
130 // ====================
131 // 0 ------------------ - DON't USE 0!!!
164 // So to have a unique index for each type basing on nb of nodes, we use a shift:
165 myShift.resize(SMDSAbs_NbElementTypes, 0);
167 myShift[ SMDSAbs_Face ] = +22;// 3->25, 4->26, etc.
168 myShift[ SMDSAbs_Edge ] = +14;// 2->16, 3->17
169 myShift[ SMDSAbs_0DElement ] = +2; // 1->3
170 myShift[ SMDSAbs_Ball ] = +1; // 1->2
172 myNb.resize( index( SMDSAbs_Face,9 ) + 1, NULL);
174 myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
175 myNb[ index( SMDSAbs_0DElement,1 )] = & myNb0DElements;
176 myNb[ index( SMDSAbs_Ball,1 )] = & myNbBalls;
178 myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
179 myNb[ index( SMDSAbs_Edge,3 )] = & myNbQuadEdges;
181 myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
182 myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
183 myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
184 myNb[ index( SMDSAbs_Face,7 )] = & myNbBiQuadTriangles;
185 myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
186 myNb[ index( SMDSAbs_Face,9 )] = & myNbBiQuadQuadrangles;
188 myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
189 myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
190 myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
191 myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
192 myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
193 myNb[ index( SMDSAbs_Volume, 12)] = & myNbHexPrism;
194 myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
195 myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
196 myNb[ index( SMDSAbs_Volume, 18)] = & myNbBiQuadPrisms;
197 myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
198 myNb[ index( SMDSAbs_Volume, 27)] = & myNbTriQuadHexas;
201 inline SMDS_MeshInfo& // operator=
202 SMDS_MeshInfo::operator=(const SMDS_MeshInfo& other)
203 { for ( size_t i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=(*other.myNb[i]);
204 myNbPolygons = other.myNbPolygons;
205 myNbQuadPolygons = other.myNbQuadPolygons;
206 myNbPolyhedrons = other.myNbPolyhedrons;
211 SMDS_MeshInfo::Clear()
212 { for ( size_t i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=0;
213 myNbPolygons=myNbQuadPolygons=myNbPolyhedrons=0;
216 inline smIdType // index
217 SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes) const
218 { return nbNodes + myShift[ type ]; }
220 inline void // remove
221 SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
222 { --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
225 SMDS_MeshInfo::add(const SMDS_MeshElement* el)
226 { ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
228 inline void // addWithPoly
229 SMDS_MeshInfo::addWithPoly(const SMDS_MeshElement* el) {
230 switch ( el->GetEntityType() ) {
231 case SMDSEntity_Polygon: ++myNbPolygons; break;
232 case SMDSEntity_Quad_Polygon: ++myNbQuadPolygons; break;
233 case SMDSEntity_Polyhedra: ++myNbPolyhedrons; break;
237 inline void // RemoveEdge
238 SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
239 { if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
241 inline void // RemoveFace
242 SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el) {
243 switch ( el->GetEntityType() ) {
244 case SMDSEntity_Polygon: --myNbPolygons; break;
245 case SMDSEntity_Quad_Polygon: --myNbQuadPolygons; break;
250 inline void // RemoveVolume
251 SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
252 { if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }
254 inline smIdType // NbEdges
255 SMDS_MeshInfo::NbEdges (SMDSAbs_ElementOrder order) const
256 { return order == ORDER_ANY ? myNbEdges+myNbQuadEdges : order == ORDER_LINEAR ? myNbEdges : myNbQuadEdges; }
258 inline smIdType // NbFaces
259 SMDS_MeshInfo::NbFaces (SMDSAbs_ElementOrder order) const
260 { return NbTriangles(order)+NbQuadrangles(order)+(order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons ); }
262 inline smIdType // NbTriangles
263 SMDS_MeshInfo::NbTriangles (SMDSAbs_ElementOrder order) const
264 { return order == ORDER_ANY ? myNbTriangles+myNbQuadTriangles+myNbBiQuadTriangles : order == ORDER_LINEAR ? myNbTriangles : myNbQuadTriangles+myNbBiQuadTriangles; }
266 inline smIdType // NbQuadrangles
267 SMDS_MeshInfo::NbQuadrangles(SMDSAbs_ElementOrder order) const
268 { return order == ORDER_ANY ? myNbQuadrangles+myNbQuadQuadrangles+myNbBiQuadQuadrangles : order == ORDER_LINEAR ? myNbQuadrangles : myNbQuadQuadrangles+myNbBiQuadQuadrangles; }
270 inline smIdType // NbPolygons
271 SMDS_MeshInfo::NbPolygons(SMDSAbs_ElementOrder order) const
272 { return order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons; }
274 inline smIdType // NbVolumes
275 SMDS_MeshInfo::NbVolumes (SMDSAbs_ElementOrder order) const
276 { return NbTetras(order) + NbHexas(order) + NbPyramids(order) + NbPrisms(order) + NbHexPrisms(order) + (order == ORDER_QUADRATIC ? 0 : myNbPolyhedrons); }
278 inline smIdType // NbTetras
279 SMDS_MeshInfo::NbTetras (SMDSAbs_ElementOrder order) const
280 { return order == ORDER_ANY ? myNbTetras+myNbQuadTetras : order == ORDER_LINEAR ? myNbTetras : myNbQuadTetras; }
282 inline smIdType // NbHexas
283 SMDS_MeshInfo::NbHexas (SMDSAbs_ElementOrder order) const
284 { return order == ORDER_ANY ? myNbHexas+myNbQuadHexas+myNbTriQuadHexas : order == ORDER_LINEAR ? myNbHexas : myNbQuadHexas+myNbTriQuadHexas; }
286 inline smIdType // NbPyramids
287 SMDS_MeshInfo::NbPyramids(SMDSAbs_ElementOrder order) const
288 { return order == ORDER_ANY ? myNbPyramids+myNbQuadPyramids : order == ORDER_LINEAR ? myNbPyramids : myNbQuadPyramids; }
290 inline smIdType // NbPrisms
291 SMDS_MeshInfo::NbPrisms (SMDSAbs_ElementOrder order) const
292 { return order == ORDER_ANY ? myNbPrisms+myNbQuadPrisms+myNbBiQuadPrisms: order == ORDER_LINEAR ? myNbPrisms : myNbQuadPrisms+myNbBiQuadPrisms; }
294 inline smIdType // NbHexPrisms
295 SMDS_MeshInfo::NbHexPrisms (SMDSAbs_ElementOrder order) const
296 { return order == ORDER_ANY ? myNbHexPrism : order == ORDER_LINEAR ? myNbHexPrism : 0; }
298 inline smIdType // NbElements
299 SMDS_MeshInfo::NbElements(SMDSAbs_ElementType type) const
304 for ( size_t i=1+index( SMDSAbs_Node,1 ); i<myNb.size(); ++i ) if ( myNb[i] ) nb += *myNb[i];
305 nb += myNbPolygons + myNbQuadPolygons + myNbPolyhedrons;
308 nb = ( myNbTetras+ myNbPyramids+ myNbPrisms+ myNbHexas+ myNbHexPrism+
309 myNbQuadTetras+ myNbQuadPyramids+ myNbQuadPrisms+ myNbBiQuadPrisms + myNbQuadHexas+ myNbTriQuadHexas+
313 nb = ( myNbTriangles+ myNbQuadrangles+
314 myNbQuadTriangles+ myNbBiQuadTriangles+
315 myNbQuadQuadrangles+ myNbBiQuadQuadrangles+ myNbPolygons+ myNbQuadPolygons );
318 nb = myNbEdges + myNbQuadEdges;
323 case SMDSAbs_0DElement:
334 inline smIdType // NbEntities
335 SMDS_MeshInfo::NbEntities(SMDSAbs_EntityType type) const
338 case SMDSEntity_Node: return myNbNodes;
339 case SMDSEntity_Edge: return myNbEdges;
340 case SMDSEntity_Quad_Edge: return myNbQuadEdges;
341 case SMDSEntity_Triangle: return myNbTriangles;
342 case SMDSEntity_Quad_Triangle: return myNbQuadTriangles;
343 case SMDSEntity_BiQuad_Triangle: return myNbBiQuadTriangles;
344 case SMDSEntity_Quadrangle: return myNbQuadrangles;
345 case SMDSEntity_Quad_Quadrangle: return myNbQuadQuadrangles;
346 case SMDSEntity_BiQuad_Quadrangle:return myNbBiQuadQuadrangles;
347 case SMDSEntity_Polygon: return myNbPolygons;
348 case SMDSEntity_Tetra: return myNbTetras;
349 case SMDSEntity_Quad_Tetra: return myNbQuadTetras;
350 case SMDSEntity_Pyramid: return myNbPyramids;
351 case SMDSEntity_Quad_Pyramid: return myNbQuadPyramids;
352 case SMDSEntity_Hexa: return myNbHexas;
353 case SMDSEntity_Quad_Hexa: return myNbQuadHexas;
354 case SMDSEntity_TriQuad_Hexa: return myNbTriQuadHexas;
355 case SMDSEntity_Penta: return myNbPrisms;
356 case SMDSEntity_Quad_Penta: return myNbQuadPrisms;
357 case SMDSEntity_BiQuad_Penta: return myNbBiQuadPrisms;
358 case SMDSEntity_Hexagonal_Prism: return myNbHexPrism;
359 case SMDSEntity_Polyhedra: return myNbPolyhedrons;
360 case SMDSEntity_0D: return myNb0DElements;
361 case SMDSEntity_Ball: return myNbBalls;
362 case SMDSEntity_Quad_Polygon: return myNbQuadPolygons;
363 case SMDSEntity_Quad_Polyhedra:
364 case SMDSEntity_Last:
370 inline smIdType // NbElementsOfGeom
371 SMDS_MeshInfo::NbElementsOfGeom(SMDSAbs_GeometryType geom) const
375 case SMDSGeom_POINT: return myNb0DElements;
377 case SMDSGeom_EDGE: return (myNbEdges +
380 case SMDSGeom_TRIANGLE: return (myNbTriangles +
382 myNbBiQuadTriangles );
383 case SMDSGeom_QUADRANGLE: return (myNbQuadrangles +
384 myNbQuadQuadrangles +
385 myNbBiQuadQuadrangles );
386 case SMDSGeom_POLYGON: return (myNbPolygons + myNbQuadPolygons );
388 case SMDSGeom_TETRA: return (myNbTetras +
390 case SMDSGeom_PYRAMID: return (myNbPyramids +
392 case SMDSGeom_HEXA: return (myNbHexas +
395 case SMDSGeom_PENTA: return (myNbPrisms +
398 case SMDSGeom_HEXAGONAL_PRISM: return myNbHexPrism;
399 case SMDSGeom_POLYHEDRA: return myNbPolyhedrons;
401 case SMDSGeom_BALL: return myNbBalls;
410 SMDS_MeshInfo::setNb(const SMDSAbs_EntityType geomType, const smIdType nb)
413 case SMDSEntity_Node: myNbNodes = nb; break;
414 case SMDSEntity_0D: myNb0DElements = nb; break;
415 case SMDSEntity_Ball: myNbBalls = nb; break;
416 case SMDSEntity_BiQuad_Quadrangle:myNbBiQuadQuadrangles = nb; break;
417 case SMDSEntity_BiQuad_Triangle: myNbBiQuadTriangles = nb; break;
418 case SMDSEntity_Edge: myNbEdges = nb; break;
419 case SMDSEntity_Hexa: myNbHexas = nb; break;
420 case SMDSEntity_Hexagonal_Prism: myNbHexPrism = nb; break;
421 case SMDSEntity_Penta: myNbPrisms = nb; break;
422 case SMDSEntity_Polygon: myNbPolygons = nb; break;
423 case SMDSEntity_Polyhedra: myNbPolyhedrons = nb; break;
424 case SMDSEntity_Pyramid: myNbPyramids = nb; break;
425 case SMDSEntity_Quad_Edge: myNbQuadEdges = nb; break;
426 case SMDSEntity_Quad_Hexa: myNbQuadHexas = nb; break;
427 case SMDSEntity_Quad_Penta: myNbQuadPrisms = nb; break;
428 case SMDSEntity_BiQuad_Penta: myNbBiQuadPrisms = nb; break;
429 case SMDSEntity_Quad_Pyramid: myNbQuadPyramids = nb; break;
430 case SMDSEntity_Quad_Quadrangle: myNbQuadQuadrangles = nb; break;
431 case SMDSEntity_Quad_Tetra: myNbQuadTetras = nb; break;
432 case SMDSEntity_Quad_Triangle: myNbQuadTriangles = nb; break;
433 case SMDSEntity_Quadrangle: myNbQuadrangles = nb; break;
434 case SMDSEntity_Tetra: myNbTetras = nb; break;
435 case SMDSEntity_TriQuad_Hexa: myNbTriQuadHexas = nb; break;
436 case SMDSEntity_Triangle: myNbTriangles = nb; break;
437 case SMDSEntity_Quad_Polygon: myNbQuadPolygons = nb; break;
438 case SMDSEntity_Quad_Polyhedra:
439 case SMDSEntity_Last: