0028786: Refactoring of the Warning/Error reporting system of Boolean Operations...
[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>
33ba8565 21#include <BOPAlgo_Alerts.hxx>
42cf5bc1 22#include <BOPTools_AlgoTools.hxx>
23#include <BRep_Builder.hxx>
24#include <IntTools_Context.hxx>
36f4947b 25#include <Standard_ErrorHandler.hxx>
26#include <Standard_Failure.hxx>
4e57c75e 27#include <TopoDS_Compound.hxx>
3510db62 28#include <BRep_Builder.hxx>
29
30#include <BOPCol_IndexedMapOfShape.hxx>
31
32#include <BOPDS_ShapeInfo.hxx>
33#include <BOPDS_DS.hxx>
34
35#include <BOPTools_AlgoTools.hxx>
49b0c452 36#include <TopTools_ListIteratorOfListOfShape.hxx>
4e57c75e 37
3510db62 38
4e57c75e 39//=======================================================================
40//function :
41//purpose :
42//=======================================================================
796a784d 43BOPAlgo_Builder::BOPAlgo_Builder()
4e57c75e 44:
45 BOPAlgo_BuilderShape(),
46 myArguments(myAllocator),
47 myMapFence(100, myAllocator),
48 myPaveFiller(NULL),
49 myDS(NULL),
4e57c75e 50 myEntryPoint(0),
51 myImages(100, myAllocator),
52 myShapesSD(100, myAllocator),
53 mySplits(100, myAllocator),
b1d15f53 54 myOrigins(100, myAllocator),
483ce1bd 55 myNonDestructive(Standard_False),
56 myGlue(BOPAlgo_GlueOff)
4e57c75e 57{
58}
59//=======================================================================
60//function :
61//purpose :
62//=======================================================================
796a784d 63BOPAlgo_Builder::BOPAlgo_Builder
64 (const Handle(NCollection_BaseAllocator)& theAllocator)
4e57c75e 65:
66 BOPAlgo_BuilderShape(theAllocator),
67 myArguments(myAllocator),
68 myMapFence(100, myAllocator),
69 myPaveFiller(NULL),
70 myDS(NULL),
4e57c75e 71 myEntryPoint(0),
72 myImages(100, myAllocator),
73 myShapesSD(100, myAllocator),
74 mySplits(100, myAllocator),
b1d15f53 75 myOrigins(100, myAllocator),
483ce1bd 76 myNonDestructive(Standard_False),
77 myGlue(BOPAlgo_GlueOff)
4e57c75e 78{
79}
80//=======================================================================
81//function : ~
82//purpose :
83//=======================================================================
796a784d 84BOPAlgo_Builder::~BOPAlgo_Builder()
4e57c75e 85{
86 if (myEntryPoint==1) {
87 if (myPaveFiller) {
88 delete myPaveFiller;
89 myPaveFiller=NULL;
90 }
91 }
92}
93//=======================================================================
94//function : Clear
95//purpose :
96//=======================================================================
796a784d 97void BOPAlgo_Builder::Clear()
4e57c75e 98{
33ba8565 99 BOPAlgo_Algo::Clear();
4e57c75e 100 myArguments.Clear();
101 myMapFence.Clear();
102 myImages.Clear();
103 myShapesSD.Clear();
104 mySplits.Clear();
105 myOrigins.Clear();
106}
107//=======================================================================
108//function : AddArgument
109//purpose :
110//=======================================================================
796a784d 111void BOPAlgo_Builder::AddArgument(const TopoDS_Shape& theShape)
4e57c75e 112{
113 if (myMapFence.Add(theShape)) {
114 myArguments.Append(theShape);
115 }
116}
117//=======================================================================
92ae0f2f 118//function : SetArguments
119//purpose :
120//=======================================================================
121void BOPAlgo_Builder::SetArguments(const BOPCol_ListOfShape& theShapes)
122{
123 BOPCol_ListIteratorOfListOfShape aIt;
124 //
49b0c452 125 myArguments.Clear();
126 //
92ae0f2f 127 aIt.Initialize(theShapes);
128 for (; aIt.More(); aIt.Next()) {
129 const TopoDS_Shape& aS = aIt.Value();
130 AddArgument(aS);
131 }
132}
133//=======================================================================
4e57c75e 134//function : Arguments
135//purpose :
136//=======================================================================
796a784d 137const BOPCol_ListOfShape& BOPAlgo_Builder::Arguments()const
4e57c75e 138{
139 return myArguments;
140}
141//=======================================================================
142//function : Images
143//purpose :
144//=======================================================================
796a784d 145const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Images()const
4e57c75e 146{
147 return myImages;
148}
149//=======================================================================
150//function : Origins
151//purpose :
152//=======================================================================
b18a83d4 153const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Origins()const
4e57c75e 154{
155 return myOrigins;
156}
157
158//=======================================================================
159//function : ShapesSd
160//purpose :
161//=======================================================================
796a784d 162const BOPCol_DataMapOfShapeShape& BOPAlgo_Builder::ShapesSD()const
4e57c75e 163{
164 return myShapesSD;
165}
166//=======================================================================
167//function : Splits
168//purpose :
169//=======================================================================
796a784d 170const BOPCol_DataMapOfShapeListOfShape& BOPAlgo_Builder::Splits()const
4e57c75e 171{
172 return mySplits;
173}
174//=======================================================================
175//function : PPaveFiller
176//purpose :
177//=======================================================================
796a784d 178BOPAlgo_PPaveFiller BOPAlgo_Builder::PPaveFiller()
4e57c75e 179{
180 return myPaveFiller;
181}
182//=======================================================================
183//function : PDS
184//purpose :
185//=======================================================================
796a784d 186BOPDS_PDS BOPAlgo_Builder::PDS()
4e57c75e 187{
188 return myDS;
189}
190//=======================================================================
3510db62 191//function : SetNonDestructive
192//purpose :
193//=======================================================================
194void BOPAlgo_Builder::SetNonDestructive(const Standard_Boolean theFlag)
195{
196 myNonDestructive = theFlag;
197}
198//=======================================================================
199//function : NonDestructive
200//purpose :
201//=======================================================================
202Standard_Boolean BOPAlgo_Builder::NonDestructive() const
203{
204 return myNonDestructive;
205}
206//=======================================================================
483ce1bd 207//function : SetGlue
208//purpose :
209//=======================================================================
210void BOPAlgo_Builder::SetGlue(const BOPAlgo_GlueEnum theGlue)
211{
212 myGlue=theGlue;
213}
214//=======================================================================
215//function : Glue
216//purpose :
217//=======================================================================
218BOPAlgo_GlueEnum BOPAlgo_Builder::Glue() const
219{
220 return myGlue;
221}
222//=======================================================================
4e57c75e 223// function: CheckData
224// purpose:
225//=======================================================================
796a784d 226void BOPAlgo_Builder::CheckData()
4e57c75e 227{
33ba8565 228 Standard_Integer aNb = myArguments.Extent();
4e57c75e 229 if (aNb<2) {
33ba8565 230 AddError (new BOPAlgo_AlertTooFewArguments); // too few arguments to process
4e57c75e 231 return;
232 }
233 //
33ba8565 234 CheckFiller();
235}
236//=======================================================================
237// function: CheckFiller
238// purpose:
239//=======================================================================
240void BOPAlgo_Builder::CheckFiller()
241{
4e57c75e 242 if (!myPaveFiller) {
33ba8565 243 AddError (new BOPAlgo_AlertNoFiller);
4e57c75e 244 return;
245 }
33ba8565 246 GetReport()->Merge (myPaveFiller->GetReport());
4e57c75e 247}
33ba8565 248
4e57c75e 249//=======================================================================
250//function : Prepare
251//purpose :
252//=======================================================================
796a784d 253void BOPAlgo_Builder::Prepare()
4e57c75e 254{
4e57c75e 255 BRep_Builder aBB;
256 TopoDS_Compound aC;
257 //
258 // 1. myShape is empty compound
259 aBB.MakeCompound(aC);
260 myShape=aC;
261 myFlagHistory=Standard_True;
262}
263//=======================================================================
264//function : Perform
265//purpose :
266//=======================================================================
796a784d 267void BOPAlgo_Builder::Perform()
4e57c75e 268{
33ba8565 269 GetReport()->Clear();
4e57c75e 270 //
271 if (myEntryPoint==1) {
272 if (myPaveFiller) {
273 delete myPaveFiller;
274 myPaveFiller=NULL;
275 }
276 }
277 //
488e5b9d 278 Handle(NCollection_BaseAllocator) aAllocator=
279 NCollection_BaseAllocator::CommonBaseAllocator();
4e57c75e 280 //
281 BOPAlgo_PaveFiller* pPF=new BOPAlgo_PaveFiller(aAllocator);
282 //
283 pPF->SetArguments(myArguments);
92ae0f2f 284 pPF->SetRunParallel(myRunParallel);
b1d15f53 285 pPF->SetProgressIndicator(myProgressIndicator);
286 pPF->SetFuzzyValue(myFuzzyValue);
3510db62 287 pPF->SetNonDestructive(myNonDestructive);
483ce1bd 288 pPF->SetGlue(myGlue);
4e57c75e 289 //
290 pPF->Perform();
291 //
292 myEntryPoint=1;
293 PerformInternal(*pPF);
294}
295//=======================================================================
296//function : PerformWithFiller
297//purpose :
298//=======================================================================
796a784d 299void BOPAlgo_Builder::PerformWithFiller(const BOPAlgo_PaveFiller& theFiller)
4e57c75e 300{
33ba8565 301 GetReport()->Clear();
4e57c75e 302 myEntryPoint=0;
3510db62 303 myNonDestructive = theFiller.NonDestructive();
304 myFuzzyValue = theFiller.FuzzyValue();
483ce1bd 305 myGlue = theFiller.Glue();
4e57c75e 306 PerformInternal(theFiller);
307}
308//=======================================================================
309//function : PerformInternal
310//purpose :
311//=======================================================================
796a784d 312void BOPAlgo_Builder::PerformInternal(const BOPAlgo_PaveFiller& theFiller)
4e57c75e 313{
33ba8565 314 GetReport()->Clear();
315 //
316 try {
36f4947b 317 OCC_CATCH_SIGNALS
318 PerformInternal1(theFiller);
319 }
320 //
321 catch (Standard_Failure) {
33ba8565 322 AddError (new BOPAlgo_AlertBuilderFailed);
323 }
36f4947b 324}
325//=======================================================================
326//function : PerformInternal1
327//purpose :
328//=======================================================================
329void BOPAlgo_Builder::PerformInternal1(const BOPAlgo_PaveFiller& theFiller)
330{
4e57c75e 331 myPaveFiller=(BOPAlgo_PaveFiller*)&theFiller;
332 myDS=myPaveFiller->PDS();
333 myContext=myPaveFiller->Context();
0d0481c7 334 myFuzzyValue = myPaveFiller->FuzzyValue();
335 myNonDestructive = myPaveFiller->NonDestructive();
4e57c75e 336 //
337 // 1. CheckData
338 CheckData();
33ba8565 339 if (HasErrors()) {
4e57c75e 340 return;
341 }
342 //
343 // 2. Prepare
344 Prepare();
33ba8565 345 if (HasErrors()) {
4e57c75e 346 return;
347 }
348 //
349 // 3. Fill Images
350 // 3.1 Vertice
351 FillImagesVertices();
33ba8565 352 if (HasErrors()) {
4e57c75e 353 return;
354 }
355 //
356 BuildResult(TopAbs_VERTEX);
33ba8565 357 if (HasErrors()) {
4e57c75e 358 return;
359 }
360 // 3.2 Edges
361 FillImagesEdges();
33ba8565 362 if (HasErrors()) {
4e57c75e 363 return;
364 }
365 //
366 BuildResult(TopAbs_EDGE);
33ba8565 367 if (HasErrors()) {
4e57c75e 368 return;
369 }
370 //
371 // 3.3 Wires
372 FillImagesContainers(TopAbs_WIRE);
33ba8565 373 if (HasErrors()) {
4e57c75e 374 return;
375 }
376 //
377 BuildResult(TopAbs_WIRE);
33ba8565 378 if (HasErrors()) {
4e57c75e 379 return;
380 }
381
382 // 3.4 Faces
383 FillImagesFaces();
33ba8565 384 if (HasErrors()) {
4e57c75e 385 return;
386 }
387 //
388 BuildResult(TopAbs_FACE);
33ba8565 389 if (HasErrors()) {
4e57c75e 390 return;
391 }
392 // 3.5 Shells
393 FillImagesContainers(TopAbs_SHELL);
33ba8565 394 if (HasErrors()) {
4e57c75e 395 return;
396 }
397
398 BuildResult(TopAbs_SHELL);
33ba8565 399 if (HasErrors()) {
4e57c75e 400 return;
401 }
402 // 3.6 Solids
403 FillImagesSolids();
33ba8565 404 if (HasErrors()) {
4e57c75e 405 return;
406 }
407
408 BuildResult(TopAbs_SOLID);
33ba8565 409 if (HasErrors()) {
4e57c75e 410 return;
411 }
412 // 3.7 CompSolids
413 FillImagesContainers(TopAbs_COMPSOLID);
33ba8565 414 if (HasErrors()) {
4e57c75e 415 return;
416 }
417
418 BuildResult(TopAbs_COMPSOLID);
33ba8565 419 if (HasErrors()) {
4e57c75e 420 return;
421 }
422
423 // 3.8 Compounds
424 FillImagesCompounds();
33ba8565 425 if (HasErrors()) {
4e57c75e 426 return;
427 }
428
429 BuildResult(TopAbs_COMPOUND);
33ba8565 430 if (HasErrors()) {
4e57c75e 431 return;
432 }
433 //
434 // 4.History
435 PrepareHistory();
436 //
437 //
438 // 5 Post-treatment
439 PostTreat();
440
441}
4e57c75e 442//=======================================================================
443//function : PostTreat
444//purpose :
445//=======================================================================
796a784d 446void BOPAlgo_Builder::PostTreat()
4e57c75e 447{
3510db62 448 Standard_Integer i, aNbS;
449 TopAbs_ShapeEnum aType;
450 BOPCol_IndexedMapOfShape aMA;
451 if (myPaveFiller->NonDestructive()) {
452 // MapToAvoid
453 aNbS=myDS->NbSourceShapes();
454 for (i=0; i<aNbS; ++i) {
455 const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
456 aType=aSI.ShapeType();
457 if (aType==TopAbs_VERTEX ||
458 aType==TopAbs_EDGE||
459 aType==TopAbs_FACE) {
460 const TopoDS_Shape& aS=aSI.Shape();
461 aMA.Add(aS);
462 }
463 }
464 }
465 //
466 BOPTools_AlgoTools::CorrectTolerances(myShape, aMA, 0.05, myRunParallel);
467 BOPTools_AlgoTools::CorrectShapeTolerances(myShape, aMA, myRunParallel);
4e57c75e 468}