0026515: Exponential memory usage problems with BOPDS_IndexedMapOfPaveBlock and NColl...
[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 <Standard_ErrorHandler.hxx>
25 #include <Standard_Failure.hxx>
26 #include <TopoDS_Compound.hxx>
27 #include <TopoDS_Shape.hxx>
28 #include <TopTools_ListIteratorOfListOfShape.hxx>
29
30 //=======================================================================
31 //function : 
32 //purpose  : 
33 //=======================================================================
34 BOPAlgo_Builder::BOPAlgo_Builder()
35 :
36   BOPAlgo_BuilderShape(),
37   myArguments(myAllocator),
38   myMapFence(100, myAllocator),
39   myPaveFiller(NULL),
40   myDS(NULL),
41   myEntryPoint(0),
42   myImages(100, myAllocator),
43   myShapesSD(100, myAllocator),
44   mySplits(100, myAllocator),
45   myOrigins(100, myAllocator),
46   myFuzzyValue(0.)
47 {
48 }
49 //=======================================================================
50 //function : 
51 //purpose  : 
52 //=======================================================================
53 BOPAlgo_Builder::BOPAlgo_Builder
54   (const Handle(NCollection_BaseAllocator)& theAllocator)
55 :
56   BOPAlgo_BuilderShape(theAllocator),
57   myArguments(myAllocator),
58   myMapFence(100, myAllocator),
59   myPaveFiller(NULL),
60   myDS(NULL),
61   myEntryPoint(0),
62   myImages(100, myAllocator), 
63   myShapesSD(100, myAllocator),
64   mySplits(100, myAllocator),
65   myOrigins(100, myAllocator),
66   myFuzzyValue(0.)
67 {
68 }
69 //=======================================================================
70 //function : ~
71 //purpose  : 
72 //=======================================================================
73 BOPAlgo_Builder::~BOPAlgo_Builder()
74 {
75   if (myEntryPoint==1) {
76     if (myPaveFiller) {
77       delete myPaveFiller;
78       myPaveFiller=NULL;
79     }
80   }
81 }
82 //=======================================================================
83 //function : Clear
84 //purpose  : 
85 //=======================================================================
86 void BOPAlgo_Builder::Clear()
87 {
88   myArguments.Clear();
89   myMapFence.Clear();
90   myImages.Clear();
91   myShapesSD.Clear();
92   mySplits.Clear();
93   myOrigins.Clear();
94 }
95 //=======================================================================
96 //function : AddArgument
97 //purpose  : 
98 //=======================================================================
99 void BOPAlgo_Builder::AddArgument(const TopoDS_Shape& theShape)
100 {
101   if (myMapFence.Add(theShape)) {
102     myArguments.Append(theShape);
103   }
104 }
105 //=======================================================================
106 //function : SetArguments
107 //purpose  : 
108 //=======================================================================
109 void BOPAlgo_Builder::SetArguments(const BOPCol_ListOfShape& theShapes)
110 {
111   BOPCol_ListIteratorOfListOfShape aIt;
112   //
113   myArguments.Clear();
114   //
115   aIt.Initialize(theShapes);
116   for (; aIt.More(); aIt.Next()) {
117     const TopoDS_Shape& aS = aIt.Value();
118     AddArgument(aS);
119   }
120 }
121 //=======================================================================
122 //function : Arguments
123 //purpose  : 
124 //=======================================================================
125 const BOPCol_ListOfShape& BOPAlgo_Builder::Arguments()const
126 {
127   return myArguments;
128 }
129 //=======================================================================
130 //function : Images
131 //purpose  : 
132 //=======================================================================
133 const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Images()const
134 {
135   return myImages;
136 }
137 //=======================================================================
138 //function : Origins
139 //purpose  : 
140 //=======================================================================
141 const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::Origins()const
142 {
143   return myOrigins;
144 }
145
146 //=======================================================================
147 //function : ShapesSd
148 //purpose  : 
149 //=======================================================================
150 const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::ShapesSD()const
151 {
152   return myShapesSD;
153 }
154 //=======================================================================
155 //function : Splits
156 //purpose  : 
157 //=======================================================================
158 const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Splits()const
159 {
160   return mySplits;
161 }
162 //=======================================================================
163 //function : PPaveFiller
164 //purpose  : 
165 //=======================================================================
166 BOPAlgo_PPaveFiller BOPAlgo_Builder::PPaveFiller()
167 {
168   return myPaveFiller;
169 }
170 //=======================================================================
171 //function : PDS
172 //purpose  : 
173 //=======================================================================
174 BOPDS_PDS BOPAlgo_Builder::PDS()
175 {
176   return myDS;
177 }
178 //=======================================================================
179 //function : SetFuzzyValue
180 //purpose  : 
181 //=======================================================================
182 void BOPAlgo_Builder::SetFuzzyValue(const Standard_Real theFuzz)
183 {
184   myFuzzyValue = (theFuzz < 0.) ? 0. : theFuzz;
185 }
186 //=======================================================================
187 //function : FuzzyValue
188 //purpose  : 
189 //=======================================================================
190 Standard_Real BOPAlgo_Builder::FuzzyValue() const
191 {
192   return myFuzzyValue;
193 }
194 //=======================================================================
195 // function: CheckData
196 // purpose: 
197 //=======================================================================
198 void BOPAlgo_Builder::CheckData()
199 {
200   Standard_Integer aNb;
201   //
202   myErrorStatus=0;
203   //
204   aNb=myArguments.Extent();
205   if (aNb<2) {
206     myErrorStatus=100; // too few arguments to process
207     return;
208   }
209   //
210   //  myPaveFiller
211   if (!myPaveFiller) {
212     myErrorStatus=101; 
213     return;
214   }
215   //
216   myErrorStatus=myPaveFiller->ErrorStatus();
217   if (myErrorStatus) {
218     myErrorStatus=102; // PaveFiller is failed
219     return;
220   }
221 }
222 //=======================================================================
223 //function : Prepare
224 //purpose  : 
225 //=======================================================================
226 void BOPAlgo_Builder::Prepare()
227 {
228   myErrorStatus=0;
229   //
230   BRep_Builder aBB;
231   TopoDS_Compound aC;
232   //
233   // 1. myShape is empty compound
234   aBB.MakeCompound(aC);
235   myShape=aC;
236   myFlagHistory=Standard_True;
237 }
238 //=======================================================================
239 //function : Perform
240 //purpose  : 
241 //=======================================================================
242 void BOPAlgo_Builder::Perform()
243 {
244   myErrorStatus=0;
245   //
246   if (myEntryPoint==1) {
247     if (myPaveFiller) {
248       delete myPaveFiller;
249       myPaveFiller=NULL;
250     }
251   }
252   //
253   Handle(NCollection_BaseAllocator) aAllocator=
254     NCollection_BaseAllocator::CommonBaseAllocator();
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 }