0026874: Implementation of the Partition operator in OCCT
[occt.git] / src / BRepAlgoAPI / BRepAlgoAPI_Splitter.cxx
1 // Created by: Eugeny MALTCHIKOV
2 // Copyright (c) 2017 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <BRepAlgoAPI_Splitter.hxx>
16
17 #include <BOPAlgo_PaveFiller.hxx>
18 #include <BOPAlgo_Splitter.hxx>
19
20 //=======================================================================
21 // function: Empty constructor
22 // purpose: 
23 //=======================================================================
24 BRepAlgoAPI_Splitter::BRepAlgoAPI_Splitter()
25   : BRepAlgoAPI_BuilderAlgo() {}
26
27 //=======================================================================
28 // function: Constructor with already filled PaveFiller
29 // purpose: 
30 //=======================================================================
31 BRepAlgoAPI_Splitter::BRepAlgoAPI_Splitter(const BOPAlgo_PaveFiller& thePF)
32   : BRepAlgoAPI_BuilderAlgo(thePF) {}
33
34 //=======================================================================
35 // function: Destructor
36 // purpose: 
37 //=======================================================================
38 BRepAlgoAPI_Splitter::~BRepAlgoAPI_Splitter()
39 {
40 }
41
42 //=======================================================================
43 // function: SetTools
44 // purpose: 
45 //=======================================================================
46 void BRepAlgoAPI_Splitter::SetTools(const TopTools_ListOfShape& theLS)
47 {
48   myTools = theLS;
49 }
50
51 //=======================================================================
52 // function: Tools
53 // purpose: 
54 //=======================================================================
55 const TopTools_ListOfShape& BRepAlgoAPI_Splitter::Tools() const
56 {
57   return myTools;
58 }
59
60 //=======================================================================
61 // function: Build
62 // purpose: 
63 //=======================================================================
64 void BRepAlgoAPI_Splitter::Build()
65 {
66   NotDone();
67   myErrorStatus = 0;
68   //
69   if (myArguments.IsEmpty() ||
70     (myArguments.Extent() + myTools.Extent()) < 2) {
71     myErrorStatus = 1;
72     return;
73   }
74   //
75   Clear();
76   //
77   if (myEntryType) {
78     if (myDSFiller) {
79       delete myDSFiller;
80     }
81     myDSFiller = new BOPAlgo_PaveFiller(myAllocator);
82     //
83     TopTools_ListOfShape aLArgs;
84     TopTools_ListIteratorOfListOfShape aItLA(myArguments);
85     for (; aItLA.More(); aItLA.Next()) {
86       aLArgs.Append(aItLA.Value());
87     }
88     //
89     aItLA.Initialize(myTools);
90     for (; aItLA.More(); aItLA.Next()) {
91       aLArgs.Append(aItLA.Value());
92     }
93     //
94     myDSFiller->SetArguments(aLArgs);
95     //
96     myDSFiller->SetRunParallel(myRunParallel);
97     myDSFiller->SetProgressIndicator(myProgressIndicator);
98     myDSFiller->SetFuzzyValue(myFuzzyValue);
99     myDSFiller->SetNonDestructive(myNonDestructive);
100     myDSFiller->SetGlue(myGlue);
101     //
102     myDSFiller->Perform();
103     Standard_Integer iErr = myDSFiller->ErrorStatus();
104     if (iErr) {
105       myErrorStatus = 2;
106     }
107   }
108   //
109   if (myBuilder) {
110     delete myBuilder;
111   }
112   //
113   {
114     BOPAlgo_Splitter *pSplitter = new BOPAlgo_Splitter(myAllocator);
115     pSplitter->SetArguments(myArguments);
116     pSplitter->SetTools(myTools);
117     myBuilder = pSplitter;
118   }
119   //
120   myBuilder->SetRunParallel(myRunParallel);
121   myBuilder->SetProgressIndicator(myProgressIndicator);
122   //
123   myBuilder->PerformWithFiller(*myDSFiller);
124   Standard_Integer iErr = myBuilder->ErrorStatus();
125   if (iErr) {
126     myErrorStatus = 3;
127   }
128   //
129   Done();
130   myShape = myBuilder->Shape();
131 }