0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BOPAlgo / BOPAlgo_Builder.cxx
CommitLineData
4e57c75e 1// Created by: Peter KURNEV
973c2be1 2// Copyright (c) 2010-2014 OPEN CASCADE SAS
4e57c75e 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//
973c2be1 7// This file is part of Open CASCADE Technology software library.
4e57c75e 8//
d5f74e42 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
973c2be1 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.
4e57c75e 14//
973c2be1 15// Alternatively, this file may be used under the terms of Open CASCADE
16// commercial license or contractual agreement.
4e57c75e 17
4e57c75e 18
42cf5bc1 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>
36f4947b 25#include <Standard_ErrorHandler.hxx>
26#include <Standard_Failure.hxx>
4e57c75e 27#include <TopoDS_Compound.hxx>
42cf5bc1 28#include <TopoDS_Shape.hxx>
49b0c452 29#include <TopTools_ListIteratorOfListOfShape.hxx>
4e57c75e 30
31//=======================================================================
32//function :
33//purpose :
34//=======================================================================
796a784d 35BOPAlgo_Builder::BOPAlgo_Builder()
4e57c75e 36:
37 BOPAlgo_BuilderShape(),
38 myArguments(myAllocator),
39 myMapFence(100, myAllocator),
40 myPaveFiller(NULL),
41 myDS(NULL),
4e57c75e 42 myEntryPoint(0),
43 myImages(100, myAllocator),
44 myShapesSD(100, myAllocator),
45 mySplits(100, myAllocator),
b1d15f53 46 myOrigins(100, myAllocator),
47 myFuzzyValue(0.)
4e57c75e 48{
49}
50//=======================================================================
51//function :
52//purpose :
53//=======================================================================
796a784d 54BOPAlgo_Builder::BOPAlgo_Builder
55 (const Handle(NCollection_BaseAllocator)& theAllocator)
4e57c75e 56:
57 BOPAlgo_BuilderShape(theAllocator),
58 myArguments(myAllocator),
59 myMapFence(100, myAllocator),
60 myPaveFiller(NULL),
61 myDS(NULL),
4e57c75e 62 myEntryPoint(0),
63 myImages(100, myAllocator),
64 myShapesSD(100, myAllocator),
65 mySplits(100, myAllocator),
b1d15f53 66 myOrigins(100, myAllocator),
67 myFuzzyValue(0.)
4e57c75e 68{
69}
70//=======================================================================
71//function : ~
72//purpose :
73//=======================================================================
796a784d 74BOPAlgo_Builder::~BOPAlgo_Builder()
4e57c75e 75{
76 if (myEntryPoint==1) {
77 if (myPaveFiller) {
78 delete myPaveFiller;
79 myPaveFiller=NULL;
80 }
81 }
82}
83//=======================================================================
84//function : Clear
85//purpose :
86//=======================================================================
796a784d 87void BOPAlgo_Builder::Clear()
4e57c75e 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//=======================================================================
796a784d 100void BOPAlgo_Builder::AddArgument(const TopoDS_Shape& theShape)
4e57c75e 101{
102 if (myMapFence.Add(theShape)) {
103 myArguments.Append(theShape);
104 }
105}
106//=======================================================================
92ae0f2f 107//function : SetArguments
108//purpose :
109//=======================================================================
110void BOPAlgo_Builder::SetArguments(const BOPCol_ListOfShape& theShapes)
111{
112 BOPCol_ListIteratorOfListOfShape aIt;
113 //
49b0c452 114 myArguments.Clear();
115 //
92ae0f2f 116 aIt.Initialize(theShapes);
117 for (; aIt.More(); aIt.Next()) {
118 const TopoDS_Shape& aS = aIt.Value();
119 AddArgument(aS);
120 }
121}
122//=======================================================================
4e57c75e 123//function : Arguments
124//purpose :
125//=======================================================================
796a784d 126const BOPCol_ListOfShape& BOPAlgo_Builder::Arguments()const
4e57c75e 127{
128 return myArguments;
129}
130//=======================================================================
131//function : Images
132//purpose :
133//=======================================================================
796a784d 134const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Images()const
4e57c75e 135{
136 return myImages;
137}
138//=======================================================================
139//function : Origins
140//purpose :
141//=======================================================================
796a784d 142const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::Origins()const
4e57c75e 143{
144 return myOrigins;
145}
146
147//=======================================================================
148//function : ShapesSd
149//purpose :
150//=======================================================================
796a784d 151const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::ShapesSD()const
4e57c75e 152{
153 return myShapesSD;
154}
155//=======================================================================
156//function : Splits
157//purpose :
158//=======================================================================
796a784d 159const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Splits()const
4e57c75e 160{
161 return mySplits;
162}
163//=======================================================================
164//function : PPaveFiller
165//purpose :
166//=======================================================================
796a784d 167BOPAlgo_PPaveFiller BOPAlgo_Builder::PPaveFiller()
4e57c75e 168{
169 return myPaveFiller;
170}
171//=======================================================================
172//function : PDS
173//purpose :
174//=======================================================================
796a784d 175BOPDS_PDS BOPAlgo_Builder::PDS()
4e57c75e 176{
177 return myDS;
178}
179//=======================================================================
b1d15f53 180//function : SetFuzzyValue
181//purpose :
182//=======================================================================
183void BOPAlgo_Builder::SetFuzzyValue(const Standard_Real theFuzz)
184{
92e24f9d 185 myFuzzyValue = (theFuzz < 0.) ? 0. : theFuzz;
b1d15f53 186}
187//=======================================================================
188//function : FuzzyValue
189//purpose :
190//=======================================================================
191Standard_Real BOPAlgo_Builder::FuzzyValue() const
192{
193 return myFuzzyValue;
194}
195//=======================================================================
4e57c75e 196// function: CheckData
197// purpose:
198//=======================================================================
796a784d 199void BOPAlgo_Builder::CheckData()
4e57c75e 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//=======================================================================
796a784d 227void BOPAlgo_Builder::Prepare()
4e57c75e 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//=======================================================================
796a784d 243void BOPAlgo_Builder::Perform()
4e57c75e 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);
92ae0f2f 259 pPF->SetRunParallel(myRunParallel);
b1d15f53 260 pPF->SetProgressIndicator(myProgressIndicator);
261 pPF->SetFuzzyValue(myFuzzyValue);
4e57c75e 262 //
263 pPF->Perform();
264 //
265 myEntryPoint=1;
266 PerformInternal(*pPF);
267}
268//=======================================================================
269//function : PerformWithFiller
270//purpose :
271//=======================================================================
796a784d 272void BOPAlgo_Builder::PerformWithFiller(const BOPAlgo_PaveFiller& theFiller)
4e57c75e 273{
274 myEntryPoint=0;
275 PerformInternal(theFiller);
276}
277//=======================================================================
278//function : PerformInternal
279//purpose :
280//=======================================================================
796a784d 281void BOPAlgo_Builder::PerformInternal(const BOPAlgo_PaveFiller& theFiller)
4e57c75e 282{
36f4947b 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//=======================================================================
296void BOPAlgo_Builder::PerformInternal1(const BOPAlgo_PaveFiller& theFiller)
297{
4e57c75e 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//=======================================================================
796a784d 418void BOPAlgo_Builder::PostTreat()
4e57c75e 419{
c26b5a34 420 BOPTools_AlgoTools::CorrectTolerances(myShape, 0.05, myRunParallel);
421 BOPTools_AlgoTools::CorrectShapeTolerances(myShape, myRunParallel);
4e57c75e 422}