Integration of OCCT 6.5.0 from SVN
[occt.git] / src / BRepAlgo / BRepAlgo_Image.cxx
CommitLineData
7fd59977 1// File: BRepAlgo_Image.cxx
2// Created: Thu Oct 26 15:14:48 1995
3// Author: Yves FRICAUD
4// <yfr@stylox>
5
6
7#include <BRepAlgo_Image.ixx>
8
9#include <Standard_ConstructionError.hxx>
10#include <TopTools_ListIteratorOfListOfShape.hxx>
11#include <TopTools_MapOfShape.hxx>
12#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
13#include <TopExp_Explorer.hxx>
14
15//=======================================================================
16//function : BRepAlgo_Image
17//purpose :
18//=======================================================================
19
20BRepAlgo_Image::BRepAlgo_Image()
21{
22}
23
24
25//=======================================================================
26//function : SetRoot
27//purpose :
28//=======================================================================
29
30void BRepAlgo_Image::SetRoot(const TopoDS_Shape& S)
31{
32 roots.Append(S);
33}
34
35//=======================================================================
36//function : Bind
37//purpose :
38//=======================================================================
39
40void BRepAlgo_Image::Bind(const TopoDS_Shape& OldS,
41 const TopoDS_Shape& NewS)
42{
43 if (down.IsBound(OldS)) {
44 Standard_ConstructionError::Raise(" BRepAlgo_Image::Bind");
45 return;
46 }
47 TopTools_ListOfShape L;
48 down.Bind(OldS,L);
49 down(OldS).Append(NewS);
50 up.Bind(NewS,OldS);
51}
52
53
54//=======================================================================
55//function : Bind
56//purpose :
57//=======================================================================
58
59void BRepAlgo_Image::Bind(const TopoDS_Shape& OldS,
60 const TopTools_ListOfShape& L)
61{
62 if (HasImage(OldS)) {
63 Standard_ConstructionError::Raise(" BRepAlgo_Image::Bind");
64 return;
65 }
66 TopTools_ListIteratorOfListOfShape it(L);
67 for (; it.More(); it.Next()) {
68 if (!HasImage(OldS))
69 Bind(OldS, it.Value());
70 else
71 Add (OldS, it.Value());
72 }
73}
74
75//=======================================================================
76//function : Clear
77//purpose :
78//=======================================================================
79
80void BRepAlgo_Image::Clear()
81{
82 roots.Clear();
83 up .Clear();
84 down .Clear();
85}
86
87//=======================================================================
88//function : Add
89//purpose :
90//=======================================================================
91
92void BRepAlgo_Image::Add(const TopoDS_Shape& OldS, const TopoDS_Shape& NewS)
93{
94 if (!HasImage(OldS)) {
95 Standard_ConstructionError::Raise(" BRepAlgo_Image::Add");
96 }
97 down(OldS).Append(NewS);
98 up.Bind(NewS,OldS);
99}
100
101//=======================================================================
102//function : Add
103//purpose :
104//=======================================================================
105
106void BRepAlgo_Image::Add(const TopoDS_Shape& OldS,
107 const TopTools_ListOfShape& L)
108{
109 TopTools_ListIteratorOfListOfShape it(L);
110 for (; it.More(); it.Next()) {
111 Add(OldS,it.Value());
112 }
113}
114
115
116//=======================================================================
117//function : Remove
118//purpose :
119//=======================================================================
120
121void BRepAlgo_Image::Remove(const TopoDS_Shape& S)
122{
123 if (!up.IsBound(S)) {
124 Standard_ConstructionError::Raise(" BRepAlgo_Image::Remove");
125 }
126 const TopoDS_Shape& OldS = up(S);
127 TopTools_ListOfShape& L = down(OldS);
128 TopTools_ListIteratorOfListOfShape it(L);
129 while (it.More()) {
130 if (it.Value().IsSame(S)) {
131 L.Remove(it);
132 break;
133 }
134 it.Next();
135 }
136 if (L.IsEmpty()) down.UnBind(OldS);
137 up.UnBind(S);
138}
139
140
141//=======================================================================
142//function : TopTools_ListOfShape&
143//purpose :
144//=======================================================================
145
146const TopTools_ListOfShape& BRepAlgo_Image::Roots() const
147{
148 return roots;
149}
150
151//=======================================================================
152//function : IsImage
153//purpose :
154//=======================================================================
155
156Standard_Boolean BRepAlgo_Image::IsImage(const TopoDS_Shape& S) const
157{
158 return up.IsBound(S);
159}
160
161//=======================================================================
162//function : ImageFrom
163//purpose :
164//=======================================================================
165
166const TopoDS_Shape& BRepAlgo_Image::ImageFrom(const TopoDS_Shape& S) const
167{
168 if (!up.IsBound(S)) {
169 Standard_ConstructionError::Raise(" BRepAlgo_Image::ImageFrom");
170 }
171 return up(S);
172}
173
174//=======================================================================
175//function : FirstImageFrom
176//purpose :
177//=======================================================================
178
179const TopoDS_Shape& BRepAlgo_Image::Root(const TopoDS_Shape& S)
180const
181{
182 if (!up.IsBound(S)) {
183 Standard_ConstructionError::Raise(" BRepAlgo_Image::FirstImageFrom");
184 }
185
186 TopoDS_Shape S1 = up(S);
187 TopoDS_Shape S2 = S;
188
189 if ( S1.IsSame(S2))
190 return up(S);
191
192 while ( up.IsBound(S1)) {
193 S2 = S1;
194 S1 = up(S1);
195 if ( S1.IsSame(S2)) break;
196 }
197 return up(S2);
198}
199
200//=======================================================================
201//function : HasImage
202//purpose :
203//=======================================================================
204
205Standard_Boolean BRepAlgo_Image::HasImage(const TopoDS_Shape& S) const
206{
207 return down.IsBound(S);
208}
209
210//=======================================================================
211//function : TopTools_ListOfShape&
212//purpose :
213//=======================================================================
214
215const TopTools_ListOfShape& BRepAlgo_Image::Image(const TopoDS_Shape& S) const
216{
217 if (!HasImage(S)) {
218 static TopTools_ListOfShape L;
219 L.Append(S);
220 return L;
221 }
222 return down(S);
223}
224
225
226//=======================================================================
227//function : TopTools_ListOfShape&
228//purpose :
229//=======================================================================
230void BRepAlgo_Image::LastImage(const TopoDS_Shape& S,
231 TopTools_ListOfShape& L) const
232{
233 if (!down.IsBound(S)) {
234 L.Append(S);
235 }
236 else {
237 TopTools_ListIteratorOfListOfShape it(down(S));
238 for (; it.More(); it.Next()) {
239 if (it.Value().IsSame(S)) {
240 L.Append(S);
241 }
242 else {
243 LastImage(it.Value(),L);
244 }
245 }
246 }
247}
248
249
250//=======================================================================
251//function : Compact
252//purpose :
253//=======================================================================
254
255void BRepAlgo_Image::Compact()
256{
257 TopTools_DataMapOfShapeListOfShape M;
258 TopTools_ListIteratorOfListOfShape it(roots);
259 for (; it.More(); it.Next()) {
260 const TopoDS_Shape& S = it.Value();
261 TopTools_ListOfShape LI;
262 if (HasImage(S)) LastImage(S,LI);
263 M.Bind (S,LI);
264 }
265 up.Clear();
266 down.Clear();
267 for (it.Initialize(roots); it.More(); it.Next()) {
268 if (M.IsBound(it.Value())) {
269 Bind(it.Value(), M(it.Value()));
270 }
271 }
272}
273
274//=======================================================================
275//function : Filter
276//purpose :
277//=======================================================================
278
279void BRepAlgo_Image::Filter(const TopoDS_Shape& S,
280 const TopAbs_ShapeEnum T)
281
282{
283 TopExp_Explorer exp(S,T) ;
284 TopTools_MapOfShape M;
285 for (; exp.More(); exp.Next()) {M.Add(exp.Current());}
286 Standard_Boolean Change = Standard_True;
287 while (Change) {
288 Change = Standard_False;
289 TopTools_DataMapIteratorOfDataMapOfShapeShape mit(up);
290 for (; mit.More(); mit.Next()) {
291 const TopoDS_Shape& S = mit.Key();
292 if (S.ShapeType() == T && !M.Contains(S)) {
293 Remove(S);
294 Change = Standard_True;
295 break;
296 }
297 }
298 }
299
300}
301