0022627: Change OCCT memory management defaults
[occt.git] / src / QANewModTopOpe / QANewModTopOpe_Limitation.cxx
CommitLineData
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
28static 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
47QANewModTopOpe_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
69void 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
139void QANewModTopOpe_Limitation::SetMode(const QANewModTopOpe_ModeOfLimitation theMode)
140{
141 myMode = theMode;
142}
143
144QANewModTopOpe_ModeOfLimitation QANewModTopOpe_Limitation::GetMode() const
145{
146 return myMode;
147}
148
149const TopoDS_Shape& QANewModTopOpe_Limitation::Shape1() const
150{
151 return myObjectToCut;
152}
153
154const TopoDS_Shape& QANewModTopOpe_Limitation::Shape2() const
155{
156 return myCutTool;
157}
158
159
160//=======================================================================
161//function : Modified
162//purpose :
163//=======================================================================
164
165const 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// ================================================================================================
197const 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// ================================================================================================
229const 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// ================================================================================================
261Standard_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// ================================================================================================
279Standard_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// ================================================================================================
297Standard_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
311Standard_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
327void 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