Salome HOME
Movement of examples to CVS EXAMPLES SAMPLES_SRC.
[modules/smesh.git] / src / SMDS / SMDS_VolumeOfNodes.cxx
1 //  SMESH SMDS : implementaion of Salome mesh data structure
2 //
3 //  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21
22 #ifdef _MSC_VER
23 #pragma warning(disable:4786)
24 #endif
25
26 #include "SMDS_VolumeOfNodes.hxx"
27 #include "SMDS_MeshNode.hxx"
28 #include "utilities.h"
29
30 using namespace std;
31
32 ///////////////////////////////////////////////////////////////////////////////
33 /// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and
34 /// 5,1 and 7,3 are an edges.
35 ///////////////////////////////////////////////////////////////////////////////
36 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
37                 const SMDS_MeshNode * node1,
38                 const SMDS_MeshNode * node2,
39                 const SMDS_MeshNode * node3,
40                 const SMDS_MeshNode * node4,
41                 const SMDS_MeshNode * node5,
42                 const SMDS_MeshNode * node6,
43                 const SMDS_MeshNode * node7,
44                 const SMDS_MeshNode * node8)
45 {
46         myNbNodes = 8;
47         myNodes = new const SMDS_MeshNode* [myNbNodes];
48         myNodes[0]=node1;
49         myNodes[1]=node2;
50         myNodes[2]=node3;
51         myNodes[3]=node4;
52         myNodes[4]=node5;
53         myNodes[5]=node6;
54         myNodes[6]=node7;
55         myNodes[7]=node8;
56 }
57
58 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
59                 const SMDS_MeshNode * node1,
60                 const SMDS_MeshNode * node2,
61                 const SMDS_MeshNode * node3,
62                 const SMDS_MeshNode * node4)
63 {
64         myNbNodes = 4;
65         myNodes = new const SMDS_MeshNode* [myNbNodes];
66         myNodes[0]=node1;
67         myNodes[1]=node2;
68         myNodes[2]=node3;
69         myNodes[3]=node4;
70 }
71
72 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
73                 const SMDS_MeshNode * node1,
74                 const SMDS_MeshNode * node2,
75                 const SMDS_MeshNode * node3,
76                 const SMDS_MeshNode * node4,
77                 const SMDS_MeshNode * node5)
78 {
79         myNbNodes = 5;
80         myNodes = new const SMDS_MeshNode* [myNbNodes];
81         myNodes[0]=node1;
82         myNodes[1]=node2;
83         myNodes[2]=node3;
84         myNodes[3]=node4;
85         myNodes[4]=node5;
86 }
87
88 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
89                 const SMDS_MeshNode * node1,
90                 const SMDS_MeshNode * node2,
91                 const SMDS_MeshNode * node3,
92                 const SMDS_MeshNode * node4,
93                 const SMDS_MeshNode * node5,
94                 const SMDS_MeshNode * node6)
95 {
96         myNbNodes = 6;
97         myNodes = new const SMDS_MeshNode* [myNbNodes];
98         myNodes[0]=node1;
99         myNodes[1]=node2;
100         myNodes[2]=node3;
101         myNodes[3]=node4;
102         myNodes[4]=node5;
103         myNodes[5]=node6;
104 }
105
106 bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
107                                      const int            nbNodes)
108 {
109   if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7)
110     return false;
111
112   delete [] myNodes;
113   myNbNodes = nbNodes;
114   myNodes = new const SMDS_MeshNode* [myNbNodes];
115   for ( int i = 0; i < nbNodes; i++ )
116     myNodes[ i ] = nodes [ i ];
117
118   return true;
119 }
120
121 SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes()
122 {
123   if (myNodes != NULL) {
124     delete [] myNodes;
125     myNodes = NULL;
126   }
127 }
128
129 //=======================================================================
130 //function : Print
131 //purpose  : 
132 //=======================================================================
133
134 void SMDS_VolumeOfNodes::Print(ostream & OS) const
135 {
136         OS << "volume <" << GetID() << "> : ";
137         int i;
138         for (i = 0; i < NbNodes(); ++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 class SMDS_VolumeOfNodes_MyIterator:public SMDS_ElemIterator
174 {
175   const SMDS_MeshNode* const* mySet;
176   int myLength;
177   int index;
178  public:
179   SMDS_VolumeOfNodes_MyIterator(const SMDS_MeshNode* const* s, int l):
180     mySet(s),myLength(l),index(0) {}
181
182   bool more()
183   {
184     return index<myLength;
185   }
186
187   const SMDS_MeshElement* next()
188   {
189     index++;
190     return mySet[index-1];
191   }
192 };
193
194 SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::
195         elementsIterator(SMDSAbs_ElementType type) const
196 {
197   switch(type)
198   {
199   case SMDSAbs_Volume:
200     return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
201   case SMDSAbs_Node:
202     return SMDS_ElemIteratorPtr(new SMDS_VolumeOfNodes_MyIterator(myNodes,myNbNodes));
203   default:
204     MESSAGE("ERROR : Iterator not implemented");
205     return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
206   }
207 }
208
209 SMDSAbs_ElementType SMDS_VolumeOfNodes::GetType() const
210 {
211         return SMDSAbs_Volume;
212 }