Salome HOME
Merge from BR_V5_DEV 16Feb09
[modules/smesh.git] / src / SMDS / SMDS_MeshEdge.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 //  File   : SMDS_MeshEdge.cxx
24 //  Author : Jean-Michel BOULCOURT
25 //  Module : SMESH
26 //
27 #ifdef _MSC_VER
28 #pragma warning(disable:4786)
29 #endif
30
31 #include "SMDS_MeshEdge.hxx"
32 #include "SMDS_IteratorOfElements.hxx"
33 #include "SMDS_MeshNode.hxx"
34
35 using namespace std;
36
37 //=======================================================================
38 //function : SMDS_MeshEdge
39 //purpose  : 
40 //=======================================================================
41
42 SMDS_MeshEdge::SMDS_MeshEdge(const SMDS_MeshNode * node1,
43                              const SMDS_MeshNode * node2)
44 {       
45         myNodes[0]=node1;
46         myNodes[1]=node2;
47 }
48
49 //=======================================================================
50 //function : Print
51 //purpose  : 
52 //=======================================================================
53
54 void SMDS_MeshEdge::Print(ostream & OS) const
55 {
56         OS << "edge <" << GetID() << "> : (" << myNodes[0] << " , " << myNodes[1] <<
57                 ") " << endl;
58 }
59
60 int SMDS_MeshEdge::NbNodes() const
61 {
62         return 2;
63 }
64
65 int SMDS_MeshEdge::NbEdges() const
66 {
67         return 1;
68 }
69
70 SMDSAbs_ElementType SMDS_MeshEdge::GetType() const
71 {
72         return SMDSAbs_Edge;
73 }
74
75 class SMDS_MeshEdge_MyNodeIterator:public SMDS_ElemIterator
76 {
77   const SMDS_MeshNode *const* myNodes;
78   int myIndex;
79  public:
80   SMDS_MeshEdge_MyNodeIterator(const SMDS_MeshNode * const* nodes):
81     myNodes(nodes),myIndex(0) {}
82
83   bool more()
84   {
85     return myIndex<2;
86   }
87
88   const SMDS_MeshElement* next()
89   {
90     myIndex++;
91     return myNodes[myIndex-1];
92   }
93 };
94
95 SMDS_ElemIteratorPtr SMDS_MeshEdge::
96         elementsIterator(SMDSAbs_ElementType type) const
97 {
98   switch(type)
99   {
100   case SMDSAbs_Edge:
101     return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge); 
102   case SMDSAbs_Node:
103     return SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes));
104   default:
105     return SMDS_ElemIteratorPtr
106       (new SMDS_IteratorOfElements
107        (this,type, SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes))));
108   }
109 }
110
111 bool operator<(const SMDS_MeshEdge & e1, const SMDS_MeshEdge & e2)
112 {
113         int id11=e1.myNodes[0]->GetID();
114         int id21=e2.myNodes[0]->GetID();
115         int id12=e1.myNodes[1]->GetID();
116         int id22=e2.myNodes[1]->GetID();
117         int tmp;
118
119         if(id11>=id12) 
120         {
121                 tmp=id11;
122                 id11=id12;
123                 id12=tmp;       
124         }
125         if(id21>=id22) 
126         {
127                 tmp=id21;
128                 id21=id22;
129                 id22=tmp;       
130         }
131
132         if(id11<id21) return true;
133         else if(id11==id21) return (id21<id22);
134         else return false;
135 }
136
137 /*!
138  * \brief Return node by its index
139  * \param ind - node index
140  * \retval const SMDS_MeshNode* - the node
141  * 
142  * Index is wrapped if it is out of a valid range
143  */
144 const SMDS_MeshNode* SMDS_MeshEdge::GetNode(const int ind) const
145 {
146   return myNodes[ WrappedIndex( ind )];
147 }
148
149 //=======================================================================
150 //function : ChangeNodes
151 //purpose  : 
152 //=======================================================================
153
154 bool SMDS_MeshEdge::ChangeNodes(const SMDS_MeshNode * node1,
155                                 const SMDS_MeshNode * node2)
156 {
157   myNodes[0]=node1;
158   myNodes[1]=node2;
159   return true;
160 }
161