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