0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BOPAlgo / BOPAlgo_Builder_4.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2014 OPEN CASCADE SAS
3 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
4 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
5 //                         EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 //
7 // This file is part of Open CASCADE Technology software library.
8 //
9 // This library is free software; you can redistribute it and/or modify it under
10 // the terms of the GNU Lesser General Public License version 2.1 as published
11 // by the Free Software Foundation, with special exception defined in the file
12 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
13 // distribution for complete text of the license and disclaimer of any warranty.
14 //
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
17
18
19 #include <BOPAlgo_Builder.hxx>
20 #include <BOPAlgo_PaveFiller.hxx>
21 #include <BOPCol_ListOfShape.hxx>
22 #include <BOPCol_MapOfShape.hxx>
23 #include <BOPDS_DS.hxx>
24 #include <BOPTools.hxx>
25 #include <BOPTools_AlgoTools.hxx>
26 #include <IntTools_Context.hxx>
27 #include <TopoDS_Iterator.hxx>
28 #include <TopoDS_Shape.hxx>
29
30 //=======================================================================
31 //function : Generated
32 //purpose  : 
33 //=======================================================================
34 const TopTools_ListOfShape& BOPAlgo_Builder::Generated
35   (const TopoDS_Shape&)
36 {
37   myHistShapes.Clear();
38   return myHistShapes;
39 }
40 //=======================================================================
41 //function : Modified
42 //purpose  : 
43 //=======================================================================
44 const TopTools_ListOfShape& BOPAlgo_Builder::Modified
45   (const TopoDS_Shape& theS)
46 {
47   Standard_Boolean bHasImage, bToReverse;
48   TopAbs_ShapeEnum aType;
49   BOPCol_ListIteratorOfListOfShape aIt;
50   //
51   myHistShapes.Clear();
52   //
53   if (theS.IsNull()) {
54     return myHistShapes;
55   }
56   //
57   bHasImage=myImages.IsBound(theS);
58   if (!bHasImage) {
59     return myHistShapes;
60   }
61   //
62   aType=theS.ShapeType();
63   //
64   if (!(aType==TopAbs_EDGE   || aType==TopAbs_FACE || 
65       aType==TopAbs_VERTEX || aType==TopAbs_SOLID)) {
66     return myHistShapes;
67   } 
68   //
69   //PrepareHistory();
70   //
71   const BOPCol_ListOfShape& aLSp=myImages.Find(theS);
72   aIt.Initialize(aLSp);
73   for (; aIt.More(); aIt.Next()) {
74     TopoDS_Shape aSp=aIt.Value();
75     if (myShapesSD.IsBound(aSp)) {
76       aSp = myShapesSD.Find(aSp);
77     }
78     //
79     if (myMapShape.Contains(aSp)) {
80       //
81       if (aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
82         aSp.Orientation(theS.Orientation());
83       }
84       else {
85         bToReverse=
86           BOPTools_AlgoTools::IsSplitToReverse(aSp, theS, myContext);
87         if (bToReverse) {
88           aSp.Reverse();
89         }
90       }
91       //
92       myHistShapes.Append(aSp);
93     }
94   }
95   //
96   return myHistShapes;
97 }
98 //=======================================================================
99 //function : IsDeleted
100 //purpose  : 
101 //=======================================================================
102 Standard_Boolean BOPAlgo_Builder::IsDeleted
103   (const TopoDS_Shape& theS)
104 {
105   Standard_Boolean bRet;
106   TopAbs_ShapeEnum aType;
107   BOPCol_ListIteratorOfListOfShape aIt;
108   //
109   bRet = Standard_True;
110   //
111   if (theS.IsNull()) {
112     return bRet;
113   }
114   //
115   aType = theS.ShapeType();
116   if (!(aType==TopAbs_EDGE || aType==TopAbs_FACE || 
117       aType==TopAbs_VERTEX || aType==TopAbs_SOLID)) {
118     return bRet;
119   }
120   //
121   if (!myImages.IsBound(theS)) {
122     bRet = !myMapShape.Contains(theS);
123     return bRet;
124   }
125   //
126   const BOPCol_ListOfShape& aLSp = myImages.Find(theS);
127   aIt.Initialize(aLSp);
128   for (; aIt.More(); aIt.Next()) {
129     const TopoDS_Shape& aSp = aIt.Value();
130     const TopoDS_Shape& aSpR = myShapesSD.IsBound(aSp) ? 
131       myShapesSD.Find(aSp) : aSp;
132     //
133     if (myMapShape.Contains(aSpR)) {                   
134       bRet = Standard_False;
135       break;
136     }
137   }
138   //
139   return bRet;
140 }
141 //=======================================================================
142 //function : PrepareHistory
143 //purpose  : 
144 //=======================================================================
145 void BOPAlgo_Builder::PrepareHistory()
146 {
147   if (!myFlagHistory) {
148     return;
149   }
150   //
151   if(myShape.IsNull()) {
152     return;
153   }
154   //
155   Standard_Boolean bHasImage;
156   TopAbs_ShapeEnum aType;
157   BOPCol_MapOfShape aMS;
158   BOPCol_ListIteratorOfListOfShape aIt;
159   BOPCol_MapIteratorOfMapOfShape aItM;
160   //
161   // 1. Clearing 
162   BOPAlgo_BuilderShape::PrepareHistory();
163   //
164   // 2. myMapShape - all shapes of result with theirs sub-shapes 
165   BOPTools::MapShapes(myShape, myMapShape);
166   //
167   // 3. MS - all argument shapes with theirs sub-shapes
168   const BOPCol_ListOfShape& aArguments=myDS->Arguments();
169   aIt.Initialize(aArguments);
170   for (; aIt.More(); aIt.Next()) {
171     const TopoDS_Shape& aSx=aIt.Value();
172     BOPTools::MapShapes(aSx, aMS);
173   }
174   //
175   // 4. Treatment
176   aItM.Initialize(aMS);
177   for (; aItM.More(); aItM.Next()) {
178     const TopoDS_Shape& aSx=aItM.Key();
179     aType=aSx.ShapeType();
180     //
181     // 4.1 .myImagesResult
182     bHasImage=myImages.IsBound(aSx); 
183     //
184     BOPCol_ListOfShape aLSx;
185     if (!bHasImage) {
186       if (myMapShape.Contains(aSx)) {
187         aLSx.Append(aSx);
188         myImagesResult.Add(aSx, aLSx);
189       }
190     }
191     else {
192       const BOPCol_ListOfShape& aLSp=myImages.Find(aSx);
193       aIt.Initialize(aLSp);
194       for (; aIt.More(); aIt.Next()) {
195         const TopoDS_Shape& aSp=aIt.Value();
196         if (myMapShape.Contains(aSp)) {
197           aLSx.Append(aSp);
198         }
199       }
200       myImagesResult.Add(aSx, aLSx);
201     }
202     // <- A
203     //
204     // 4.2 As it was 
205     if (!myHasDeleted) {
206       myHasDeleted=IsDeleted(aSx);
207     }
208     //
209     if (!myHasModified && bHasImage) {
210       if (aType==TopAbs_EDGE   || aType==TopAbs_FACE || 
211           aType==TopAbs_VERTEX || aType==TopAbs_SOLID) {
212         myHasModified = Standard_True;
213       } 
214     }
215     //
216     if (!myHasGenerated) {
217       if (aType==TopAbs_FACE) {
218         const TopTools_ListOfShape& aLG = Generated(aSx);
219         myHasGenerated = aLG.Extent() > 0;
220       }
221     }
222   }
223   myFlagHistory=Standard_True;
224 }