Integration of OCCT 6.5.0 from SVN
[occt.git] / src / BRepBuilderAPI / BRepBuilderAPI_Collect.cxx
CommitLineData
7fd59977 1// File: BRepBuilderAPI_Collect.cxx
2// Created: Tue Apr 9 10:42:18 1996
3// Author: Yves FRICAUD
4// <yfr@stylox>
5
6
7#include <BRepBuilderAPI_Collect.ixx>
8
9#include <TopoDS.hxx>
10#include <TopExp_Explorer.hxx>
11
12#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
13#include <TopTools_ListOfShape.hxx>
14#include <TopTools_ListIteratorOfListOfShape.hxx>
15#include <TopTools_DataMapOfShapeShape.hxx>
16#include <TopTools_MapOfShape.hxx>
17
18#ifdef DEB
19#include <stdio.h>
20Standard_Boolean Affich;
21#endif
22
23#ifdef DRAW
24#include <DBRep.hxx>
25#endif
26//=======================================================================
27//function : BuilBack
28//purpose :
29//=======================================================================
30
31static void BuildBack (const TopTools_DataMapOfShapeListOfShape& M1,
32 TopTools_DataMapOfShapeShape& BM1)
33{
34 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape it(M1);
35 for (; it.More(); it.Next()) {
36 const TopoDS_Shape& KS = it.Key();
37 TopTools_ListIteratorOfListOfShape itl(it.Value());
38 for ( ; itl.More(); itl.Next()) {
39 const TopoDS_Shape& VS = itl.Value();
40 BM1.Bind(VS,KS);
41 }
42 }
43}
44
45//=======================================================================
46//function : Replace
47//purpose :
48//=======================================================================
49
50static void Replace ( TopTools_ListOfShape& L,
51 const TopoDS_Shape Old,
52 const TopTools_ListOfShape& New)
53{
54 //-----------------------------------
55 // Suppression de Old dans la liste.
56 //-----------------------------------
57 TopTools_ListIteratorOfListOfShape it(L);
58 while (it.More()) {
59 if (it.Value().IsSame(Old)) {
60 L.Remove(it);
61 break;
62 }
63 if (it.More()) it.Next();
64 }
65 //---------------------------
66 // Ajout de New a L.
67 //---------------------------
68 TopTools_ListOfShape copNew;
69 copNew = New;
70 L.Append(copNew);
71}
72
73
74//=======================================================================
75//function : StoreImage
76//purpose :
77//=======================================================================
78
79static void StoreImage ( TopTools_DataMapOfShapeListOfShape& MG,
80 const TopoDS_Shape& S,
81 const TopTools_DataMapOfShapeShape& MGBack,
82 const TopTools_ListOfShape& LI)
83{
84 if (!LI.IsEmpty()) {
85 if (MGBack.IsBound(S)) {
86
87 Replace (MG.ChangeFind(MGBack(S)),S,LI);
88 }
89 else {
90 if (!MG.IsBound(S)) {
91 TopTools_ListOfShape empty;
92 MG.Bind(S,empty);
93 }
94 // Dans tous les cas on copie la liste pour eviter les pb de
95 // const& dans BRepBuilderAPI.
96 TopTools_ListIteratorOfListOfShape it;
97 for (it.Initialize(LI); it.More(); it.Next()) {
98 const TopoDS_Shape& SS = it.Value();
99 MG(S).Append(SS);
100 }
101 }
102 }
103}
104
105//=======================================================================
106//function : UpdateGen
107//purpose :
108//=======================================================================
109
110static void Update ( TopTools_DataMapOfShapeListOfShape& Mod,
111 TopTools_DataMapOfShapeListOfShape& Gen,
112 const TopTools_DataMapOfShapeShape& ModBack,
113 const TopTools_DataMapOfShapeShape& GenBack,
114 const TopoDS_Shape& SI,
115 BRepBuilderAPI_MakeShape& MKS,
116 const TopAbs_ShapeEnum ShapeType)
117{
118
119 TopTools_MapOfShape DejaVu;
120 TopExp_Explorer exp;
121
122 for (exp.Init(SI,ShapeType); exp.More(); exp.Next()) {
123 const TopoDS_Shape& S = exp.Current();
124 if (!DejaVu.Add(S)) continue;
125
126 //---------------------------------------
127 // Recuperation de l image de S par MKS.
128 //---------------------------------------
129 const TopTools_ListOfShape& LIM = MKS.Modified(S);
130 if (!LIM.IsEmpty()) {
131 if (GenBack.IsBound(S)) {
132 // Modif de generation => generation du shape initial
133 StoreImage (Gen,S,GenBack,LIM);
134 }
135 else {
136 StoreImage (Mod,S,ModBack,LIM);
137 }
138 }
139 const TopTools_ListOfShape& LIG = MKS.Generated(S);
140 if (!LIG.IsEmpty()) {
141 if (ModBack.IsBound(S)) {
142 // Generation de modif => generation du shape initial
143 TopoDS_Shape IS = ModBack(S);
144 StoreImage (Gen,IS,GenBack,LIG);
145 }
146 else {
147 StoreImage (Gen,S,GenBack,LIG);
148 }
149 }
150 }
151}
152#ifdef DEB
153//=======================================================================
154//function : DEBControl
155//purpose :
156//=======================================================================
157
158static void DEBControl (const TopTools_DataMapOfShapeListOfShape& MG)
159{
160 char name[100];
161 Standard_Integer IK = 0;
162
163 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape it(MG);
164 for (; it.More(); it.Next()) {
165 const TopoDS_Shape& OS = it.Key();
166 sprintf(name, "SK_%d",++IK);
167#ifdef DRAW
168 DBRep::Set(name,OS);
169#endif
170 TopTools_ListIteratorOfListOfShape itl(MG(OS));
171 Standard_Integer IV = 1;
172 for (; itl.More(); itl.Next()) {
173 const TopoDS_Shape& NS = itl.Value();
174 sprintf(name, "SV_%d_%d",IK,IV++);
175#ifdef DRAW
176 DBRep::Set(name,NS);
177#endif
178 }
179 }
180}
181#endif
182//=======================================================================
183//function : BRepBuilderAPI_Collect
184//purpose :
185//=======================================================================
186
187BRepBuilderAPI_Collect::BRepBuilderAPI_Collect()
188{}
189
190//=======================================================================
191//function : Add
192//purpose :
193//=======================================================================
194
195void BRepBuilderAPI_Collect::Add (const TopoDS_Shape& SI,
196 BRepBuilderAPI_MakeShape& MKS)
197
198{
199 TopTools_DataMapOfShapeShape GenBack;
200 TopTools_DataMapOfShapeShape ModBack;
201 BuildBack (myGen, GenBack); // Vraiment pas optimum a Revoir
202 BuildBack (myMod, ModBack);
203
204 Update (myMod,myGen,ModBack,GenBack,SI,MKS,TopAbs_FACE);
205 Update (myMod,myGen,ModBack,GenBack,SI,MKS,TopAbs_EDGE);
206 Update (myMod,myGen,ModBack,GenBack,SI,MKS,TopAbs_VERTEX);
207
208#ifdef DEB
209 if (Affich) {
210 DEBControl (myGen);
211 DEBControl (myMod);
212 }
213#endif
214}
215//=======================================================================
216//function : Add
217//purpose :
218//=======================================================================
219
220void BRepBuilderAPI_Collect::AddGenerated (const TopoDS_Shape& S,
221 const TopoDS_Shape& NS)
222{
223 TopTools_DataMapOfShapeShape GenBack;
224 TopTools_DataMapOfShapeShape ModBack;
225 BuildBack (myGen, GenBack);
226 BuildBack (myMod, ModBack);
227
228 TopTools_ListOfShape LIG;
229 LIG.Append(NS);
230 if (ModBack.IsBound(S)) {
231 // Generation de modif => generation du shape initial
232 TopoDS_Shape IS = ModBack(S);
233 StoreImage (myGen,IS,GenBack,LIG);
234 }
235 else {
236 StoreImage (myGen,S,GenBack,LIG);
237 }
238}
239
240//=======================================================================
241//function : Add
242//purpose :
243//=======================================================================
244
245void BRepBuilderAPI_Collect::AddModif (const TopoDS_Shape& S,
246 const TopoDS_Shape& NS)
247
248{
249 TopTools_DataMapOfShapeShape GenBack;
250 TopTools_DataMapOfShapeShape ModBack;
251 BuildBack (myGen, GenBack);
252 BuildBack (myMod, ModBack);
253
254 TopTools_ListOfShape LIG;
255 LIG.Append(NS);
256 if (GenBack.IsBound(S)) {
257 // Modif de generation => generation du shape initial
258 StoreImage (myGen,S,GenBack,LIG);
259 }
260 else {
261 StoreImage (myMod,S,ModBack,LIG);
262 }
263}
264
265
266//=======================================================================
267//function : Filter
268//purpose :
269//=======================================================================
270
271static void FilterByShape(TopTools_DataMapOfShapeListOfShape& MG,
272 const TopoDS_Shape& SF)
273{
274 TopTools_MapOfShape MSF;
275 TopExp_Explorer exp;
276 Standard_Boolean YaEdge = Standard_False;
277 Standard_Boolean YaVertex = Standard_False;
278 for (exp.Init(SF,TopAbs_FACE) ; exp.More(); exp.Next()) MSF.Add(exp.Current());
279
280 //-------------------------------------------------------------
281 // Suppression de toutes les images qui ne sont pas dans MSF.
282 //-------------------------------------------------------------
283 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape it(MG);
284 for (; it.More(); it.Next()) {
285 const TopoDS_Shape& OS = it.Key();
286 TopTools_ListOfShape& LNS = MG.ChangeFind(OS);
287 TopTools_ListIteratorOfListOfShape itl(LNS);
288 while (itl.More()) {
289 const TopoDS_Shape& NS = itl.Value();
290 //-------------------------------------------------------------------
291 // Images contiennet des edges => ajout des edges resultat dans MSF.
292 //-------------------------------------------------------------------
293 if (!YaEdge && NS.ShapeType() == TopAbs_EDGE) {
294 for (exp.Init(SF,TopAbs_EDGE) ; exp.More(); exp.Next()) {
295 MSF.Add(exp.Current());
296 }
297 YaEdge = Standard_True;
298 }
299 //-------------------------------------------------------------------
300 // Images contiennet des vertex => ajout des vertex resultat dans MSF.
301 //-------------------------------------------------------------------
302 if (!YaVertex && NS.ShapeType() == TopAbs_VERTEX) {
303 for (exp.Init(SF,TopAbs_VERTEX) ; exp.More(); exp.Next()) {
304 MSF.Add(exp.Current());
305 }
306 YaVertex = Standard_True;
307 }
308 //---------------------------------------
309 // Si pas dans MSF suprresion de l image.
310 //---------------------------------------
311 if (!MSF.Contains(NS)) {
312 LNS.Remove(itl);
313 }
314 else if (itl.More()) itl.Next();
315 }
316 }
317#ifdef DEB
318 if (Affich) {
319 DEBControl (MG);
320 }
321#endif
322
323}
324
325//=======================================================================
326//function : Modification
327//purpose :
328//=======================================================================
329
330const TopTools_DataMapOfShapeListOfShape& BRepBuilderAPI_Collect::Modification() const
331{
332 return myMod;
333}
334
335//=======================================================================
336//function : Generation
337//purpose :
338//=======================================================================
339
340const TopTools_DataMapOfShapeListOfShape& BRepBuilderAPI_Collect::Generated() const
341{
342 return myGen;
343}
344
345//=======================================================================
346//function : Filter
347//purpose :
348//=======================================================================
349
350void BRepBuilderAPI_Collect::Filter(const TopoDS_Shape& SF)
351{
352 FilterByShape (myGen,SF);
353 FilterByShape (myMod,SF);
354}
355
356
357
358
359
360