Integration of OCCT 6.5.0 from SVN
[occt.git] / src / QANewModTopOpe / QANewModTopOpe_Limitation.cxx
1 // File:        QANewModTopOpe_Limitation.cxx
2 // Created:     Sat May  6 14:24:19 2001
3 // Author:      Igor FEOKTISTOV <ifv@nnov.matra-dtv.fr>
4 // Copyright:    SAMTECH S.A. 2000
5
6 const static char sccsid[] = "@(#) QANewModTopOpe_Limitation.cxx 4.0-2, 07/01/03@(#)";
7
8 // Lastly modified by :
9 // +---------------------------------------------------------------------------+
10 // !       ifv ! Creation                                ! 6-05-2001! 3.0-00-3!
11 // !       skv ! Adaptation to OCC version 5.0           ! 6-05-2003! 3.0-00-2!
12 // +---------------------------------------------------------------------------+
13
14
15 #include <QANewModTopOpe_Limitation.ixx>
16
17 #include <BRep_Builder.hxx>
18 #include <TopExp_Explorer.hxx>
19 #include <TopoDS.hxx>
20 #include <TopoDS_Iterator.hxx>
21 #include <TopAbs.hxx>
22 #include <TopTools_ListOfShape.hxx>
23 #include <BRepAlgoAPI_Cut.hxx>
24 #include <BRepAlgoAPI_Common.hxx>
25 #include <TopTools_ListIteratorOfListOfShape.hxx>
26 #include <Standard_ConstructionError.hxx>
27 #include <TopTools_MapOfShape.hxx>
28
29
30 static TopoDS_Shape MakeCutTool(const TopoDS_Shape& theS2)
31 {
32   TopoDS_Shape aRealCutTool, aSh;
33   BRep_Builder aBB;
34
35   aBB.MakeSolid(TopoDS::Solid(aRealCutTool));
36   aBB.MakeShell(TopoDS::Shell(aSh));
37
38   TopExp_Explorer anExp;
39
40   anExp.Init(theS2,TopAbs_FACE);
41
42   for(; anExp.More(); anExp.Next()) aBB.Add(aSh, anExp.Current());
43   aBB.Add(aRealCutTool, aSh);
44
45   return aRealCutTool;
46 }
47
48
49 QANewModTopOpe_Limitation::QANewModTopOpe_Limitation(const TopoDS_Shape& theObjectToCut,
50                                            const TopoDS_Shape& theCutTool,
51                                            const QANewModTopOpe_ModeOfLimitation theMode) : 
52        myObjectToCut(theObjectToCut),
53        myFwdIsDone(Standard_False),
54        myRevIsDone(Standard_False),
55        myMode(theMode),
56        myCut(NULL),
57        myCommon(NULL)
58 {
59
60   TopExp_Explorer anExp;
61   anExp.Init(theCutTool,TopAbs_FACE);
62
63   if(!anExp.More()) return;
64
65   myCutTool = MakeCutTool(theCutTool);
66
67   Cut();
68
69 }
70
71 void QANewModTopOpe_Limitation::Cut() 
72 {
73
74   NotDone();
75
76   if(myMode == QANewModTopOpe_Forward) {
77     if(!myFwdIsDone) {
78       myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
79       if(myCut->IsDone()) {
80         myResultFwd = myCut->Shape();
81         myFwdIsDone = Standard_True;
82       }
83     }
84     if(myFwdIsDone) {
85       myShape = myResultFwd;
86       Done();
87     }
88   }
89   else if (myMode == QANewModTopOpe_Reversed) {
90     if(!myRevIsDone) {
91       myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
92       if(myCommon->IsDone()) {
93         myResultRvs = myCommon->Shape();
94         myRevIsDone = Standard_True;
95       }
96     }
97     if(myRevIsDone) {
98       myShape = myResultRvs;
99       Done();
100     }
101   }
102   else if (myMode == QANewModTopOpe_BothParts) {
103     if(!myFwdIsDone) {
104       myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
105       if(myCut->IsDone()) {
106         myResultFwd = myCut->Shape();
107         myFwdIsDone = Standard_True;
108       }
109     }
110
111     if(!myRevIsDone) {
112       myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
113       if(myCommon->IsDone()) {
114         myResultRvs = myCommon->Shape();
115         myRevIsDone = Standard_True;
116       }
117     }
118
119     if(myFwdIsDone && myRevIsDone) {
120       myShape.Nullify();
121       BRep_Builder aBB;
122       aBB.MakeCompound(TopoDS::Compound(myShape));
123       TopoDS_Iterator aItr;
124       aItr.Initialize(myResultFwd, Standard_False, Standard_False);
125       for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
126
127       aItr.Initialize(myResultRvs, Standard_False, Standard_False);
128       for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
129
130       Done();
131     }
132     
133   }
134   else {
135     Standard_ConstructionError::Raise("QANewModTopOpe_Limitation : wrong mode");
136   }
137
138
139 }
140
141 void QANewModTopOpe_Limitation::SetMode(const QANewModTopOpe_ModeOfLimitation theMode)
142 {
143   myMode = theMode;
144 }
145
146 QANewModTopOpe_ModeOfLimitation  QANewModTopOpe_Limitation::GetMode() const
147 {
148   return myMode;
149 }
150
151 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape1() const 
152 {
153   return myObjectToCut;
154 }
155
156 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape2() const 
157 {
158   return myCutTool;
159 }
160
161
162 //=======================================================================
163 //function : Modified
164 //purpose  : 
165 //=======================================================================
166
167 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified(const TopoDS_Shape& S) 
168 {
169   Check();
170   myGenerated.Clear();
171   if(myMode == QANewModTopOpe_Forward) {
172     myGenerated = myCut->Modified(S);
173   }
174   else if(myMode == QANewModTopOpe_Reversed) {
175     myGenerated = myCommon->Modified(S);
176   }
177   else {
178     myGenerated = myCut->Modified(S);
179
180     TopTools_MapOfShape aMap; // to check if shape can be added in list more then one time
181     TopTools_ListIteratorOfListOfShape It(myGenerated);
182     for(;It.More();It.Next()) {
183       aMap.Add(It.Value());
184     }
185     
186     It.Initialize(myCommon->Modified(S));
187     for(;It.More();It.Next()) {
188       if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
189     }
190   }
191
192   return myGenerated;
193 }
194
195 // ================================================================================================
196 // function: Modified2
197 // purpose:
198 // ================================================================================================
199 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified2(const TopoDS_Shape& aS) 
200 {
201   Check();
202   myGenerated.Clear();
203   if(myMode == QANewModTopOpe_Forward) {
204     myGenerated = myCut->Modified2(aS);
205   }
206   else if(myMode == QANewModTopOpe_Reversed) {
207     myGenerated = myCommon->Modified2(aS);
208   }
209   else {
210     myGenerated = myCut->Modified2(aS);
211
212     TopTools_MapOfShape aMap; // to check if shape can be added in list more then one time
213     TopTools_ListIteratorOfListOfShape It(myGenerated);
214     for(;It.More();It.Next()) {
215       aMap.Add(It.Value());
216     }
217     
218     It.Initialize(myCommon->Modified2(aS));
219     for(;It.More();It.Next()) {
220       if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
221     }
222   }
223
224   return myGenerated;
225 }
226
227 // ================================================================================================
228 // function: Generated
229 // purpose:
230 // ================================================================================================
231 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Generated(const TopoDS_Shape& S) 
232 {
233   Check();
234   myGenerated.Clear();
235   if(myMode == QANewModTopOpe_Forward) {
236     myGenerated = myCut->Generated(S);
237   }
238   else if(myMode == QANewModTopOpe_Reversed) {
239     myGenerated = myCommon->Generated(S);
240   }
241   else {
242     myGenerated = myCut->Generated(S);
243
244     TopTools_MapOfShape aMap; // to check if shape can be added in list more then one time
245     TopTools_ListIteratorOfListOfShape It(myGenerated);
246     for(;It.More();It.Next()) {
247       aMap.Add(It.Value());
248     }
249     
250     It.Initialize(myCommon->Generated(S));
251     for(;It.More();It.Next()) {
252       if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
253     }
254   }
255
256   return myGenerated;
257 }
258
259 // ================================================================================================
260 // function: HasModified
261 // purpose:
262 // ================================================================================================
263 Standard_Boolean QANewModTopOpe_Limitation::HasModified() const
264 {
265   Check();
266   if(myMode == QANewModTopOpe_Forward) {
267     return myCut->HasModified();
268   }
269   else if(myMode == QANewModTopOpe_Reversed) {
270     return myCommon->HasModified();
271   }
272   else {
273     return myCut->HasModified() || myCommon->HasModified();
274   }
275 }
276
277 // ================================================================================================
278 // function: HasGenerated
279 // purpose:
280 // ================================================================================================
281 Standard_Boolean QANewModTopOpe_Limitation::HasGenerated() const
282 {
283   Check();
284   if(myMode == QANewModTopOpe_Forward) {
285     return myCut->HasGenerated();
286   }
287   else if(myMode == QANewModTopOpe_Reversed) {
288     return myCommon->HasGenerated();
289   }
290   else {
291     return myCut->HasGenerated() || myCommon->HasGenerated();
292   }
293 }
294
295 // ================================================================================================
296 // function: HasDeleted
297 // purpose:
298 // ================================================================================================
299 Standard_Boolean QANewModTopOpe_Limitation::HasDeleted() const
300 {
301   Check();
302   if(myMode == QANewModTopOpe_Forward) {
303     return myCut->HasDeleted();
304   }
305   else if(myMode == QANewModTopOpe_Reversed) {
306     return myCommon->HasDeleted();
307   }
308   else {
309     return myCut->HasDeleted() || myCommon->HasDeleted();
310   }
311 }
312
313 Standard_Boolean QANewModTopOpe_Limitation::IsDeleted(const TopoDS_Shape& S) 
314 {
315
316   Check();
317   if(myMode == QANewModTopOpe_Forward) {
318     return myCut->IsDeleted(S);
319   }
320   else if(myMode == QANewModTopOpe_Reversed) {
321     return myCommon->IsDeleted(S);
322   }
323   else {
324     return myCut->IsDeleted(S) && myCommon->IsDeleted(S);
325   }
326
327 }
328
329 void QANewModTopOpe_Limitation::Delete()
330 {
331   delete myCut;
332   delete myCommon;
333 }
334
335 // @@SDM: begin
336
337 // Copyright SAMTECH ..........................................Version    3.0-00
338 // Lastly modified by : skv                                    Date :  6-05-2003
339
340 // File history synopsis (creation,modification,correction)
341 // +---------------------------------------------------------------------------+
342 // ! Developer !              Comments                   !   Date   ! Version  !
343 // +-----------!-----------------------------------------!----------!----------+
344 // !       ifv ! Creation                                ! 6-05-2001! 3.0-00-3!
345 // !       skv ! Adaptation to OCC version 5.0           ! 6-05-2003! 3.0-00-2!
346 // !  vladimir ! adaptation to CAS 5.0                   !  07/01/03!    4.0-2!
347 // +---------------------------------------------------------------------------+
348 //
349 // @@SDM: end