Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/smesh.git] / src / SMDS / SMDS_MeshNode.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
23 #include "SMDS_MeshNode.hxx"
24 #include "SMDS_SpacePosition.hxx"
25 #include "SMDS_IteratorOfElements.hxx"
26
27 using namespace std;
28
29 //=======================================================================
30 //function : SMDS_MeshNode
31 //purpose  : 
32 //=======================================================================
33
34 SMDS_MeshNode::SMDS_MeshNode(double x, double y, double z):
35         myX(x), myY(y), myZ(z),
36         myPosition(SMDS_SpacePosition::originSpacePosition())
37 {
38 }
39
40 //=======================================================================
41 //function : RemoveInverseElement
42 //purpose  : 
43 //=======================================================================
44
45 void SMDS_MeshNode::RemoveInverseElement(const SMDS_MeshElement * parent)
46 {
47         myInverseElements.erase(parent);
48 }
49
50 //=======================================================================
51 //function : Print
52 //purpose  : 
53 //=======================================================================
54
55 void SMDS_MeshNode::Print(ostream & OS) const
56 {
57         OS << "Node <" << GetID() << "> : X = " << myX << " Y = "
58                 << myY << " Z = " << myZ << endl;
59 }
60
61 //=======================================================================
62 //function : SetPosition
63 //purpose  : 
64 //=======================================================================
65
66 void SMDS_MeshNode::SetPosition(const SMDS_PositionPtr& aPos)
67 {
68         myPosition = aPos;
69 }
70
71 //=======================================================================
72 //function : GetPosition
73 //purpose  : 
74 //=======================================================================
75
76 const SMDS_PositionPtr& SMDS_MeshNode::GetPosition() const
77 {
78         return myPosition;
79 }
80
81 class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator
82 {
83   const set<const SMDS_MeshElement*>& mySet;
84   set<const SMDS_MeshElement*>::iterator myIterator;
85  public:
86   SMDS_MeshNode_MyInvIterator(const set<const SMDS_MeshElement*>& s):
87     mySet(s)
88   {
89     myIterator=mySet.begin();
90   }
91
92   bool more()
93   {
94     return myIterator!=mySet.end();
95   }
96
97   const SMDS_MeshElement* next()
98   {
99     const SMDS_MeshElement* current=*myIterator;
100     myIterator++;
101     return current;     
102   }     
103 };
104
105 SMDS_ElemIteratorPtr SMDS_MeshNode::
106         GetInverseElementIterator() const
107 {
108   return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements));
109 }
110
111 // Same as GetInverseElementIterator but the create iterator only return
112 // wanted type elements.
113 class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator
114 {
115   set<const SMDS_MeshElement*> mySet;
116   set<const SMDS_MeshElement*>::iterator myIterator;
117  public:
118   SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type,
119                            const set<const SMDS_MeshElement*>& s)
120   {
121     const SMDS_MeshElement * e;
122     bool toInsert;
123     set<const SMDS_MeshElement*>::iterator it=s.begin();
124     while(it!=s.end())
125     {
126       e=*it;
127       switch(type)
128       {
129       case SMDSAbs_Edge: toInsert=true; break;
130       case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break;
131       case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break;
132       }
133       if(toInsert) mySet.insert(e);
134       it++;
135     }
136     myIterator=mySet.begin();
137   }
138
139   bool more()
140   {
141     return myIterator!=mySet.end();
142   }
143
144   const SMDS_MeshElement* next()
145   {
146     const SMDS_MeshElement* current=*myIterator;
147     myIterator++;
148     return current;
149   }
150 };
151
152 SMDS_ElemIteratorPtr SMDS_MeshNode::
153         elementsIterator(SMDSAbs_ElementType type) const
154 {
155   if(type==SMDSAbs_Node)
156     return SMDS_MeshElement::elementsIterator(SMDSAbs_Node); 
157   else
158     return SMDS_ElemIteratorPtr
159       (new SMDS_IteratorOfElements
160        (this,type,
161         SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyIterator(type, myInverseElements))));
162 }
163
164 int SMDS_MeshNode::NbNodes() const
165 {
166         return 1;
167 }
168
169 double SMDS_MeshNode::X() const
170 {
171         return myX;
172 }
173
174 double SMDS_MeshNode::Y() const
175 {
176         return myY;
177 }
178
179 double SMDS_MeshNode::Z() const
180 {
181         return myZ;
182 }
183
184 void SMDS_MeshNode::setXYZ(double x, double y, double z)
185 {
186         myX=x;
187         myY=y;
188         myZ=z;  
189 }
190
191 SMDSAbs_ElementType SMDS_MeshNode::GetType() const
192 {
193         return SMDSAbs_Node;
194 }
195
196 //=======================================================================
197 //function : AddInverseElement
198 //purpose  :
199 //=======================================================================
200 void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME)
201 {
202         myInverseElements.insert(ME);
203 }
204
205 //=======================================================================
206 //function : ClearInverseElements
207 //purpose  :
208 //=======================================================================
209 void SMDS_MeshNode::ClearInverseElements()
210 {
211         myInverseElements.clear();
212 }
213
214 bool SMDS_MeshNode::emptyInverseElements()
215 {
216         return myInverseElements.empty();
217 }
218
219 ///////////////////////////////////////////////////////////////////////////////
220 /// To be used with STL set
221 ///////////////////////////////////////////////////////////////////////////////
222 bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2)
223 {
224         return e1.GetID()<e2.GetID();
225         /*if(e1.myX<e2.myX) return true;
226         else if(e1.myX==e2.myX)
227         {
228                 if(e1.myY<e2.myY) return true;
229                 else if(e1.myY==e2.myY) return (e1.myZ<e2.myZ);
230                 else return false;
231         }
232         else return false;*/
233 }
234