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