1 // Created on: 2001-05-06
2 // Created by: Igor FEOKTISTOV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
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>
23 #include <TopExp_Explorer.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>
31 static TopoDS_Shape MakeCutTool(const TopoDS_Shape& theS2)
33 TopoDS_Shape aRealCutTool, aSh;
36 aBB.MakeSolid(TopoDS::Solid(aRealCutTool));
37 aBB.MakeShell(TopoDS::Shell(aSh));
39 TopExp_Explorer anExp;
41 anExp.Init(theS2,TopAbs_FACE);
43 for(; anExp.More(); anExp.Next()) aBB.Add(aSh, anExp.Current());
44 aBB.Add(aRealCutTool, aSh);
50 QANewModTopOpe_Limitation::QANewModTopOpe_Limitation(const TopoDS_Shape& theObjectToCut,
51 const TopoDS_Shape& theCutTool,
52 const QANewModTopOpe_ModeOfLimitation theMode) :
53 myObjectToCut(theObjectToCut),
56 myFwdIsDone(Standard_False),
57 myRevIsDone(Standard_False),
61 TopExp_Explorer anExp;
62 anExp.Init(theCutTool,TopAbs_FACE);
64 if(!anExp.More()) return;
66 myCutTool = MakeCutTool(theCutTool);
72 void QANewModTopOpe_Limitation::Cut()
77 if(myMode == QANewModTopOpe_Forward) {
79 myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
81 myResultFwd = myCut->Shape();
82 myFwdIsDone = Standard_True;
86 myShape = myResultFwd;
90 else if (myMode == QANewModTopOpe_Reversed) {
92 myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
93 if(myCommon->IsDone()) {
94 myResultRvs = myCommon->Shape();
95 myRevIsDone = Standard_True;
99 myShape = myResultRvs;
103 else if (myMode == QANewModTopOpe_BothParts) {
105 myCut = new BRepAlgoAPI_Cut(myObjectToCut, myCutTool);
106 if(myCut->IsDone()) {
107 myResultFwd = myCut->Shape();
108 myFwdIsDone = Standard_True;
113 myCommon = new BRepAlgoAPI_Common(myObjectToCut, myCutTool);
114 if(myCommon->IsDone()) {
115 myResultRvs = myCommon->Shape();
116 myRevIsDone = Standard_True;
120 if(myFwdIsDone && myRevIsDone) {
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());
128 aItr.Initialize(myResultRvs, Standard_False, Standard_False);
129 for(; aItr.More(); aItr.Next()) aBB.Add(myShape, aItr.Value());
136 throw Standard_ConstructionError("QANewModTopOpe_Limitation : wrong mode");
142 void QANewModTopOpe_Limitation::SetMode(const QANewModTopOpe_ModeOfLimitation theMode)
147 QANewModTopOpe_ModeOfLimitation QANewModTopOpe_Limitation::GetMode() const
152 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape1() const
154 return myObjectToCut;
157 const TopoDS_Shape& QANewModTopOpe_Limitation::Shape2() const
163 //=======================================================================
164 //function : Modified
166 //=======================================================================
168 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Modified(const TopoDS_Shape& S)
172 if(myMode == QANewModTopOpe_Forward) {
173 myGenerated = myCut->Modified(S);
175 else if(myMode == QANewModTopOpe_Reversed) {
176 myGenerated = myCommon->Modified(S);
179 myGenerated = myCut->Modified(S);
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());
187 It.Initialize(myCommon->Modified(S));
188 for(;It.More();It.Next()) {
189 if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
196 // ================================================================================================
197 // function: Generated
199 // ================================================================================================
200 const TopTools_ListOfShape& QANewModTopOpe_Limitation::Generated(const TopoDS_Shape& S)
204 if(myMode == QANewModTopOpe_Forward) {
205 myGenerated = myCut->Generated(S);
207 else if(myMode == QANewModTopOpe_Reversed) {
208 myGenerated = myCommon->Generated(S);
211 myGenerated = myCut->Generated(S);
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());
219 It.Initialize(myCommon->Generated(S));
220 for(;It.More();It.Next()) {
221 if(aMap.Add(It.Value())) myGenerated.Append(It.Value());
228 // ================================================================================================
229 // function: HasModified
231 // ================================================================================================
232 Standard_Boolean QANewModTopOpe_Limitation::HasModified() const
235 if(myMode == QANewModTopOpe_Forward) {
236 return myCut->HasModified();
238 else if(myMode == QANewModTopOpe_Reversed) {
239 return myCommon->HasModified();
242 return myCut->HasModified() || myCommon->HasModified();
246 // ================================================================================================
247 // function: HasGenerated
249 // ================================================================================================
250 Standard_Boolean QANewModTopOpe_Limitation::HasGenerated() const
253 if(myMode == QANewModTopOpe_Forward) {
254 return myCut->HasGenerated();
256 else if(myMode == QANewModTopOpe_Reversed) {
257 return myCommon->HasGenerated();
260 return myCut->HasGenerated() || myCommon->HasGenerated();
264 // ================================================================================================
265 // function: HasDeleted
267 // ================================================================================================
268 Standard_Boolean QANewModTopOpe_Limitation::HasDeleted() const
271 if(myMode == QANewModTopOpe_Forward) {
272 return myCut->HasDeleted();
274 else if(myMode == QANewModTopOpe_Reversed) {
275 return myCommon->HasDeleted();
278 return myCut->HasDeleted() || myCommon->HasDeleted();
282 Standard_Boolean QANewModTopOpe_Limitation::IsDeleted(const TopoDS_Shape& S)
286 if(myMode == QANewModTopOpe_Forward) {
287 return myCut->IsDeleted(S);
289 else if(myMode == QANewModTopOpe_Reversed) {
290 return myCommon->IsDeleted(S);
293 return myCut->IsDeleted(S) && myCommon->IsDeleted(S);
298 QANewModTopOpe_Limitation::~QANewModTopOpe_Limitation()