]> SALOME platform Git repositories - modules/smesh.git/blob - src/SMDS/SMDS_QuadraticFaceOfNodes.cxx
Salome HOME
6d8e55156b042a777b9fd224fc021cc48f483b16
[modules/smesh.git] / src / SMDS / SMDS_QuadraticFaceOfNodes.cxx
1 // File:      SMDS_QuadraticFaceOfNodes.cxx
2 // Created:   16.01.06 17:12:58
3 // Author:    Sergey KUUL
4 // Copyright: Open CASCADE 2006
5
6 #include "SMDS_QuadraticFaceOfNodes.hxx"
7
8 #include "SMDS_IteratorOfElements.hxx"
9 #include "SMDS_MeshNode.hxx"
10
11 #include "utilities.h"
12
13 using namespace std;
14
15
16 //=======================================================================
17 //function : SMDS_QuadraticFaceOfNodes()
18 //purpose  : Constructor
19 //=======================================================================
20
21 SMDS_QuadraticFaceOfNodes::SMDS_QuadraticFaceOfNodes(const SMDS_MeshNode * n1,
22                                                      const SMDS_MeshNode * n2,
23                                                      const SMDS_MeshNode * n3,
24                                                      const SMDS_MeshNode * n12,
25                                                      const SMDS_MeshNode * n23,
26                                                      const SMDS_MeshNode * n31)
27 {
28   myNodes.push_back(n1);
29   myNodes.push_back(n2);
30   myNodes.push_back(n3);
31   myNodes.push_back(n12);
32   myNodes.push_back(n23);
33   myNodes.push_back(n31);
34 }
35
36
37 //=======================================================================
38 //function : SMDS_QuadraticFaceOfNodes()
39 //purpose  : Constructor
40 //=======================================================================
41
42 SMDS_QuadraticFaceOfNodes::SMDS_QuadraticFaceOfNodes(const SMDS_MeshNode * n1,
43                                                      const SMDS_MeshNode * n2,
44                                                      const SMDS_MeshNode * n3,
45                                                      const SMDS_MeshNode * n4,
46                                                      const SMDS_MeshNode * n12,
47                                                      const SMDS_MeshNode * n23,
48                                                      const SMDS_MeshNode * n34,
49                                                      const SMDS_MeshNode * n41)
50 {
51   myNodes.push_back(n1);
52   myNodes.push_back(n2);
53   myNodes.push_back(n3);
54   myNodes.push_back(n4);
55   myNodes.push_back(n12);
56   myNodes.push_back(n23);
57   myNodes.push_back(n34);
58   myNodes.push_back(n41);
59 }
60
61
62 //=======================================================================
63 //function : IsMediumNode
64 //purpose  : 
65 //=======================================================================
66
67 bool SMDS_QuadraticFaceOfNodes::IsMediumNode(const SMDS_MeshNode * node) const
68 {
69   int i=NbNodes()/2;
70   for(; i<NbNodes(); i++) {
71     if(myNodes[i]==node) return true;
72   }
73   return false;
74 }
75
76
77 //=======================================================================
78 //function : ChangeNodes
79 //purpose  : 
80 //=======================================================================
81
82 bool SMDS_QuadraticFaceOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
83                                             const int            nbNodes)
84 {
85   if( nbNodes==6 || nbNodes==8 ) {
86     myNodes.resize(nbNodes);
87     int i=0;
88     for(; i<nbNodes; i++) {
89       myNodes[i] = nodes[i];
90     }
91     return true;
92   }
93   return false;
94 }
95
96
97 //=======================================================================
98 //function : NbNodes
99 //purpose  : 
100 //=======================================================================
101 int SMDS_QuadraticFaceOfNodes::NbNodes() const
102 {
103   return myNodes.size();
104 }
105
106
107 //=======================================================================
108 //function : NbEdges
109 //purpose  : 
110 //=======================================================================
111 int SMDS_QuadraticFaceOfNodes::NbEdges() const
112 {
113   return NbNodes()/2;
114 }
115
116
117 //=======================================================================
118 //function : NbFaces
119 //purpose  : 
120 //=======================================================================
121 int SMDS_QuadraticFaceOfNodes::NbFaces() const
122 {
123   return 1;
124 }
125
126
127 //=======================================================================
128 //function : Print
129 //purpose  : 
130 //=======================================================================
131 void SMDS_QuadraticFaceOfNodes::Print(ostream & OS) const
132 {
133   OS << "quadratic face <" << GetID() << " > : ";
134   int i, nbNodes = myNodes.size();
135   for (i = 0; i < nbNodes - 1; i++)
136     OS << myNodes[i] << ",";
137   OS << myNodes[i] << ") " << endl;
138 }
139
140
141 //=======================================================================
142 //function : interlacedNodesIterator
143 //purpose  : 
144 //=======================================================================
145 class SMDS_QuadraticFaceOfNodes_MyInterlacedNodeIterator:public SMDS_NodeIterator
146 {
147   const std::vector<const SMDS_MeshNode *> mySet;
148   int index;
149  public:
150   SMDS_QuadraticFaceOfNodes_MyInterlacedNodeIterator(const std::vector<const SMDS_MeshNode *> s):
151     mySet(s),index(0) {}
152
153   bool more()
154   {
155     return index < mySet.size();
156   }
157
158   const SMDS_MeshNode* next()
159   {
160     index++;
161     int num=0;
162     if(mySet.size()==6) {
163       if(index==2) num=3;
164       else if(index==3) num=1;
165       else if(index==4) num=4;
166       else if(index==5) num=2;
167       else if(index==6) num=5;
168     }
169     else {
170       if(index==2) num=4;
171       else if(index==3) num=1;
172       else if(index==4) num=5;
173       else if(index==5) num=2;
174       else if(index==6) num=6;
175       else if(index==7) num=3;
176       else if(index==8) num=7;
177     }
178     return mySet[num];
179   }
180 };
181
182 SMDS_NodeIteratorPtr SMDS_QuadraticFaceOfNodes::interlacedNodesIterator() const
183 {
184   return SMDS_NodeIteratorPtr
185     (new SMDS_QuadraticFaceOfNodes_MyInterlacedNodeIterator(myNodes));
186 }
187
188
189
190 //=======================================================================
191 //function : elementsIterator
192 //purpose  : 
193 //=======================================================================
194 class SMDS_QuadraticFaceOfNodes_MyIterator:public SMDS_ElemIterator
195 {
196   const std::vector<const SMDS_MeshNode *> mySet;
197   int index;
198  public:
199   SMDS_QuadraticFaceOfNodes_MyIterator(const std::vector<const SMDS_MeshNode *> s):
200     mySet(s),index(0) {}
201
202   bool more()
203   {
204     return index < mySet.size();
205   }
206
207   const SMDS_MeshElement* next()
208   {
209     index++;
210     return mySet[index-1];
211   }
212 };
213
214 SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::elementsIterator
215                                          (SMDSAbs_ElementType type) const
216 {
217   switch(type)
218   {
219   case SMDSAbs_Face:
220     return SMDS_MeshElement::elementsIterator(SMDSAbs_Face);
221   case SMDSAbs_Node:
222     return SMDS_ElemIteratorPtr(new SMDS_QuadraticFaceOfNodes_MyIterator(myNodes));
223   case SMDSAbs_Edge:
224     MESSAGE("Error : edge iterator for SMDS_QuadraticFaceOfNodes not implemented");
225     break;
226   default:
227     return SMDS_ElemIteratorPtr
228       (new SMDS_IteratorOfElements
229        (this,type,SMDS_ElemIteratorPtr
230         (new SMDS_QuadraticFaceOfNodes_MyIterator(myNodes))));
231   }
232   return SMDS_ElemIteratorPtr();
233 }