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
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 // +---------------------------------------------------------------------------+
13 #include <QANewModTopOpe_Limitation.ixx>
15 #include <BRep_Builder.hxx>
16 #include <TopExp_Explorer.hxx>
18 #include <TopoDS_Iterator.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>
28 static TopoDS_Shape MakeCutTool(const TopoDS_Shape& theS2)
30 TopoDS_Shape aRealCutTool, aSh;
33 aBB.MakeSolid(TopoDS::Solid(aRealCutTool));
34 aBB.MakeShell(TopoDS::Shell(aSh));
36 TopExp_Explorer anExp;
38 anExp.Init(theS2,TopAbs_FACE);
40 for(; anExp.More(); anExp.Next()) aBB.Add(aSh, anExp.Current());
41 aBB.Add(aRealCutTool, aSh);
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),
58 TopExp_Explorer anExp;
59 anExp.Init(theCutTool,TopAbs_FACE);
61 if(!anExp.More()) return;
63 myCutTool = MakeCutTool(theCutTool);
69 void QANewModTopOpe_Limitation::Cut()
74 if(myMode == QANewModTopOpe_Forward) {
76 myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
78 myResultFwd = myCut->Shape();
79 myFwdIsDone = Standard_True;
83 myShape = myResultFwd;
87 else if (myMode == QANewModTopOpe_Reversed) {
89 myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
90 if(myCommon->IsDone()) {
91 myResultRvs = myCommon->Shape();
92 myRevIsDone = Standard_True;
96 myShape = myResultRvs;
100 else if (myMode == QANewModTopOpe_BothParts) {
102 myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
103 if(myCut->IsDone()) {
104 myResultFwd = myCut->Shape();
105 myFwdIsDone = Standard_True;
110 myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
111 if(myCommon->IsDone()) {
112 myResultRvs = myCommon->Shape();
113 myRevIsDone = Standard_True;
117 if(myFwdIsDone && myRevIsDone) {
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());
125 aItr.Initialize(myResultRvs, Standard_False, Standard_False);
126 for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
133 Standard_ConstructionError::Raise("QANewModTopOpe_Limitation : wrong mode");
139 void QANewModTopOpe_Limitation::SetMode(const QANewModTopOpe_ModeOfLimitation theMode)
144 QANewModTopOpe_ModeOfLimitation QANewModTopOpe_Limitation::GetMode() const
149 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape1() const
151 return myObjectToCut;
154 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape2() const
160 //=======================================================================
161 //function : Modified
163 //=======================================================================
165 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified(const TopoDS_Shape& S)
169 if(myMode == QANewModTopOpe_Forward) {
170 myGenerated = myCut->Modified(S);
172 else if(myMode == QANewModTopOpe_Reversed) {
173 myGenerated = myCommon->Modified(S);
176 myGenerated = myCut->Modified(S);
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());
184 It.Initialize(myCommon->Modified(S));
185 for(;It.More();It.Next()) {
186 if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
193 // ================================================================================================
194 // function: Modified2
196 // ================================================================================================
197 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified2(const TopoDS_Shape& aS)
201 if(myMode == QANewModTopOpe_Forward) {
202 myGenerated = myCut->Modified2(aS);
204 else if(myMode == QANewModTopOpe_Reversed) {
205 myGenerated = myCommon->Modified2(aS);
208 myGenerated = myCut->Modified2(aS);
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());
216 It.Initialize(myCommon->Modified2(aS));
217 for(;It.More();It.Next()) {
218 if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
225 // ================================================================================================
226 // function: Generated
228 // ================================================================================================
229 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Generated(const TopoDS_Shape& S)
233 if(myMode == QANewModTopOpe_Forward) {
234 myGenerated = myCut->Generated(S);
236 else if(myMode == QANewModTopOpe_Reversed) {
237 myGenerated = myCommon->Generated(S);
240 myGenerated = myCut->Generated(S);
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());
248 It.Initialize(myCommon->Generated(S));
249 for(;It.More();It.Next()) {
250 if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
257 // ================================================================================================
258 // function: HasModified
260 // ================================================================================================
261 Standard_Boolean QANewModTopOpe_Limitation::HasModified() const
264 if(myMode == QANewModTopOpe_Forward) {
265 return myCut->HasModified();
267 else if(myMode == QANewModTopOpe_Reversed) {
268 return myCommon->HasModified();
271 return myCut->HasModified() || myCommon->HasModified();
275 // ================================================================================================
276 // function: HasGenerated
278 // ================================================================================================
279 Standard_Boolean QANewModTopOpe_Limitation::HasGenerated() const
282 if(myMode == QANewModTopOpe_Forward) {
283 return myCut->HasGenerated();
285 else if(myMode == QANewModTopOpe_Reversed) {
286 return myCommon->HasGenerated();
289 return myCut->HasGenerated() || myCommon->HasGenerated();
293 // ================================================================================================
294 // function: HasDeleted
296 // ================================================================================================
297 Standard_Boolean QANewModTopOpe_Limitation::HasDeleted() const
300 if(myMode == QANewModTopOpe_Forward) {
301 return myCut->HasDeleted();
303 else if(myMode == QANewModTopOpe_Reversed) {
304 return myCommon->HasDeleted();
307 return myCut->HasDeleted() || myCommon->HasDeleted();
311 Standard_Boolean QANewModTopOpe_Limitation::IsDeleted(const TopoDS_Shape& S)
315 if(myMode == QANewModTopOpe_Forward) {
316 return myCut->IsDeleted(S);
318 else if(myMode == QANewModTopOpe_Reversed) {
319 return myCommon->IsDeleted(S);
322 return myCut->IsDeleted(S) && myCommon->IsDeleted(S);
327 void QANewModTopOpe_Limitation::Delete()
335 // Copyright SAMTECH ..........................................Version 3.0-00
336 // Lastly modified by : skv Date : 6-05-2003
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 // +---------------------------------------------------------------------------+