Salome HOME
PR: display submeshes and groups
[modules/smesh.git] / src / SMDS / SMDS_VolumeOfNodes.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  SMESH SMDS : implementaion of Salome mesh data structure
23 //
24 #ifdef _MSC_VER
25 #pragma warning(disable:4786)
26 #endif
27
28 #include "SMDS_VolumeOfNodes.hxx"
29 #include "SMDS_MeshNode.hxx"
30 #include "SMDS_SetIterator.hxx"
31 #include "SMDS_VolumeTool.hxx"
32 #include "SMDS_Mesh.hxx"
33 #include "utilities.h"
34
35 using namespace std;
36
37 ///////////////////////////////////////////////////////////////////////////////
38 /// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and
39 /// 5,1 and 7,3 are an edges.
40 ///////////////////////////////////////////////////////////////////////////////
41 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
42                 const SMDS_MeshNode * node1,
43                 const SMDS_MeshNode * node2,
44                 const SMDS_MeshNode * node3,
45                 const SMDS_MeshNode * node4,
46                 const SMDS_MeshNode * node5,
47                 const SMDS_MeshNode * node6,
48                 const SMDS_MeshNode * node7,
49                 const SMDS_MeshNode * node8)
50 {
51         myNbNodes = 8;
52         myNodes = new const SMDS_MeshNode* [myNbNodes];
53         myNodes[0]=node1;
54         myNodes[1]=node2;
55         myNodes[2]=node3;
56         myNodes[3]=node4;
57         myNodes[4]=node5;
58         myNodes[5]=node6;
59         myNodes[6]=node7;
60         myNodes[7]=node8;
61 }
62
63 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
64                 const SMDS_MeshNode * node1,
65                 const SMDS_MeshNode * node2,
66                 const SMDS_MeshNode * node3,
67                 const SMDS_MeshNode * node4)
68 {
69         myNbNodes = 4;
70         myNodes = new const SMDS_MeshNode* [myNbNodes];
71         myNodes[0]=node1;
72         myNodes[1]=node2;
73         myNodes[2]=node3;
74         myNodes[3]=node4;
75 }
76
77 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
78                 const SMDS_MeshNode * node1,
79                 const SMDS_MeshNode * node2,
80                 const SMDS_MeshNode * node3,
81                 const SMDS_MeshNode * node4,
82                 const SMDS_MeshNode * node5)
83 {
84         myNbNodes = 5;
85         myNodes = new const SMDS_MeshNode* [myNbNodes];
86         myNodes[0]=node1;
87         myNodes[1]=node2;
88         myNodes[2]=node3;
89         myNodes[3]=node4;
90         myNodes[4]=node5;
91 }
92
93 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
94                 const SMDS_MeshNode * node1,
95                 const SMDS_MeshNode * node2,
96                 const SMDS_MeshNode * node3,
97                 const SMDS_MeshNode * node4,
98                 const SMDS_MeshNode * node5,
99                 const SMDS_MeshNode * node6)
100 {
101         myNbNodes = 6;
102         myNodes = new const SMDS_MeshNode* [myNbNodes];
103         myNodes[0]=node1;
104         myNodes[1]=node2;
105         myNodes[2]=node3;
106         myNodes[3]=node4;
107         myNodes[4]=node5;
108         myNodes[5]=node6;
109 }
110
111 bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
112                                      const int            nbNodes)
113 {
114   if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7)
115     return false;
116
117   delete [] myNodes;
118   myNbNodes = nbNodes;
119   myNodes = new const SMDS_MeshNode* [myNbNodes];
120   for ( int i = 0; i < nbNodes; i++ )
121     myNodes[ i ] = nodes [ i ];
122
123   return true;
124 }
125
126 SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes()
127 {
128   if (myNodes != NULL) {
129     delete [] myNodes;
130     myNodes = NULL;
131   }
132 }
133
134 void SMDS_VolumeOfNodes::Print(ostream & OS) const
135 {
136         OS << "volume <" << GetID() << "> : ";
137         int i;
138         for (i = 0; i < NbNodes()-1; ++i) OS << myNodes[i] << ",";
139         OS << myNodes[NbNodes()-1]<< ") " << endl;
140 }
141
142 int SMDS_VolumeOfNodes::NbFaces() const
143 {
144         switch(NbNodes())
145         {
146         case 4: return 4;
147         case 5: return 5;
148         case 6: return 5;
149         case 8: return 6;
150         default: MESSAGE("invalid number of nodes");
151         }
152         return 0;
153 }
154
155 int SMDS_VolumeOfNodes::NbNodes() const
156 {
157         return myNbNodes;
158 }
159
160 int SMDS_VolumeOfNodes::NbEdges() const
161 {
162         switch(NbNodes())
163         {
164         case 4: return 6;
165         case 5: return 8;
166         case 6: return 9;
167         case 8: return 12;
168         default: MESSAGE("invalid number of nodes");
169         }
170         return 0;
171 }
172
173 /*!
174  * \brief Iterator on node of volume
175  */
176 class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
177 {
178  public:
179   SMDS_VolumeOfNodes_MyIterator(const SMDS_MeshNode* const* s, int l):
180     SMDS_NodeArrayElemIterator( s, & s[ l ]) {}
181 };
182
183 /*!
184  * \brief Iterator on faces or edges of volume
185  */
186 class _MySubIterator : public SMDS_ElemIterator
187 {
188   vector< const SMDS_MeshElement* > myElems;
189   int myIndex;
190 public:
191   _MySubIterator(const SMDS_VolumeOfNodes* vol, SMDSAbs_ElementType type):myIndex(0) {
192     SMDS_VolumeTool vTool(vol);
193     if (type == SMDSAbs_Face)
194       vTool.GetAllExistingFaces( myElems );
195     else
196       vTool.GetAllExistingFaces( myElems );
197   }
198   /// Return true if and only if there are other object in this iterator
199   virtual bool more() { return myIndex < myElems.size(); }
200
201   /// Return the current object and step to the next one
202   virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; }
203 };
204
205 SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType type) const
206 {
207   switch(type)
208   {
209   case SMDSAbs_Volume:
210     return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
211   case SMDSAbs_Node:
212     return SMDS_ElemIteratorPtr(new SMDS_VolumeOfNodes_MyIterator(myNodes,myNbNodes));
213   case SMDSAbs_Face:
214     return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Face));
215   case SMDSAbs_Edge:
216     return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Edge));
217   default:
218     MESSAGE("ERROR : Iterator not implemented");
219     return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
220   }
221 }
222
223 SMDSAbs_ElementType SMDS_VolumeOfNodes::GetType() const
224 {
225         return SMDSAbs_Volume;
226 }
227
228 /*!
229  * \brief Return node by its index
230  * \param ind - node index
231  * \retval const SMDS_MeshNode* - the node
232  */
233 const SMDS_MeshNode* SMDS_VolumeOfNodes::GetNode(const int ind) const
234 {
235   return myNodes[ ind ];
236 }
237
238 SMDSAbs_EntityType SMDS_VolumeOfNodes::GetEntityType() const
239 {
240   SMDSAbs_EntityType aType = SMDSEntity_Tetra;
241   switch(myNbNodes)
242   {
243   case 4: aType = SMDSEntity_Tetra;   break;
244   case 5: aType = SMDSEntity_Pyramid; break;
245   case 6: aType = SMDSEntity_Penta;   break;
246   case 8:
247   default: aType = SMDSEntity_Hexa;    break;
248   }
249   return aType;
250 }
251
252