0028579: Get rid of the obsolete QANewModTopOpe_* and QANewBRepNaming_* algorithms
[occt.git] / src / QANewModTopOpe / QANewModTopOpe_Limitation.cxx
1 // Created on: 2001-05-06
2 // Created by: Igor FEOKTISTOV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <BRep_Builder.hxx>
18 #include <BRepAlgoAPI_Common.hxx>
19 #include <BRepAlgoAPI_Cut.hxx>
20 #include <QANewModTopOpe_Limitation.hxx>
21 #include <Standard_ConstructionError.hxx>
22 #include <TopAbs.hxx>
23 #include <TopExp_Explorer.hxx>
24 #include <TopoDS.hxx>
25 #include <TopoDS_Iterator.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <TopTools_ListIteratorOfListOfShape.hxx>
28 #include <TopTools_ListOfShape.hxx>
29 #include <TopTools_MapOfShape.hxx>
30
31 static TopoDS_Shape MakeCutTool(const TopoDS_Shape& theS2)
32 {
33   TopoDS_Shape aRealCutTool, aSh;
34   BRep_Builder aBB;
35
36   aBB.MakeSolid(TopoDS::Solid(aRealCutTool));
37   aBB.MakeShell(TopoDS::Shell(aSh));
38
39   TopExp_Explorer anExp;
40
41   anExp.Init(theS2,TopAbs_FACE);
42
43   for(; anExp.More(); anExp.Next()) aBB.Add(aSh, anExp.Current());
44   aBB.Add(aRealCutTool, aSh);
45
46   return aRealCutTool;
47 }
48
49
50 QANewModTopOpe_Limitation::QANewModTopOpe_Limitation(const TopoDS_Shape& theObjectToCut,
51                                            const TopoDS_Shape& theCutTool,
52                                            const QANewModTopOpe_ModeOfLimitation theMode) : 
53        myObjectToCut(theObjectToCut),
54            myCut(NULL),
55            myCommon(NULL),
56        myFwdIsDone(Standard_False),
57        myRevIsDone(Standard_False),
58        myMode(theMode)       
59 {
60
61   TopExp_Explorer anExp;
62   anExp.Init(theCutTool,TopAbs_FACE);
63
64   if(!anExp.More()) return;
65
66   myCutTool = MakeCutTool(theCutTool);
67
68   Cut();
69
70 }
71
72 void QANewModTopOpe_Limitation::Cut() 
73 {
74
75   NotDone();
76
77   if(myMode == QANewModTopOpe_Forward) {
78     if(!myFwdIsDone) {
79       myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
80       if(myCut->IsDone()) {
81         myResultFwd = myCut->Shape();
82         myFwdIsDone = Standard_True;
83       }
84     }
85     if(myFwdIsDone) {
86       myShape = myResultFwd;
87       Done();
88     }
89   }
90   else if (myMode == QANewModTopOpe_Reversed) {
91     if(!myRevIsDone) {
92       myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
93       if(myCommon->IsDone()) {
94         myResultRvs = myCommon->Shape();
95         myRevIsDone = Standard_True;
96       }
97     }
98     if(myRevIsDone) {
99       myShape = myResultRvs;
100       Done();
101     }
102   }
103   else if (myMode == QANewModTopOpe_BothParts) {
104     if(!myFwdIsDone) {
105       myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
106       if(myCut->IsDone()) {
107         myResultFwd = myCut->Shape();
108         myFwdIsDone = Standard_True;
109       }
110     }
111
112     if(!myRevIsDone) {
113       myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
114       if(myCommon->IsDone()) {
115         myResultRvs = myCommon->Shape();
116         myRevIsDone = Standard_True;
117       }
118     }
119
120     if(myFwdIsDone && myRevIsDone) {
121       myShape.Nullify();
122       BRep_Builder aBB;
123       aBB.MakeCompound(TopoDS::Compound(myShape));
124       TopoDS_Iterator aItr;
125       aItr.Initialize(myResultFwd, Standard_False, Standard_False);
126       for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
127
128       aItr.Initialize(myResultRvs, Standard_False, Standard_False);
129       for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
130
131       Done();
132     }
133     
134   }
135   else {
136     throw Standard_ConstructionError("QANewModTopOpe_Limitation : wrong mode");
137   }
138
139
140 }
141
142 void QANewModTopOpe_Limitation::SetMode(const QANewModTopOpe_ModeOfLimitation theMode)
143 {
144   myMode = theMode;
145 }
146
147 QANewModTopOpe_ModeOfLimitation  QANewModTopOpe_Limitation::GetMode() const
148 {
149   return myMode;
150 }
151
152 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape1() const 
153 {
154   return myObjectToCut;
155 }
156
157 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape2() const 
158 {
159   return myCutTool;
160 }
161
162
163 //=======================================================================
164 //function : Modified
165 //purpose  : 
166 //=======================================================================
167
168 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified(const TopoDS_Shape& S) 
169 {
170   Check();
171   myGenerated.Clear();
172   if(myMode == QANewModTopOpe_Forward) {
173     myGenerated = myCut->Modified(S);
174   }
175   else if(myMode == QANewModTopOpe_Reversed) {
176     myGenerated = myCommon->Modified(S);
177   }
178   else {
179     myGenerated = myCut->Modified(S);
180
181     TopTools_MapOfShape aMap; // to check if shape can be added in list more then one time
182     TopTools_ListIteratorOfListOfShape It(myGenerated);
183     for(;It.More();It.Next()) {
184       aMap.Add(It.Value());
185     }
186     
187     It.Initialize(myCommon->Modified(S));
188     for(;It.More();It.Next()) {
189       if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
190     }
191   }
192
193   return myGenerated;
194 }
195
196 // ================================================================================================
197 // function: Generated
198 // purpose:
199 // ================================================================================================
200 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Generated(const TopoDS_Shape& S) 
201 {
202   Check();
203   myGenerated.Clear();
204   if(myMode == QANewModTopOpe_Forward) {
205     myGenerated = myCut->Generated(S);
206   }
207   else if(myMode == QANewModTopOpe_Reversed) {
208     myGenerated = myCommon->Generated(S);
209   }
210   else {
211     myGenerated = myCut->Generated(S);
212
213     TopTools_MapOfShape aMap; // to check if shape can be added in list more then one time
214     TopTools_ListIteratorOfListOfShape It(myGenerated);
215     for(;It.More();It.Next()) {
216       aMap.Add(It.Value());
217     }
218     
219     It.Initialize(myCommon->Generated(S));
220     for(;It.More();It.Next()) {
221       if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
222     }
223   }
224
225   return myGenerated;
226 }
227
228 // ================================================================================================
229 // function: HasModified
230 // purpose:
231 // ================================================================================================
232 Standard_Boolean QANewModTopOpe_Limitation::HasModified() const
233 {
234   Check();
235   if(myMode == QANewModTopOpe_Forward) {
236     return myCut->HasModified();
237   }
238   else if(myMode == QANewModTopOpe_Reversed) {
239     return myCommon->HasModified();
240   }
241   else {
242     return myCut->HasModified() || myCommon->HasModified();
243   }
244 }
245
246 // ================================================================================================
247 // function: HasGenerated
248 // purpose:
249 // ================================================================================================
250 Standard_Boolean QANewModTopOpe_Limitation::HasGenerated() const
251 {
252   Check();
253   if(myMode == QANewModTopOpe_Forward) {
254     return myCut->HasGenerated();
255   }
256   else if(myMode == QANewModTopOpe_Reversed) {
257     return myCommon->HasGenerated();
258   }
259   else {
260     return myCut->HasGenerated() || myCommon->HasGenerated();
261   }
262 }
263
264 // ================================================================================================
265 // function: HasDeleted
266 // purpose:
267 // ================================================================================================
268 Standard_Boolean QANewModTopOpe_Limitation::HasDeleted() const
269 {
270   Check();
271   if(myMode == QANewModTopOpe_Forward) {
272     return myCut->HasDeleted();
273   }
274   else if(myMode == QANewModTopOpe_Reversed) {
275     return myCommon->HasDeleted();
276   }
277   else {
278     return myCut->HasDeleted() || myCommon->HasDeleted();
279   }
280 }
281
282 Standard_Boolean QANewModTopOpe_Limitation::IsDeleted(const TopoDS_Shape& S) 
283 {
284
285   Check();
286   if(myMode == QANewModTopOpe_Forward) {
287     return myCut->IsDeleted(S);
288   }
289   else if(myMode == QANewModTopOpe_Reversed) {
290     return myCommon->IsDeleted(S);
291   }
292   else {
293     return myCut->IsDeleted(S) && myCommon->IsDeleted(S);
294   }
295
296 }
297
298 QANewModTopOpe_Limitation::~QANewModTopOpe_Limitation()
299 {
300   delete myCut;
301   delete myCommon;
302 }