1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // SMESH SMDS : implementaion of Salome mesh data structure
23 // File: SMDS_QuadraticFaceOfNodes.cxx
24 // Created: 16.01.06 17:12:58
25 // Author: Sergey KUUL
27 #include "SMDS_QuadraticFaceOfNodes.hxx"
29 #include "SMDS_SetIterator.hxx"
30 #include "SMDS_IteratorOfElements.hxx"
31 #include "SMDS_MeshNode.hxx"
32 #include "SMDS_Mesh.hxx"
34 #include "utilities.h"
39 //=======================================================================
40 //function : SMDS_QuadraticFaceOfNodes()
41 //purpose : Constructor
42 //=======================================================================
44 SMDS_QuadraticFaceOfNodes::SMDS_QuadraticFaceOfNodes(const SMDS_MeshNode * n1,
45 const SMDS_MeshNode * n2,
46 const SMDS_MeshNode * n3,
47 const SMDS_MeshNode * n12,
48 const SMDS_MeshNode * n23,
49 const SMDS_MeshNode * n31)
61 //=======================================================================
62 //function : SMDS_QuadraticFaceOfNodes()
63 //purpose : Constructor
64 //=======================================================================
66 SMDS_QuadraticFaceOfNodes::SMDS_QuadraticFaceOfNodes(const SMDS_MeshNode * n1,
67 const SMDS_MeshNode * n2,
68 const SMDS_MeshNode * n3,
69 const SMDS_MeshNode * n4,
70 const SMDS_MeshNode * n12,
71 const SMDS_MeshNode * n23,
72 const SMDS_MeshNode * n34,
73 const SMDS_MeshNode * n41)
87 //=======================================================================
88 //function : IsMediumNode
90 //=======================================================================
92 bool SMDS_QuadraticFaceOfNodes::IsMediumNode(const SMDS_MeshNode * node) const
95 for(; i<NbNodes(); i++) {
96 if(myNodes[i]==node) return true;
102 //=======================================================================
103 //function : ChangeNodes
105 //=======================================================================
107 bool SMDS_QuadraticFaceOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
110 if( nbNodes==6 || nbNodes==8 ) {
111 myNodes.resize(nbNodes);
113 for(; i<nbNodes; i++) {
114 myNodes[i] = nodes[i];
122 //=======================================================================
125 //=======================================================================
126 int SMDS_QuadraticFaceOfNodes::NbNodes() const
128 return myNodes.size();
132 //=======================================================================
135 //=======================================================================
136 int SMDS_QuadraticFaceOfNodes::NbEdges() const
142 //=======================================================================
145 //=======================================================================
146 int SMDS_QuadraticFaceOfNodes::NbFaces() const
151 //=======================================================================
154 //=======================================================================
155 void SMDS_QuadraticFaceOfNodes::Print(ostream & OS) const
157 OS << "quadratic face <" << GetID() << " > : ";
158 int i, nbNodes = myNodes.size();
159 for (i = 0; i < nbNodes - 1; i++)
160 OS << myNodes[i] << ",";
161 OS << myNodes[i] << ") " << endl;
166 //=======================================================================
167 //class : _MyInterlacedNodeIterator
169 //=======================================================================
171 class _MyInterlacedNodeIterator:public SMDS_NodeIterator
173 const vector<const SMDS_MeshNode *>& mySet;
175 const int * myInterlace;
177 _MyInterlacedNodeIterator(const vector<const SMDS_MeshNode *>& s,
178 const int * interlace):
179 mySet(s),myIndex(0),myInterlace(interlace) {}
183 return myIndex < mySet.size();
186 const SMDS_MeshNode* next()
188 return mySet[ myInterlace[ myIndex++ ]];
192 //=======================================================================
193 //class : _MyInterlacedNodeElemIterator
195 //=======================================================================
197 class _MyInterlacedNodeElemIterator : public SMDS_ElemIterator
199 SMDS_NodeIteratorPtr myItr;
201 _MyInterlacedNodeElemIterator(SMDS_NodeIteratorPtr interlacedNodeItr):
202 myItr( interlacedNodeItr ) {}
203 bool more() { return myItr->more(); }
204 const SMDS_MeshElement* next() { return myItr->next(); }
207 //=======================================================================
208 //class : _MyNodeIterator
210 //=======================================================================
212 class _MyNodeIterator : public SMDS_NodeVectorElemIterator
215 _MyNodeIterator(const vector<const SMDS_MeshNode *>& s):
216 SMDS_NodeVectorElemIterator( s.begin(), s.end() ) {}
221 //=======================================================================
222 //function : interlacedNodesIterator
224 //=======================================================================
226 SMDS_NodeIteratorPtr SMDS_QuadraticFaceOfNodes::interlacedNodesIterator() const
228 static int triaInterlace [] = { 0, 3, 1, 4, 2, 5 };
229 static int quadInterlace [] = { 0, 4, 1, 5, 2, 6, 3, 7 };
230 return SMDS_NodeIteratorPtr
231 (new _MyInterlacedNodeIterator (myNodes, myNodes.size()==6 ? triaInterlace : quadInterlace));
234 //=======================================================================
235 //function : interlacedNodesElemIterator
237 //=======================================================================
239 SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::interlacedNodesElemIterator() const
241 return SMDS_ElemIteratorPtr
242 (new _MyInterlacedNodeElemIterator ( interlacedNodesIterator() ));
244 /// ===================================================================
246 * \brief Iterator on edges of face
248 /// ===================================================================
250 class _MyEdgeIterator : public SMDS_ElemIterator
252 vector< const SMDS_MeshElement* > myElems;
255 _MyEdgeIterator(const SMDS_QuadraticFaceOfNodes* face):myIndex(0) {
256 myElems.reserve( face->NbNodes() );
257 SMDS_ElemIteratorPtr nIt = face->interlacedNodesElemIterator();
258 const SMDS_MeshNode* n0 = face->GetNodeWrap( -1 );
259 while ( nIt->more() ) {
260 const SMDS_MeshNode* n1 = static_cast<const SMDS_MeshNode*>( nIt->next() );
261 const SMDS_MeshElement* edge = SMDS_Mesh::FindEdge( n0, n1 );
263 myElems.push_back( edge );
267 /// Return true if and only if there are other object in this iterator
268 virtual bool more() { return myIndex < myElems.size(); }
270 /// Return the current object and step to the next one
271 virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; }
274 //=======================================================================
275 //function : elementsIterator
277 //=======================================================================
279 SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::elementsIterator
280 (SMDSAbs_ElementType type) const
285 return SMDS_MeshElement::elementsIterator(SMDSAbs_Face);
287 return SMDS_ElemIteratorPtr(new _MyNodeIterator(myNodes));
289 return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this ));
292 return SMDS_ElemIteratorPtr
293 (new SMDS_IteratorOfElements
294 (this,type,SMDS_ElemIteratorPtr (new _MyNodeIterator(myNodes))));
296 return SMDS_ElemIteratorPtr();
300 * \brief Return node by its index
301 * \param ind - node index
302 * \retval const SMDS_MeshNode* - the node
304 const SMDS_MeshNode* SMDS_QuadraticFaceOfNodes::GetNode(const int ind) const
306 return myNodes[ ind ];
309 SMDSAbs_EntityType SMDS_QuadraticFaceOfNodes::GetEntityType() const
311 return NbNodes() == 6 ? SMDSEntity_Quad_Triangle : SMDSEntity_Quad_Quadrangle;