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