0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BRepBuilderAPI / BRepBuilderAPI_Collect.cxx
CommitLineData
b311480e 1// Created on: 1996-04-09
2// Created by: Yves FRICAUD
3// Copyright (c) 1996-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
42cf5bc1 18#include <BRepBuilderAPI_Collect.hxx>
19#include <BRepBuilderAPI_MakeShape.hxx>
7fd59977 20#include <TopExp_Explorer.hxx>
42cf5bc1 21#include <TopoDS.hxx>
22#include <TopoDS_Shape.hxx>
7fd59977 23#include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
7fd59977 24#include <TopTools_DataMapOfShapeShape.hxx>
42cf5bc1 25#include <TopTools_ListIteratorOfListOfShape.hxx>
26#include <TopTools_ListOfShape.hxx>
7fd59977 27#include <TopTools_MapOfShape.hxx>
28
0797d9d3 29#ifdef OCCT_DEBUG
7fd59977 30#include <stdio.h>
31Standard_Boolean Affich;
32#endif
33
34#ifdef DRAW
35#include <DBRep.hxx>
36#endif
37//=======================================================================
38//function : BuilBack
39//purpose :
40//=======================================================================
41
42static 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
61static 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
90static 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
121static 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}
0797d9d3 163#ifdef OCCT_DEBUG
7fd59977 164//=======================================================================
165//function : DEBControl
166//purpose :
167//=======================================================================
168
169static 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()) {
7fd59977 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
197BRepBuilderAPI_Collect::BRepBuilderAPI_Collect()
198{}
199
200//=======================================================================
201//function : Add
202//purpose :
203//=======================================================================
204
205void 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
0797d9d3 218#ifdef OCCT_DEBUG
7fd59977 219 if (Affich) {
220 DEBControl (myGen);
221 DEBControl (myMod);
222 }
223#endif
224}
225//=======================================================================
226//function : Add
227//purpose :
228//=======================================================================
229
230void 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
255void 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
281static 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 }
0797d9d3 327#ifdef OCCT_DEBUG
7fd59977 328 if (Affich) {
329 DEBControl (MG);
330 }
331#endif
332
333}
334
335//=======================================================================
336//function : Modification
337//purpose :
338//=======================================================================
339
340const TopTools_DataMapOfShapeListOfShape& BRepBuilderAPI_Collect::Modification() const
341{
342 return myMod;
343}
344
345//=======================================================================
346//function : Generation
347//purpose :
348//=======================================================================
349
350const TopTools_DataMapOfShapeListOfShape& BRepBuilderAPI_Collect::Generated() const
351{
352 return myGen;
353}
354
355//=======================================================================
356//function : Filter
357//purpose :
358//=======================================================================
359
360void BRepBuilderAPI_Collect::Filter(const TopoDS_Shape& SF)
361{
362 FilterByShape (myGen,SF);
363 FilterByShape (myMod,SF);
364}
365
366
367
368
369
370