1 // File : SMDS_MeshInfo.hxx
2 // Created : Mon Sep 24 18:32:41 2007
3 // Author : Edward AGAPOV (eap)
7 #ifndef SMDS_MeshInfo_HeaderFile
8 #define SMDS_MeshInfo_HeaderFile
10 #include "SMESH_SMDS.hxx"
12 #include "SMDS_MeshElement.hxx"
14 class SMDS_EXPORT SMDS_MeshInfo
18 inline SMDS_MeshInfo();
20 int NbNodes() const { return myNbNodes; }
22 inline int NbEdges (SMDSAbs_ElementOrder order = ORDER_ANY) const;
23 inline int NbFaces (SMDSAbs_ElementOrder order = ORDER_ANY) const;
24 inline int NbTriangles (SMDSAbs_ElementOrder order = ORDER_ANY) const;
25 inline int NbQuadrangles(SMDSAbs_ElementOrder order = ORDER_ANY) const;
26 int NbPolygons() const { return myNbPolygons; }
28 inline int NbVolumes (SMDSAbs_ElementOrder order = ORDER_ANY) const;
29 inline int NbTetras (SMDSAbs_ElementOrder order = ORDER_ANY) const;
30 inline int NbHexas (SMDSAbs_ElementOrder order = ORDER_ANY) const;
31 inline int NbPyramids(SMDSAbs_ElementOrder order = ORDER_ANY) const;
32 inline int NbPrisms (SMDSAbs_ElementOrder order = ORDER_ANY) const;
33 int NbPolyhedrons() const { return myNbPolyhedrons; }
36 friend class SMDS_Mesh;
38 // methods to count NOT POLY elements
39 inline void remove(const SMDS_MeshElement* el);
40 inline void add (const SMDS_MeshElement* el);
41 inline int index(SMDSAbs_ElementType type, int nbNodes);
42 // methods to remove elements of ANY kind
43 inline void RemoveEdge(const SMDS_MeshElement* el);
44 inline void RemoveFace(const SMDS_MeshElement* el);
45 inline void RemoveVolume(const SMDS_MeshElement* el);
49 int myNbEdges , myNbQuadEdges ;
50 int myNbTriangles , myNbQuadTriangles ;
51 int myNbQuadrangles, myNbQuadQuadrangles;
54 int myNbTetras , myNbQuadTetras ;
55 int myNbHexas , myNbQuadHexas ;
56 int myNbPyramids, myNbQuadPyramids;
57 int myNbPrisms , myNbQuadPrisms ;
60 std::vector<int*> myNb; // pointers to myNb... fields
61 std::vector<int> myShift; // shift to get an index in myNb by elem->NbNodes()
64 inline SMDS_MeshInfo::SMDS_MeshInfo():
66 myNbEdges (0), myNbQuadEdges (0),
67 myNbTriangles (0), myNbQuadTriangles (0),
68 myNbQuadrangles(0), myNbQuadQuadrangles(0),
70 myNbTetras (0), myNbQuadTetras (0),
71 myNbHexas (0), myNbQuadHexas (0),
72 myNbPyramids(0), myNbQuadPyramids(0),
73 myNbPrisms (0), myNbQuadPrisms (0),
76 // Number of nodes in standard element types
103 // So to have a unique index for each type basing on nb of nodes, we use a shift:
104 myShift.resize(SMDSAbs_Volume + 1, 0);
105 myShift[ SMDSAbs_Face ] = +8; // 3->11, 4->12, 6->14, 8->16
106 myShift[ SMDSAbs_Edge ] = -2; // 2->0, 4->2
108 myNb.resize( index( SMDSAbs_Volume,20 ) + 1, NULL);
109 myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
111 myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
112 myNb[ index( SMDSAbs_Edge,4 )] = & myNbQuadEdges;
114 myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
115 myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
116 myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
117 myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
119 myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
120 myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
121 myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
122 myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
123 myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
124 myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
125 myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
126 myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
130 SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes)
131 { return nbNodes + myShift[ type ]; }
133 inline void // remove
134 SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
135 { --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
138 SMDS_MeshInfo::add(const SMDS_MeshElement* el)
139 { ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
141 inline void // RemoveEdge
142 SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
143 { if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
145 inline void // RemoveFace
146 SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el)
147 { if ( el->IsPoly() ) --myNbPolygons; else remove( el ); }
149 inline void // RemoveVolume
150 SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
151 { if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }
153 inline int // NbEdges
154 SMDS_MeshInfo::NbEdges (SMDSAbs_ElementOrder order) const
155 { return order == ORDER_ANY ? myNbEdges+myNbQuadEdges : order == ORDER_LINEAR ? myNbEdges : myNbQuadEdges; }
157 inline int // NbFaces
158 SMDS_MeshInfo::NbFaces (SMDSAbs_ElementOrder order) const
159 { return NbTriangles(order)+NbQuadrangles(order)+(order == ORDER_QUADRATIC ? 0 : myNbPolygons); }
161 inline int // NbTriangles
162 SMDS_MeshInfo::NbTriangles (SMDSAbs_ElementOrder order) const
163 { return order == ORDER_ANY ? myNbTriangles+myNbQuadTriangles : order == ORDER_LINEAR ? myNbTriangles : myNbQuadTriangles; }
165 inline int // NbQuadrangles
166 SMDS_MeshInfo::NbQuadrangles(SMDSAbs_ElementOrder order) const
167 { return order == ORDER_ANY ? myNbQuadrangles+myNbQuadQuadrangles : order == ORDER_LINEAR ? myNbQuadrangles : myNbQuadQuadrangles; }
169 inline int // NbVolumes
170 SMDS_MeshInfo::NbVolumes (SMDSAbs_ElementOrder order) const
171 { return NbTetras(order) + NbHexas(order) + NbPyramids(order) + NbPrisms(order) + (order == ORDER_QUADRATIC ? 0 : myNbPolyhedrons); }
173 inline int // NbTetras
174 SMDS_MeshInfo::NbTetras (SMDSAbs_ElementOrder order) const
175 { return order == ORDER_ANY ? myNbTetras+myNbQuadTetras : order == ORDER_LINEAR ? myNbTetras : myNbQuadTetras; }
177 inline int // NbHexas
178 SMDS_MeshInfo::NbHexas (SMDSAbs_ElementOrder order) const
179 { return order == ORDER_ANY ? myNbHexas+myNbQuadHexas : order == ORDER_LINEAR ? myNbHexas : myNbQuadHexas; }
181 inline int // NbPyramids
182 SMDS_MeshInfo::NbPyramids(SMDSAbs_ElementOrder order) const
183 { return order == ORDER_ANY ? myNbPyramids+myNbQuadPyramids : order == ORDER_LINEAR ? myNbPyramids : myNbQuadPyramids; }
185 inline int // NbPrisms
186 SMDS_MeshInfo::NbPrisms (SMDSAbs_ElementOrder order) const
187 { return order == ORDER_ANY ? myNbPrisms+myNbQuadPrisms : order == ORDER_LINEAR ? myNbPrisms : myNbQuadPrisms; }