0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BOPAlgo / BOPAlgo_Builder.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2014 OPEN CASCADE SAS
3 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
4 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
5 //                         EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 //
7 // This file is part of Open CASCADE Technology software library.
8 //
9 // This library is free software; you can redistribute it and/or modify it under
10 // the terms of the GNU Lesser General Public License version 2.1 as published
11 // by the Free Software Foundation, with special exception defined in the file
12 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
13 // distribution for complete text of the license and disclaimer of any warranty.
14 //
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
17
18
19 #include <BOPAlgo_Builder.hxx>
20 #include <BOPAlgo_PaveFiller.hxx>
21 #include <BOPTools_AlgoTools.hxx>
22 #include <BRep_Builder.hxx>
23 #include <IntTools_Context.hxx>
24 #include <NCollection_IncAllocator.hxx>
25 #include <Standard_ErrorHandler.hxx>
26 #include <Standard_Failure.hxx>
27 #include <TopoDS_Compound.hxx>
28 #include <TopoDS_Shape.hxx>
29 #include <TopTools_ListIteratorOfListOfShape.hxx>
30
31 //=======================================================================
32 //function : 
33 //purpose  : 
34 //=======================================================================
35 BOPAlgo_Builder::BOPAlgo_Builder()
36 :
37   BOPAlgo_BuilderShape(),
38   myArguments(myAllocator),
39   myMapFence(100, myAllocator),
40   myPaveFiller(NULL),
41   myDS(NULL),
42   myEntryPoint(0),
43   myImages(100, myAllocator),
44   myShapesSD(100, myAllocator),
45   mySplits(100, myAllocator),
46   myOrigins(100, myAllocator),
47   myFuzzyValue(0.)
48 {
49 }
50 //=======================================================================
51 //function : 
52 //purpose  : 
53 //=======================================================================
54 BOPAlgo_Builder::BOPAlgo_Builder
55   (const Handle(NCollection_BaseAllocator)& theAllocator)
56 :
57   BOPAlgo_BuilderShape(theAllocator),
58   myArguments(myAllocator),
59   myMapFence(100, myAllocator),
60   myPaveFiller(NULL),
61   myDS(NULL),
62   myEntryPoint(0),
63   myImages(100, myAllocator), 
64   myShapesSD(100, myAllocator),
65   mySplits(100, myAllocator),
66   myOrigins(100, myAllocator),
67   myFuzzyValue(0.)
68 {
69 }
70 //=======================================================================
71 //function : ~
72 //purpose  : 
73 //=======================================================================
74 BOPAlgo_Builder::~BOPAlgo_Builder()
75 {
76   if (myEntryPoint==1) {
77     if (myPaveFiller) {
78       delete myPaveFiller;
79       myPaveFiller=NULL;
80     }
81   }
82 }
83 //=======================================================================
84 //function : Clear
85 //purpose  : 
86 //=======================================================================
87 void BOPAlgo_Builder::Clear()
88 {
89   myArguments.Clear();
90   myMapFence.Clear();
91   myImages.Clear();
92   myShapesSD.Clear();
93   mySplits.Clear();
94   myOrigins.Clear();
95 }
96 //=======================================================================
97 //function : AddArgument
98 //purpose  : 
99 //=======================================================================
100 void BOPAlgo_Builder::AddArgument(const TopoDS_Shape& theShape)
101 {
102   if (myMapFence.Add(theShape)) {
103     myArguments.Append(theShape);
104   }
105 }
106 //=======================================================================
107 //function : SetArguments
108 //purpose  : 
109 //=======================================================================
110 void BOPAlgo_Builder::SetArguments(const BOPCol_ListOfShape& theShapes)
111 {
112   BOPCol_ListIteratorOfListOfShape aIt;
113   //
114   myArguments.Clear();
115   //
116   aIt.Initialize(theShapes);
117   for (; aIt.More(); aIt.Next()) {
118     const TopoDS_Shape& aS = aIt.Value();
119     AddArgument(aS);
120   }
121 }
122 //=======================================================================
123 //function : Arguments
124 //purpose  : 
125 //=======================================================================
126 const BOPCol_ListOfShape& BOPAlgo_Builder::Arguments()const
127 {
128   return myArguments;
129 }
130 //=======================================================================
131 //function : Images
132 //purpose  : 
133 //=======================================================================
134 const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Images()const
135 {
136   return myImages;
137 }
138 //=======================================================================
139 //function : Origins
140 //purpose  : 
141 //=======================================================================
142 const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::Origins()const
143 {
144   return myOrigins;
145 }
146
147 //=======================================================================
148 //function : ShapesSd
149 //purpose  : 
150 //=======================================================================
151 const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::ShapesSD()const
152 {
153   return myShapesSD;
154 }
155 //=======================================================================
156 //function : Splits
157 //purpose  : 
158 //=======================================================================
159 const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Splits()const
160 {
161   return mySplits;
162 }
163 //=======================================================================
164 //function : PPaveFiller
165 //purpose  : 
166 //=======================================================================
167 BOPAlgo_PPaveFiller BOPAlgo_Builder::PPaveFiller()
168 {
169   return myPaveFiller;
170 }
171 //=======================================================================
172 //function : PDS
173 //purpose  : 
174 //=======================================================================
175 BOPDS_PDS BOPAlgo_Builder::PDS()
176 {
177   return myDS;
178 }
179 //=======================================================================
180 //function : SetFuzzyValue
181 //purpose  : 
182 //=======================================================================
183 void BOPAlgo_Builder::SetFuzzyValue(const Standard_Real theFuzz)
184 {
185   myFuzzyValue = (theFuzz < 0.) ? 0. : theFuzz;
186 }
187 //=======================================================================
188 //function : FuzzyValue
189 //purpose  : 
190 //=======================================================================
191 Standard_Real BOPAlgo_Builder::FuzzyValue() const
192 {
193   return myFuzzyValue;
194 }
195 //=======================================================================
196 // function: CheckData
197 // purpose: 
198 //=======================================================================
199 void BOPAlgo_Builder::CheckData()
200 {
201   Standard_Integer aNb;
202   //
203   myErrorStatus=0;
204   //
205   aNb=myArguments.Extent();
206   if (aNb<2) {
207     myErrorStatus=100; // too few arguments to process
208     return;
209   }
210   //
211   //  myPaveFiller
212   if (!myPaveFiller) {
213     myErrorStatus=101; 
214     return;
215   }
216   //
217   myErrorStatus=myPaveFiller->ErrorStatus();
218   if (myErrorStatus) {
219     myErrorStatus=102; // PaveFiller is failed
220     return;
221   }
222 }
223 //=======================================================================
224 //function : Prepare
225 //purpose  : 
226 //=======================================================================
227 void BOPAlgo_Builder::Prepare()
228 {
229   myErrorStatus=0;
230   //
231   BRep_Builder aBB;
232   TopoDS_Compound aC;
233   //
234   // 1. myShape is empty compound
235   aBB.MakeCompound(aC);
236   myShape=aC;
237   myFlagHistory=Standard_True;
238 }
239 //=======================================================================
240 //function : Perform
241 //purpose  : 
242 //=======================================================================
243 void BOPAlgo_Builder::Perform()
244 {
245   myErrorStatus=0;
246   //
247   if (myEntryPoint==1) {
248     if (myPaveFiller) {
249       delete myPaveFiller;
250       myPaveFiller=NULL;
251     }
252   }
253   //
254   Handle(NCollection_BaseAllocator) aAllocator=new NCollection_IncAllocator;
255   //
256   BOPAlgo_PaveFiller* pPF=new BOPAlgo_PaveFiller(aAllocator);
257   //
258   pPF->SetArguments(myArguments);
259   pPF->SetRunParallel(myRunParallel);
260   pPF->SetProgressIndicator(myProgressIndicator);
261   pPF->SetFuzzyValue(myFuzzyValue);
262   //
263   pPF->Perform();
264   //
265   myEntryPoint=1;
266   PerformInternal(*pPF);
267 }
268 //=======================================================================
269 //function : PerformWithFiller
270 //purpose  : 
271 //=======================================================================
272 void BOPAlgo_Builder::PerformWithFiller(const BOPAlgo_PaveFiller& theFiller)
273 {
274   myEntryPoint=0;
275   PerformInternal(theFiller);
276 }
277 //=======================================================================
278 //function : PerformInternal
279 //purpose  : 
280 //=======================================================================
281 void BOPAlgo_Builder::PerformInternal(const BOPAlgo_PaveFiller& theFiller)
282 {
283   try { 
284     OCC_CATCH_SIGNALS
285     PerformInternal1(theFiller);
286   }
287   //
288   catch (Standard_Failure) {
289     myErrorStatus=191;
290   }  
291 }
292 //=======================================================================
293 //function : PerformInternal1
294 //purpose  : 
295 //=======================================================================
296 void BOPAlgo_Builder::PerformInternal1(const BOPAlgo_PaveFiller& theFiller)
297 {
298   myErrorStatus=0;
299   //
300   myPaveFiller=(BOPAlgo_PaveFiller*)&theFiller;
301   myDS=myPaveFiller->PDS();
302   myContext=myPaveFiller->Context();
303   //
304   // 1. CheckData
305   CheckData();
306   if (myErrorStatus) {
307     return;
308   }
309   //
310   // 2. Prepare
311   Prepare();
312   if (myErrorStatus) {
313     return;
314   }
315   //
316   // 3. Fill Images
317   // 3.1 Vertice
318   FillImagesVertices();
319   if (myErrorStatus) {
320     return;
321   }
322   //
323   BuildResult(TopAbs_VERTEX);
324   if (myErrorStatus) {
325     return;
326   }
327   // 3.2 Edges
328   FillImagesEdges();
329   if (myErrorStatus) {
330     return;
331   }
332   //
333   BuildResult(TopAbs_EDGE);
334   if (myErrorStatus) {
335     return;
336   }
337   //
338   // 3.3 Wires
339   FillImagesContainers(TopAbs_WIRE);
340   if (myErrorStatus) {
341     return;
342   }
343   //
344   BuildResult(TopAbs_WIRE);
345   if (myErrorStatus) {
346     return;
347   }
348   
349   // 3.4 Faces
350   FillImagesFaces();
351   if (myErrorStatus) {
352     return;
353   }
354   //
355   BuildResult(TopAbs_FACE);
356   if (myErrorStatus) {
357     return;
358   }
359   // 3.5 Shells
360   FillImagesContainers(TopAbs_SHELL);
361   if (myErrorStatus) {
362     return;
363   }
364   
365   BuildResult(TopAbs_SHELL);
366   if (myErrorStatus) {
367     return;
368   }
369   // 3.6 Solids
370   FillImagesSolids();
371   if (myErrorStatus) {
372     return;
373   }
374   
375   BuildResult(TopAbs_SOLID);
376   if (myErrorStatus) {
377     return;
378   }
379   // 3.7 CompSolids
380   FillImagesContainers(TopAbs_COMPSOLID);
381   if (myErrorStatus) {
382     return;
383   }
384   
385   BuildResult(TopAbs_COMPSOLID);
386   if (myErrorStatus) {
387     return;
388   }
389   
390   // 3.8 Compounds
391   FillImagesCompounds();
392   if (myErrorStatus) {
393     return;
394   }
395   
396   BuildResult(TopAbs_COMPOUND);
397   if (myErrorStatus) {
398     return;
399   }
400   //
401   // 4.History
402   PrepareHistory();
403   //
404   //
405   // 5 Post-treatment 
406   PostTreat();
407   
408 }
409 //
410 // myErrorStatus
411 // 
412 // 0  - Ok
413 // 
414 //=======================================================================
415 //function : PostTreat
416 //purpose  : 
417 //=======================================================================
418 void BOPAlgo_Builder::PostTreat()
419 {
420   BOPTools_AlgoTools::CorrectTolerances(myShape, 0.05, myRunParallel);
421   BOPTools_AlgoTools::CorrectShapeTolerances(myShape, myRunParallel);
422 }