0022904: Clean up sccsid variables
[occt.git] / src / QANewModTopOpe / QANewModTopOpe_Glue.cxx
1 // File:        QANewModTopOpe_Glue.cxx
2 // Created:     Fri Dec  8 17:28:08 2000
3 // Author:      Michael SAZONOV <msv@nnov.matra-dtv.fr>
4 // Copyright:    SAMTECH S.A. 2001
5
6 // Lastly modified by :
7 // +---------------------------------------------------------------------------+
8 // !       msv ! Creation                                ! 3-05-2001! 3.0-00-3!
9 // !       skv ! Add gluing Solid-Solid operation        ! 5-05-2001! 3.0-00-3!
10 // !       skv ! Adaptation to OCC version 5.0           ! 6-05-2003! 3.0-00-2!
11 // +---------------------------------------------------------------------------+
12
13
14 #include <QANewModTopOpe_Glue.ixx>
15 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
16 #include <TopoDS_Iterator.hxx>
17 #include <TopExp_Explorer.hxx>
18 #include <BRep_Builder.hxx>
19 #include <TopoDS.hxx>
20 #include <TopTools_ListIteratorOfListOfShape.hxx>
21
22 static TopoDS_Shape RemoveCompounds(const TopoDS_Shape& TheS)
23 {
24
25   if(TheS.IsNull()) return TheS;
26
27   TopAbs_ShapeEnum aType = TheS.ShapeType();
28
29   if(aType != TopAbs_COMPOUND) return TheS;
30
31   TopTools_MapOfShape aMap;
32   TopoDS_Shape aResult;
33
34   BRep_Builder aBld;
35   aBld.MakeCompound(TopoDS::Compound(aResult));
36   Standard_Integer n = 0;
37   TopExp_Explorer anExp;
38
39   anExp.Init(TheS, TopAbs_COMPSOLID);
40   for(; anExp.More(); anExp.Next()) {
41     n++;
42     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
43   }
44
45   anExp.Init(TheS, TopAbs_SOLID, TopAbs_COMPSOLID);
46   for(; anExp.More(); anExp.Next()) {
47     n++;
48     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
49   }
50
51   anExp.Init(TheS, TopAbs_SHELL, TopAbs_SOLID);
52   for(; anExp.More(); anExp.Next()) {
53     n++;
54     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
55   }
56
57   anExp.Init(TheS, TopAbs_FACE, TopAbs_SHELL);
58   for(; anExp.More(); anExp.Next()) {
59     n++;
60     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
61   }
62
63   anExp.Init(TheS, TopAbs_WIRE, TopAbs_FACE);
64   for(; anExp.More(); anExp.Next()) {
65     n++;
66     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
67   }
68
69   anExp.Init(TheS, TopAbs_EDGE, TopAbs_WIRE);
70   for(; anExp.More(); anExp.Next()) {
71     n++;
72     if(aMap.Add(anExp.Current())) aBld.Add(aResult, anExp.Current());
73   }
74
75   if(n == 1) {
76     TopoDS_Iterator anIter(aResult);
77     aResult = anIter.Value();
78   }
79
80   if(n == 0) aResult.Nullify();
81
82   return aResult;
83 }
84
85
86 //=======================================================================
87 //function : QANewModTopOpe_Glue
88 //purpose  : 
89 //=======================================================================
90 QANewModTopOpe_Glue::QANewModTopOpe_Glue(const TopoDS_Shape& theS1,
91                                const TopoDS_Shape& theS2,
92                                const Standard_Boolean theAllowCutting,
93                                const Standard_Boolean thePerformNow)
94 : BRepAlgoAPI_BooleanOperation (theS1,theS2, BOP_FUSE),
95   myAllowCutting (theAllowCutting),
96   myCompleted (Standard_False)
97 {
98   NotDone();
99   myGenerated.Clear();
100   myMapModif.Clear();
101   myMapGener.Clear();
102   if (thePerformNow)
103     Build();
104 }
105
106 //=======================================================================
107 //function : Build
108 //purpose  : 
109 //=======================================================================
110
111 void QANewModTopOpe_Glue::Build() 
112 {
113   if (myCompleted) return;
114
115   TopAbs_ShapeEnum aType1, aType2;
116   aType1 = myS1.ShapeType();
117   aType2 = myS2.ShapeType();
118
119   TopoDS_Shape aCopyS1 = myS1;
120   TopoDS_Shape aCopyS2 = myS2;
121   TopoDS_Shape aResult;
122
123   if(aType2 == TopAbs_VERTEX) {
124  
125     PerformVertex();
126
127     myCompleted = Standard_True;
128     return;
129
130   } else if (aType1 == TopAbs_VERTEX) {
131
132     myS2 = aCopyS1;
133     myS1 = aCopyS2;
134
135     PerformVertex();
136
137     myCompleted = Standard_True;
138     myS1 = aCopyS1;
139     myS2 = aCopyS2;
140     return;
141   }
142
143   Standard_Boolean aContains1 = Standard_False;
144   Standard_Boolean aContains2 = Standard_False;
145
146   TopExp_Explorer anExp(myS1, TopAbs_FACE);
147   aContains1 = anExp.More();
148   anExp.Init(myS2, TopAbs_FACE);
149   aContains2 = anExp.More();
150
151   if(aContains1 && aContains2) {
152
153     if(myS1.ShapeType() == TopAbs_FACE) {
154       BRep_Builder aBld;
155       TopoDS_Shape aCmp;
156       aBld.MakeCompound(TopoDS::Compound(aCmp));
157       aBld.Add(aCmp, myS1);
158       myS1 =  aCmp;
159     }
160     if(myS2.ShapeType() == TopAbs_FACE) {
161       BRep_Builder aBld;
162       TopoDS_Shape aCmp;
163       aBld.MakeCompound(TopoDS::Compound(aCmp));
164       aBld.Add(aCmp, myS2);
165       myS2 =  aCmp;
166     }
167
168     mySubst.Clear();
169     PerformSDFaces();
170
171     if(!myShape.IsNull()) {
172
173       TopoDS_Iterator anIter(myShape);
174       if(anIter.More()) {
175         myS1 = anIter.Value();
176         anIter.Next();
177         myS2 = anIter.Value();
178       }
179
180       aResult = myShape;
181       myShape.Nullify();
182
183     }
184     
185     mySubst.Clear();
186     PerformShell();
187  
188     if(!myShape.IsNull()) {
189
190       TopoDS_Iterator anIter(myShape);
191       if(anIter.More()) {
192         myS1 = anIter.Value();
193         anIter.Next();
194         myS2 = anIter.Value();
195       }
196
197       aResult = myShape;
198       myShape.Nullify();
199      
200     }
201     
202   }
203
204   if(aContains1 || aContains2) {
205     BRep_Builder aBld;
206     TopoDS_Shape aS1, aS2;
207     TopoDS_Shape aCpS1 = myS1, aCpS2 = myS2;
208     aBld.MakeCompound(TopoDS::Compound(aS1));
209     aBld.MakeCompound(TopoDS::Compound(aS2));
210
211     anExp.Init(myS1, TopAbs_WIRE, TopAbs_FACE);
212     for(; anExp.More(); anExp.Next()) {
213       aBld.Add(aS1, anExp.Current());
214     }
215   
216     anExp.Init(myS1, TopAbs_EDGE, TopAbs_WIRE);
217     for(; anExp.More(); anExp.Next()) {
218       aBld.Add(aS1, anExp.Current());
219     }
220
221     anExp.Init(myS2, TopAbs_WIRE, TopAbs_FACE);
222     for(; anExp.More(); anExp.Next()) {
223       aBld.Add(aS2, anExp.Current());
224     }
225   
226     anExp.Init(myS2, TopAbs_EDGE, TopAbs_WIRE);
227     for(; anExp.More(); anExp.Next()) {
228       aBld.Add(aS2, anExp.Current());
229     }
230
231     TopoDS_Iterator anIt1(aS1);
232     TopoDS_Iterator anIt2(aS2);
233
234     Standard_Boolean aShellWire = Standard_False;
235
236     if(anIt1.More() && anIt2.More()) {
237       aShellWire = Standard_True;
238       myS1 = aS1;
239       myS2 = aS2;
240       mySubst.Clear();
241
242       PerformWires();
243
244       myS1 = aCpS1;
245       myS2 = aCpS2;
246
247       if(!myShape.IsNull()) {
248         aS2 = myShape;
249         aS1.Nullify();
250         aBld.MakeCompound(TopoDS::Compound(aS1));
251       }
252       else {
253         for(; anIt1.More(); anIt1.Next()) aBld.Add(aS2, anIt1.Value());
254         aS1.Nullify();
255         aBld.MakeCompound(TopoDS::Compound(aS1));
256       }
257     }
258     else if(anIt1.More()) {
259       aShellWire = Standard_True;
260       aS2 = aS1;
261       aS1.Nullify();
262       aBld.MakeCompound(TopoDS::Compound(aS1));
263     }
264     else if(anIt2.More()) {
265       aShellWire = Standard_True;
266     }
267
268     if(aShellWire) {
269
270       if(aContains1) {
271
272         anExp.Init(myS1, TopAbs_COMPSOLID);
273         for(; anExp.More(); anExp.Next()) {
274           aBld.Add(aS1, anExp.Current());
275         }
276
277         anExp.Init(myS1, TopAbs_SOLID, TopAbs_COMPSOLID);
278         for(; anExp.More(); anExp.Next()) {
279           aBld.Add(aS1, anExp.Current());
280         }
281
282         anExp.Init(myS1, TopAbs_SHELL, TopAbs_SOLID);
283         for(; anExp.More(); anExp.Next()) {
284           aBld.Add(aS1, anExp.Current());
285         }
286
287         anExp.Init(myS1, TopAbs_FACE, TopAbs_SHELL);
288         for(; anExp.More(); anExp.Next()) {
289           aBld.Add(aS1, anExp.Current());
290         }
291
292       }
293
294       if(aContains2) {
295   
296         anExp.Init(myS2, TopAbs_COMPSOLID);
297         for(; anExp.More(); anExp.Next()) {
298           aBld.Add(aS1, anExp.Current());
299         }
300         
301         anExp.Init(myS2, TopAbs_SOLID, TopAbs_COMPSOLID);
302         for(; anExp.More(); anExp.Next()) {
303           aBld.Add(aS1, anExp.Current());
304         }
305         
306         anExp.Init(myS2, TopAbs_SHELL, TopAbs_SOLID);
307         for(; anExp.More(); anExp.Next()) {
308           aBld.Add(aS1, anExp.Current());
309         }
310
311         anExp.Init(myS2, TopAbs_FACE, TopAbs_SHELL);
312         for(; anExp.More(); anExp.Next()) {
313           aBld.Add(aS1, anExp.Current());
314         }
315
316       }
317       
318       myS1 = aS1;
319       myS2 = aS2;
320
321       mySubst.Clear();
322       PerformShellWire();
323
324       if(!myShape.IsNull()) {
325         aResult = myShape;
326       }
327       
328     }
329
330   }
331
332   if(!aContains1 && !aContains2) {
333
334     mySubst.Clear();
335     PerformWires();
336
337     if(!myShape.IsNull()) {
338       aResult = myShape;
339     }
340
341   }
342
343   myS1 = aCopyS1;
344   myS2 = aCopyS2;
345   myShape = RemoveCompounds(aResult);
346   if(myShape.IsNull()) NotDone();
347   myCompleted = Standard_True;
348 }
349
350 //=======================================================================
351 //function : Generated
352 //purpose  : 
353 //=======================================================================
354
355 const TopTools_ListOfShape&
356 QANewModTopOpe_Glue::Generated (const TopoDS_Shape& theS)
357 {
358   if (IsDone() && (myMapGener.IsBound(theS) || myMapModif.IsBound(theS))) {
359     TopTools_ListIteratorOfListOfShape anItl;
360     if(myMapGener.IsBound(theS)) anItl.Initialize(myMapGener(theS));
361     TopTools_ListIteratorOfListOfShape anItl1;
362     myGenerated.Clear();
363     Standard_Boolean aNonEmpty = Standard_False;
364     TopTools_ListOfShape aL1, aL;
365
366     for(; anItl.More(); anItl.Next()) aL.Append(anItl.Value());
367
368     TopTools_MapOfShape aMapModif;
369     anItl.Initialize(Modified(theS));
370     for(; anItl.More(); anItl.Next()) aMapModif.Add(anItl.Value());
371     myGenerated.Clear();
372
373     anItl.Initialize(myMapModif(theS));
374     for(; anItl.More(); anItl.Next()) {
375       if(!aMapModif.Contains(anItl.Value())) {
376         aL.Append(anItl.Value());
377       }
378     }
379
380     do 
381       {
382
383         aNonEmpty = Standard_False;
384         anItl.Initialize(aL);
385
386         for(; anItl.More(); anItl.Next()) {
387
388           if(myMapGener.IsBound(anItl.Value())) {
389             aNonEmpty = Standard_True;
390             anItl1.Initialize(myMapGener(anItl.Value()));
391             for(; anItl1.More(); anItl1.Next()) {
392               if(!anItl.Value().IsSame(anItl1.Value()))  aL1.Append(anItl1.Value());
393             }
394           }
395           else {
396             if(myMapModif.IsBound(anItl.Value())) {
397               aNonEmpty = Standard_True;
398               anItl1.Initialize(myMapModif(anItl.Value()));
399               for(; anItl1.More(); anItl1.Next()) {
400                 if(!anItl.Value().IsSame(anItl1.Value())) aL1.Append(anItl1.Value());
401               }
402             }
403             else {
404               if(!aMapModif.Contains(anItl.Value())) myGenerated.Append(anItl.Value());
405             }
406           }
407
408         }
409
410         if(!aL1.IsEmpty()) {
411           aL.Clear();
412           aL.Append(aL1);
413           aL1.Clear();
414         }
415         else aNonEmpty = Standard_False;
416             
417       }
418     while (aNonEmpty);
419
420     return myGenerated;
421
422   }
423
424
425   myGenerated.Clear();
426   return myGenerated;
427 }
428
429 //=======================================================================
430 //function : Modified
431 //purpose  : 
432 //=======================================================================
433
434 const TopTools_ListOfShape&
435 QANewModTopOpe_Glue::Modified (const TopoDS_Shape& theS)
436 {
437   if (IsDone() && myMapModif.IsBound(theS)) {
438     TopTools_ListIteratorOfListOfShape anItl(myMapModif(theS));
439     TopTools_ListIteratorOfListOfShape anItl1;
440     myGenerated.Clear();
441     Standard_Boolean aNonEmpty = Standard_False;
442     TopTools_ListOfShape aL1, aL;
443     for(; anItl.More(); anItl.Next()) aL.Append(anItl.Value());
444
445     myGenerated.Clear();
446
447     do 
448       {
449
450         aNonEmpty = Standard_False;
451         anItl.Initialize(aL);
452
453         for(; anItl.More(); anItl.Next()) {
454           if(myMapModif.IsBound(anItl.Value())) {
455             aNonEmpty = Standard_True;
456             anItl1.Initialize(myMapModif(anItl.Value()));
457             for(; anItl1.More(); anItl1.Next()) {
458               if(!anItl.Value().IsSame(anItl1.Value())) aL1.Append(anItl1.Value());
459             }
460           }
461           else {
462             myGenerated.Append(anItl.Value());
463           }
464         }
465
466         if(!aL1.IsEmpty()) {
467           aL.Clear();
468           aL.Append(aL1);
469           aL1.Clear();
470         }
471         else aNonEmpty = Standard_False;
472             
473       }
474     while (aNonEmpty);
475
476     return myGenerated;
477
478   }
479
480   myGenerated.Clear();
481   return myGenerated;
482 }
483
484 //=======================================================================
485 //function : IsDeleted
486 //purpose  : 
487 //=======================================================================
488
489 Standard_Boolean
490 QANewModTopOpe_Glue::IsDeleted (const TopoDS_Shape& theS)
491 {
492   if (IsDone() && myMapModif.IsBound(theS)) {
493     const TopTools_ListOfShape &aList = myMapModif.Find(theS);
494
495     if (aList.IsEmpty())
496       return Standard_True;
497
498     TopTools_ListIteratorOfListOfShape anIter(aList);
499
500     for (; anIter.More(); anIter.Next()) {
501       const TopoDS_Shape &aSplit = anIter.Value();
502
503       if (!IsDeleted(aSplit))
504         return Standard_False;
505     }
506
507     return Standard_True;
508   }
509
510   return Standard_False;
511 }
512 //=======================================================================
513 //function : HasGenerated
514 //purpose  : 
515 //=======================================================================
516
517 Standard_Boolean
518 QANewModTopOpe_Glue::HasGenerated () const
519 {
520   if (IsDone() && myMapGener.Extent() > 0)
521     return Standard_True;
522   return Standard_False;
523 }
524 //=======================================================================
525 //function : HasModified
526 //purpose  : 
527 //=======================================================================
528
529 Standard_Boolean
530 QANewModTopOpe_Glue::HasModified () const
531 {
532   
533   if (IsDone() && myMapModif.Extent() > 0) {
534     TopTools_DataMapIteratorOfDataMapOfShapeListOfShape anIter(myMapModif);
535     for(; anIter.More(); anIter.Next()) {
536       if(anIter.Value().Extent() > 0) return Standard_True;
537     }
538   }
539   return Standard_False;
540 }
541 //=======================================================================
542 //function : HasDeleted
543 //purpose  : 
544 //=======================================================================
545
546 Standard_Boolean
547 QANewModTopOpe_Glue::HasDeleted () const
548 {
549   if (IsDone() && myMapModif.Extent() > 0) {
550     TopTools_DataMapIteratorOfDataMapOfShapeListOfShape anIter(myMapModif);
551     for(; anIter.More(); anIter.Next()) {
552       if(anIter.Value().Extent() == 0) return Standard_True;
553     }
554   }
555   return Standard_False;
556 }
557
558 // @@SDM: begin
559
560 // Copyright SAMTECH ..........................................Version    3.0-00
561 // Lastly modified by : skv                                    Date :  6-05-2003
562
563 // File history synopsis (creation,modification,correction)
564 // +---------------------------------------------------------------------------+
565 // ! Developer !              Comments                   !   Date   ! Version  !
566 // +-----------!-----------------------------------------!----------!----------+
567 // !       msv ! Creation                                ! 3-05-2001! 3.0-00-3!
568 // !       skv ! Add gluing Solid-Solid operation        ! 5-05-2001! 3.0-00-3!
569 // !       skv ! Adaptation to OCC version 5.0           ! 6-05-2003! 3.0-00-2!
570 // !  vladimir ! adaptation to CAS 5.0                   !  07/01/03!    4.0-2!
571 // +---------------------------------------------------------------------------+
572 //
573 // @@SDM: end