1 // Copyright (C) 2007-2015 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
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 NbElements(SMDSAbs_EntityType type) const { return NbEntities(type); }
44 inline int NbElements(SMDSAbs_GeometryType type) const { return NbElementsOfGeom(type); }
46 inline int NbEntities(SMDSAbs_EntityType type) const;
47 inline int NbElementsOfGeom(SMDSAbs_GeometryType geom) const;
49 int NbNodes() const { return myNbNodes; }
50 int Nb0DElements() const { return myNb0DElements; }
51 int NbBalls() const { return myNbBalls; }
52 inline int NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const;
54 inline int NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const;
55 inline int NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const;
56 inline int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) const;
57 int NbBiQuadTriangles() const { return myNbBiQuadTriangles; }
58 int NbBiQuadQuadrangles() const { return myNbBiQuadQuadrangles; }
59 inline int NbPolygons(SMDSAbs_ElementOrder order = ORDER_ANY) const;
61 inline int NbVolumes (SMDSAbs_ElementOrder order = ORDER_ANY) const;
62 inline int NbTetras (SMDSAbs_ElementOrder order = ORDER_ANY) const;
63 inline int NbHexas (SMDSAbs_ElementOrder order = ORDER_ANY) const;
64 inline int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) const;
65 inline int NbPrisms (SMDSAbs_ElementOrder order = ORDER_ANY) const;
66 inline int NbHexPrisms(SMDSAbs_ElementOrder order = ORDER_ANY) const;
67 int NbTriQuadHexas() const { return myNbTriQuadHexas; }
68 int NbPolyhedrons() const { return myNbPolyhedrons; }
71 inline void addWithPoly(const SMDS_MeshElement* el);
72 inline void setNb(const SMDSAbs_EntityType geomType, const int nb);
75 friend class SMDS_Mesh;
77 // methods to count NOT POLY elements
78 inline void remove(const SMDS_MeshElement* el);
79 inline void add (const SMDS_MeshElement* el);
80 inline int index(SMDSAbs_ElementType type, int nbNodes) const;
81 // methods to remove elements of ANY kind
82 inline void RemoveEdge(const SMDS_MeshElement* el);
83 inline void RemoveFace(const SMDS_MeshElement* el);
84 inline void RemoveVolume(const SMDS_MeshElement* el);
90 int myNbEdges , myNbQuadEdges ;
91 int myNbTriangles , myNbQuadTriangles, myNbBiQuadTriangles ;
92 int myNbQuadrangles, myNbQuadQuadrangles, myNbBiQuadQuadrangles;
93 int myNbPolygons , myNbQuadPolygons;
95 int myNbTetras , myNbQuadTetras ;
96 int myNbHexas , myNbQuadHexas, myNbTriQuadHexas;
97 int myNbPyramids, myNbQuadPyramids;
98 int myNbPrisms , myNbQuadPrisms ;
102 std::vector<int*> myNb; // pointers to myNb... fields
103 std::vector<int> myShift; // shift to get an index in myNb by elem->NbNodes()
106 inline SMDS_MeshInfo::SMDS_MeshInfo():
110 myNbEdges (0), myNbQuadEdges (0),
111 myNbTriangles (0), myNbQuadTriangles (0), myNbBiQuadTriangles(0),
112 myNbQuadrangles(0), myNbQuadQuadrangles(0), myNbBiQuadQuadrangles(0),
113 myNbPolygons (0), myNbQuadPolygons (0),
114 myNbTetras (0), myNbQuadTetras (0),
115 myNbHexas (0), myNbQuadHexas (0), myNbTriQuadHexas(0),
116 myNbPyramids (0), myNbQuadPyramids(0),
117 myNbPrisms (0), myNbQuadPrisms (0),
121 // Number of nodes in standard element types (. - actual nb, * - after the shift)
127 // ====================
128 // 0 ------------------ - DON't USE 0!!!
157 // So to have a unique index for each type basing on nb of nodes, we use a shift:
158 myShift.resize(SMDSAbs_NbElementTypes, 0);
160 myShift[ SMDSAbs_Face ] = +15;// 3->18, 4->19, etc.
161 myShift[ SMDSAbs_Edge ] = +14;// 2->16, 3->17
162 myShift[ SMDSAbs_0DElement ] = +2; // 1->3
163 myShift[ SMDSAbs_Ball ] = +1; // 1->2
165 myNb.resize( index( SMDSAbs_Volume,27 ) + 1, NULL);
167 myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
168 myNb[ index( SMDSAbs_0DElement,1 )] = & myNb0DElements;
169 myNb[ index( SMDSAbs_Ball,1 )] = & myNbBalls;
171 myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
172 myNb[ index( SMDSAbs_Edge,3 )] = & myNbQuadEdges;
174 myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
175 myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
176 myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
177 myNb[ index( SMDSAbs_Face,7 )] = & myNbBiQuadTriangles;
178 myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
179 myNb[ index( SMDSAbs_Face,9 )] = & myNbBiQuadQuadrangles;
181 myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
182 myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
183 myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
184 myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
185 myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
186 myNb[ index( SMDSAbs_Volume, 12)] = & myNbHexPrism;
187 myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
188 myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
189 myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
190 myNb[ index( SMDSAbs_Volume, 27)] = & myNbTriQuadHexas;
193 inline SMDS_MeshInfo& // operator=
194 SMDS_MeshInfo::operator=(const SMDS_MeshInfo& other)
195 { for ( int i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=(*other.myNb[i]);
196 myNbPolygons = other.myNbPolygons;
197 myNbQuadPolygons = other.myNbQuadPolygons;
198 myNbPolyhedrons = other.myNbPolyhedrons;
203 SMDS_MeshInfo::Clear()
204 { for ( int i=0; i<myNb.size(); ++i ) if ( myNb[i] ) (*myNb[i])=0;
205 myNbPolygons=myNbQuadPolygons=myNbPolyhedrons=0;
209 SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes) const
210 { return nbNodes + myShift[ type ]; }
212 inline void // remove
213 SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
214 { --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
217 SMDS_MeshInfo::add(const SMDS_MeshElement* el)
218 { ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
220 inline void // addWithPoly
221 SMDS_MeshInfo::addWithPoly(const SMDS_MeshElement* el) {
222 switch ( el->GetEntityType() ) {
223 case SMDSEntity_Polygon: ++myNbPolygons; break;
224 case SMDSEntity_Quad_Polygon: ++myNbQuadPolygons; break;
225 case SMDSEntity_Polyhedra: ++myNbPolyhedrons; break;
229 inline void // RemoveEdge
230 SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
231 { if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
233 inline void // RemoveFace
234 SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el) {
235 switch ( el->GetEntityType() ) {
236 case SMDSEntity_Polygon: --myNbPolygons; break;
237 case SMDSEntity_Quad_Polygon: --myNbQuadPolygons; break;
242 inline void // RemoveVolume
243 SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
244 { if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }
246 inline int // NbEdges
247 SMDS_MeshInfo::NbEdges (SMDSAbs_ElementOrder order) const
248 { return order == ORDER_ANY ? myNbEdges+myNbQuadEdges : order == ORDER_LINEAR ? myNbEdges : myNbQuadEdges; }
250 inline int // NbFaces
251 SMDS_MeshInfo::NbFaces (SMDSAbs_ElementOrder order) const
252 { return NbTriangles(order)+NbQuadrangles(order)+(order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons ); }
254 inline int // NbTriangles
255 SMDS_MeshInfo::NbTriangles (SMDSAbs_ElementOrder order) const
256 { return order == ORDER_ANY ? myNbTriangles+myNbQuadTriangles+myNbBiQuadTriangles : order == ORDER_LINEAR ? myNbTriangles : myNbQuadTriangles+myNbBiQuadTriangles; }
258 inline int // NbQuadrangles
259 SMDS_MeshInfo::NbQuadrangles(SMDSAbs_ElementOrder order) const
260 { return order == ORDER_ANY ? myNbQuadrangles+myNbQuadQuadrangles+myNbBiQuadQuadrangles : order == ORDER_LINEAR ? myNbQuadrangles : myNbQuadQuadrangles+myNbBiQuadQuadrangles; }
262 inline int // NbPolygons
263 SMDS_MeshInfo::NbPolygons(SMDSAbs_ElementOrder order) const
264 { return order == ORDER_ANY ? myNbPolygons+myNbQuadPolygons : order == ORDER_LINEAR ? myNbPolygons : myNbQuadPolygons; }
266 inline int // NbVolumes
267 SMDS_MeshInfo::NbVolumes (SMDSAbs_ElementOrder order) const
268 { return NbTetras(order) + NbHexas(order) + NbPyramids(order) + NbPrisms(order) + NbHexPrisms(order) + (order == ORDER_QUADRATIC ? 0 : myNbPolyhedrons); }
270 inline int // NbTetras
271 SMDS_MeshInfo::NbTetras (SMDSAbs_ElementOrder order) const
272 { return order == ORDER_ANY ? myNbTetras+myNbQuadTetras : order == ORDER_LINEAR ? myNbTetras : myNbQuadTetras; }
274 inline int // NbHexas
275 SMDS_MeshInfo::NbHexas (SMDSAbs_ElementOrder order) const
276 { return order == ORDER_ANY ? myNbHexas+myNbQuadHexas+myNbTriQuadHexas : order == ORDER_LINEAR ? myNbHexas : myNbQuadHexas+myNbTriQuadHexas; }
278 inline int // NbPyramids
279 SMDS_MeshInfo::NbPyramids(SMDSAbs_ElementOrder order) const
280 { return order == ORDER_ANY ? myNbPyramids+myNbQuadPyramids : order == ORDER_LINEAR ? myNbPyramids : myNbQuadPyramids; }
282 inline int // NbPrisms
283 SMDS_MeshInfo::NbPrisms (SMDSAbs_ElementOrder order) const
284 { return order == ORDER_ANY ? myNbPrisms+myNbQuadPrisms : order == ORDER_LINEAR ? myNbPrisms : myNbQuadPrisms; }
286 inline int // NbHexPrisms
287 SMDS_MeshInfo::NbHexPrisms (SMDSAbs_ElementOrder order) const
288 { return order == ORDER_ANY ? myNbHexPrism : order == ORDER_LINEAR ? myNbHexPrism : 0; }
290 inline int // NbElements
291 SMDS_MeshInfo::NbElements(SMDSAbs_ElementType type) const
296 for ( int i=1+index( SMDSAbs_Node,1 ); i<myNb.size(); ++i ) if ( myNb[i] ) nb += *myNb[i];
297 nb += myNbPolygons + myNbQuadPolygons + myNbPolyhedrons;
300 nb = ( myNbTetras+ myNbPyramids+ myNbPrisms+ myNbHexas+ myNbHexPrism+
301 myNbQuadTetras+ myNbQuadPyramids+ myNbQuadPrisms+ myNbQuadHexas+ myNbTriQuadHexas+
305 nb = ( myNbTriangles+ myNbQuadrangles+
306 myNbQuadTriangles+ myNbBiQuadTriangles+
307 myNbQuadQuadrangles+ myNbBiQuadQuadrangles+ myNbPolygons+ myNbQuadPolygons );
310 nb = myNbEdges + myNbQuadEdges;
315 case SMDSAbs_0DElement:
326 inline int // NbEntities
327 SMDS_MeshInfo::NbEntities(SMDSAbs_EntityType type) const
330 case SMDSEntity_Node: return myNbNodes;
331 case SMDSEntity_Edge: return myNbEdges;
332 case SMDSEntity_Quad_Edge: return myNbQuadEdges;
333 case SMDSEntity_Triangle: return myNbTriangles;
334 case SMDSEntity_Quad_Triangle: return myNbQuadTriangles;
335 case SMDSEntity_BiQuad_Triangle: return myNbBiQuadTriangles;
336 case SMDSEntity_Quadrangle: return myNbQuadrangles;
337 case SMDSEntity_Quad_Quadrangle: return myNbQuadQuadrangles;
338 case SMDSEntity_BiQuad_Quadrangle:return myNbBiQuadQuadrangles;
339 case SMDSEntity_Polygon: return myNbPolygons;
340 case SMDSEntity_Tetra: return myNbTetras;
341 case SMDSEntity_Quad_Tetra: return myNbQuadTetras;
342 case SMDSEntity_Pyramid: return myNbPyramids;
343 case SMDSEntity_Quad_Pyramid: return myNbQuadPyramids;
344 case SMDSEntity_Hexa: return myNbHexas;
345 case SMDSEntity_Quad_Hexa: return myNbQuadHexas;
346 case SMDSEntity_TriQuad_Hexa: return myNbTriQuadHexas;
347 case SMDSEntity_Penta: return myNbPrisms;
348 case SMDSEntity_Quad_Penta: return myNbQuadPrisms;
349 case SMDSEntity_Hexagonal_Prism: return myNbHexPrism;
350 case SMDSEntity_Polyhedra: return myNbPolyhedrons;
351 case SMDSEntity_0D: return myNb0DElements;
352 case SMDSEntity_Ball: return myNbBalls;
353 case SMDSEntity_Quad_Polygon: return myNbQuadPolygons;
354 case SMDSEntity_Quad_Polyhedra:
360 inline int // NbElementsOfGeom
361 SMDS_MeshInfo::NbElementsOfGeom(SMDSAbs_GeometryType geom) const
365 case SMDSGeom_POINT: return myNb0DElements;
367 case SMDSGeom_EDGE: return (myNbEdges +
370 case SMDSGeom_TRIANGLE: return (myNbTriangles +
372 myNbBiQuadTriangles );
373 case SMDSGeom_QUADRANGLE: return (myNbQuadrangles +
374 myNbQuadQuadrangles +
375 myNbBiQuadQuadrangles );
376 case SMDSGeom_POLYGON: return (myNbPolygons + myNbQuadPolygons );
378 case SMDSGeom_TETRA: return (myNbTetras +
380 case SMDSGeom_PYRAMID: return (myNbPyramids +
382 case SMDSGeom_HEXA: return (myNbHexas +
385 case SMDSGeom_PENTA: return (myNbPrisms +
387 case SMDSGeom_HEXAGONAL_PRISM: return myNbHexPrism;
388 case SMDSGeom_POLYHEDRA: return myNbPolyhedrons;
390 case SMDSGeom_BALL: return myNbBalls;
399 SMDS_MeshInfo::setNb(const SMDSAbs_EntityType geomType, const int nb)
402 case SMDSEntity_Node: myNbNodes = nb; break;
403 case SMDSEntity_0D: myNb0DElements = nb; break;
404 case SMDSEntity_Ball: myNbBalls = nb; break;
405 case SMDSEntity_BiQuad_Quadrangle:myNbBiQuadQuadrangles = nb; break;
406 case SMDSEntity_BiQuad_Triangle: myNbBiQuadTriangles = nb; break;
407 case SMDSEntity_Edge: myNbEdges = nb; break;
408 case SMDSEntity_Hexa: myNbHexas = nb; break;
409 case SMDSEntity_Hexagonal_Prism: myNbHexPrism = nb; break;
410 case SMDSEntity_Penta: myNbPrisms = nb; break;
411 case SMDSEntity_Polygon: myNbPolygons = nb; break;
412 case SMDSEntity_Polyhedra: myNbPolyhedrons = nb; break;
413 case SMDSEntity_Pyramid: myNbPyramids = nb; break;
414 case SMDSEntity_Quad_Edge: myNbQuadEdges = nb; break;
415 case SMDSEntity_Quad_Hexa: myNbQuadHexas = nb; break;
416 case SMDSEntity_Quad_Penta: myNbQuadPrisms = nb; break;
417 case SMDSEntity_Quad_Pyramid: myNbQuadPyramids = nb; break;
418 case SMDSEntity_Quad_Quadrangle: myNbQuadQuadrangles = nb; break;
419 case SMDSEntity_Quad_Tetra: myNbQuadTetras = nb; break;
420 case SMDSEntity_Quad_Triangle: myNbQuadTriangles = nb; break;
421 case SMDSEntity_Quadrangle: myNbQuadrangles = nb; break;
422 case SMDSEntity_Tetra: myNbTetras = nb; break;
423 case SMDSEntity_TriQuad_Hexa: myNbTriQuadHexas = nb; break;
424 case SMDSEntity_Triangle: myNbTriangles = nb; break;
425 case SMDSEntity_Quad_Polygon: myNbQuadPolygons = nb; break;
426 case SMDSEntity_Quad_Polyhedra: