7fd59977 |
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 | |
7fd59977 |
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 |