0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BRepAlgo / BRepAlgo_AsDes.cxx
1 // Created on: 1995-10-26
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <BRepAlgo_AsDes.hxx>
19 #include <Standard_ConstructionError.hxx>
20 #include <Standard_Type.hxx>
21 #include <TopoDS_Shape.hxx>
22 #include <TopTools_ListIteratorOfListOfShape.hxx>
23
24 //=======================================================================
25 //function : BRepAlgo_AsDes
26 //purpose  : 
27 //=======================================================================
28 BRepAlgo_AsDes::BRepAlgo_AsDes()
29 {
30 }
31
32
33 //=======================================================================
34 //function : Add
35 //purpose  : 
36 //=======================================================================
37
38 void BRepAlgo_AsDes::Add(const TopoDS_Shape& S, const TopoDS_Shape& SS)
39 {
40   if (!down.IsBound(S)) {
41     TopTools_ListOfShape L;
42     down.Bind(S,L);
43   }
44   down(S).Append(SS);
45
46   if (!up.IsBound(SS)) {    
47     TopTools_ListOfShape L;
48     up.Bind(SS,L);
49   }
50   up(SS).Append(S);
51 }
52
53
54 //=======================================================================
55 //function : Add
56 //purpose  : 
57 //=======================================================================
58
59 void BRepAlgo_AsDes::Add(const TopoDS_Shape& S, const TopTools_ListOfShape& SS)
60 {
61   TopTools_ListIteratorOfListOfShape it(SS);
62   for ( ; it.More(); it.Next()) {
63     Add(S,it.Value());
64   }
65 }
66
67 //=======================================================================
68 //function : Clear
69 //purpose  : 
70 //=======================================================================
71
72 void BRepAlgo_AsDes::Clear() 
73 {
74   up  .Clear();
75   down.Clear();
76 }
77
78
79 //=======================================================================
80 //function : HasAscendant
81 //purpose  : 
82 //=======================================================================
83
84 Standard_Boolean BRepAlgo_AsDes::HasAscendant(const TopoDS_Shape& S) 
85 const 
86 {
87   return up.IsBound(S);
88
89
90 //=======================================================================
91 //function : HasDescendant
92 //purpose  : 
93 //=======================================================================
94
95 Standard_Boolean BRepAlgo_AsDes::HasDescendant(const TopoDS_Shape& S) 
96 const 
97 {
98   return down.IsBound(S);
99
100
101 //=======================================================================
102 //function : Ascendant
103 //purpose  : 
104 //=======================================================================
105
106 const TopTools_ListOfShape& BRepAlgo_AsDes::Ascendant(const TopoDS_Shape& S) const 
107 {
108   if (up.IsBound(S))
109     return up(S);
110   static TopTools_ListOfShape empty;
111   return empty; 
112 }
113
114
115 //=======================================================================
116 //function : Descendant
117 //purpose  : 
118 //=======================================================================
119
120 const TopTools_ListOfShape& BRepAlgo_AsDes::Descendant(const TopoDS_Shape& S) const 
121 {
122   if (down.IsBound(S)) 
123     return down(S);
124   static TopTools_ListOfShape empty;
125   return empty;
126 }
127
128 //=======================================================================
129 //function : ChangeDescendant
130 //purpose  : 
131 //=======================================================================
132
133 TopTools_ListOfShape& BRepAlgo_AsDes::ChangeDescendant(const TopoDS_Shape& S) 
134 {
135   if (down.IsBound(S)) 
136     return down.ChangeFind(S);
137   static TopTools_ListOfShape empty;
138   return empty;
139 }
140
141 //=======================================================================
142 //function : ReplaceInList
143 //purpose  : 
144 //=======================================================================
145
146 static void ReplaceInList(const TopoDS_Shape&   OldS,
147                           const TopoDS_Shape&   NewS,
148                           TopTools_ListOfShape& L)
149 {
150   TopTools_ListIteratorOfListOfShape it(L);
151   
152   while(it.More()) {
153     if (it.Value().IsSame(OldS)) {
154       TopAbs_Orientation O = it.Value().Orientation();
155       L.InsertBefore(NewS.Oriented(O),it);
156       L.Remove(it);
157     }
158     else it.Next();
159   }
160 }
161 //=======================================================================
162 //function : RemoveInList
163 //purpose  : 
164 //=======================================================================
165
166 static void RemoveInList(const TopoDS_Shape&   S,
167                          TopTools_ListOfShape& L)
168 {
169   TopTools_ListIteratorOfListOfShape it(L);
170   while(it.More()) {
171     if (it.Value().IsSame(S)) {
172       L.Remove(it);
173       break;
174     }
175     it.Next();
176   }
177 }
178
179 //=======================================================================
180 //function : HasCommonDescendant
181 //purpose  : 
182 //=======================================================================
183
184 Standard_Boolean BRepAlgo_AsDes::HasCommonDescendant(const TopoDS_Shape& S1, 
185                                                        const TopoDS_Shape& S2, 
186                                                        TopTools_ListOfShape& LC)
187 const 
188 {
189   LC.Clear();
190   if (HasDescendant (S1) && HasDescendant (S2)) {
191     TopTools_ListIteratorOfListOfShape it1(Descendant(S1));
192     for (; it1.More(); it1.Next()) {
193       const TopoDS_Shape& DS1 = it1.Value();
194       TopTools_ListIteratorOfListOfShape it2(Ascendant(DS1));
195       for (; it2.More(); it2.Next()) {
196         const TopoDS_Shape& ADS1 = it2.Value();
197         if (ADS1.IsSame(S2)) {
198           LC.Append(DS1);
199         }
200       }
201     }
202   }
203   return (!LC.IsEmpty());
204
205
206 //=======================================================================
207 //function : BackReplace
208 //purpose  : 
209 //=======================================================================
210
211 void BRepAlgo_AsDes::BackReplace(const TopoDS_Shape&         OldS,
212                                    const TopoDS_Shape&         NewS,
213                                    const TopTools_ListOfShape& L,
214                                    const Standard_Boolean      InUp)
215 {
216   TopTools_ListIteratorOfListOfShape it(L);
217   for ( ; it.More(); it.Next()) {
218     const TopoDS_Shape& S = it.Value();
219     if (InUp) {
220       if (up.IsBound(S)) {
221         ReplaceInList(OldS,NewS,up.ChangeFind(S));
222       }
223     }
224     else {      
225       if (down.IsBound(S)) {
226         ReplaceInList(OldS,NewS,down.ChangeFind(S));
227       }
228     }
229   }
230 }
231
232 //=======================================================================
233 //function : Replace
234 //purpose  : 
235 //=======================================================================
236
237 void BRepAlgo_AsDes::Replace(const TopoDS_Shape& OldS,
238                                const TopoDS_Shape& NewS)
239 {
240   Standard_Boolean InUp;
241
242   if (up.IsBound(OldS)) {
243     InUp = Standard_False;
244     BackReplace (OldS,NewS,up(OldS),InUp);
245     if (up.IsBound(NewS)) {
246       up(NewS).Append(up(OldS));
247     }
248     else {
249       up.Bind(NewS,up(OldS));
250     }
251     up.UnBind(OldS);
252   }
253   
254   if (down.IsBound(OldS)) {
255     InUp = Standard_True;
256     BackReplace(OldS,NewS,down (OldS),InUp);
257     if (down.IsBound(NewS)) {
258       down(NewS).Append(down(OldS));
259     }
260     else {
261       down.Bind(NewS,down(OldS));
262     }
263     down.UnBind(OldS);
264   }
265 }
266
267 //=======================================================================
268 //function : Remove
269 //purpose  : 
270 //=======================================================================
271
272 void BRepAlgo_AsDes::Remove(const TopoDS_Shape& SS)
273 {
274   if (down.IsBound(SS)) {
275     Standard_ConstructionError::Raise(" BRepAlgo_AsDes::Remove");
276   }
277   if (!up.IsBound(SS)) {
278     Standard_ConstructionError::Raise(" BRepAlgo_AsDes::Remove");
279   }
280   TopTools_ListIteratorOfListOfShape it(up(SS));
281   for (; it.More(); it.Next()) {
282     RemoveInList(SS,down.ChangeFind((it.Value())));
283   }
284   up.UnBind(SS);
285 }