0026619: Tolerances of operands are modified using bop
[occt.git] / src / BOPAlgo / BOPAlgo_PaveFiller.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_PaveFiller.hxx>
20 #include <BOPAlgo_SectionAttribute.hxx>
21 #include <BOPDS_Curve.hxx>
22 #include <BOPDS_DS.hxx>
23 #include <BOPDS_Iterator.hxx>
24 #include <BOPDS_PaveBlock.hxx>
25 #include <gp_Pnt.hxx>
26 #include <IntTools_Context.hxx>
27 #include <NCollection_BaseAllocator.hxx>
28 #include <Standard_ErrorHandler.hxx>
29 #include <Standard_Failure.hxx>
30 #include <TopoDS_Face.hxx>
31 #include <TopoDS_Vertex.hxx>
32 #include <TopTools_ListIteratorOfListOfShape.hxx>
33
34 //=======================================================================
35 //function : 
36 //purpose  : 
37 //=======================================================================
38 BOPAlgo_PaveFiller::BOPAlgo_PaveFiller()
39 :
40   BOPAlgo_Algo(),
41   myFuzzyValue(0.)
42 {
43   myDS=NULL;
44   myIterator=NULL;
45   myNonDestructive=Standard_False;
46   myIsPrimary=Standard_True;
47 }
48 //=======================================================================
49 //function : 
50 //purpose  : 
51 //=======================================================================
52 BOPAlgo_PaveFiller::BOPAlgo_PaveFiller
53   (const Handle(NCollection_BaseAllocator)& theAllocator)
54 :
55   BOPAlgo_Algo(theAllocator),
56   myFuzzyValue(0.)
57 {
58   myDS=NULL;
59   myIterator=NULL;
60   myNonDestructive=Standard_False;
61   myIsPrimary=Standard_True;
62 }
63 //=======================================================================
64 //function : ~
65 //purpose  : 
66 //=======================================================================
67 BOPAlgo_PaveFiller::~BOPAlgo_PaveFiller()
68 {
69   Clear();
70 }
71 //=======================================================================
72 //function : SetNonDestructive
73 //purpose  : 
74 //=======================================================================
75 void BOPAlgo_PaveFiller::SetNonDestructive(const Standard_Boolean bFlag)
76 {
77   myNonDestructive=bFlag;
78 }
79 //=======================================================================
80 //function : NonDestructive
81 //purpose  : 
82 //=======================================================================
83 Standard_Boolean BOPAlgo_PaveFiller::NonDestructive()const 
84 {
85   return myNonDestructive;
86 }
87 //=======================================================================
88 //function : SetIsPrimary
89 //purpose  : 
90 //=======================================================================
91 void BOPAlgo_PaveFiller::SetIsPrimary(const Standard_Boolean bFlag)
92 {
93   myIsPrimary=bFlag;
94 }
95 //=======================================================================
96 //function : IsPrimary
97 //purpose  : 
98 //=======================================================================
99 Standard_Boolean BOPAlgo_PaveFiller::IsPrimary()const 
100 {
101   return myIsPrimary;
102 }
103 //=======================================================================
104 //function : Clear
105 //purpose  : 
106 //=======================================================================
107 void BOPAlgo_PaveFiller::Clear()
108 {
109   if (myIterator) {
110     delete myIterator;
111     myIterator=NULL;
112   }
113   if (myDS) {
114     delete myDS;
115     myDS=NULL;
116   }
117 }
118 //=======================================================================
119 //function : DS
120 //purpose  : 
121 //=======================================================================
122 const BOPDS_DS& BOPAlgo_PaveFiller::DS()
123 {
124   return *myDS;
125 }
126 //=======================================================================
127 //function : PDS
128 //purpose  : 
129 //=======================================================================
130 BOPDS_PDS BOPAlgo_PaveFiller::PDS()
131 {
132   return myDS;
133 }
134 //=======================================================================
135 //function : Context
136 //purpose  : 
137 //=======================================================================
138 Handle(IntTools_Context) BOPAlgo_PaveFiller::Context()
139 {
140   return myContext;
141 }
142 //=======================================================================
143 //function : SectionAttribute
144 //purpose  : 
145 //=======================================================================
146 void BOPAlgo_PaveFiller::SetSectionAttribute
147   (const BOPAlgo_SectionAttribute& theSecAttr)
148 {
149   mySectionAttribute = theSecAttr;
150 }
151 //=======================================================================
152 //function : SetArguments
153 //purpose  : 
154 //=======================================================================
155 void BOPAlgo_PaveFiller::SetArguments(const BOPCol_ListOfShape& theLS)
156 {
157   myArguments=theLS;
158 }
159 //=======================================================================
160 //function : Arguments
161 //purpose  : 
162 //=======================================================================
163 const BOPCol_ListOfShape& BOPAlgo_PaveFiller::Arguments()const
164 {
165   return myArguments;
166 }
167 //=======================================================================
168 //function : SetFuzzyValue
169 //purpose  : 
170 //=======================================================================
171 void BOPAlgo_PaveFiller::SetFuzzyValue(const Standard_Real theFuzz)
172 {
173   myFuzzyValue = (theFuzz < 0.) ? 0. : theFuzz;
174 }
175 //=======================================================================
176 //function : FuzzyValue
177 //purpose  : 
178 //=======================================================================
179 Standard_Real BOPAlgo_PaveFiller::FuzzyValue() const
180 {
181   return myFuzzyValue;
182 }
183 //=======================================================================
184 // function: Init
185 // purpose: 
186 //=======================================================================
187 void BOPAlgo_PaveFiller::Init()
188 {
189   myErrorStatus=0;
190   //
191   if (!myArguments.Extent()) {
192     myErrorStatus=10;
193     return;
194   }
195   //
196   // 0 Clear
197   Clear();
198   //
199   // 1.myDS 
200   myDS=new BOPDS_DS(myAllocator);
201   myDS->SetArguments(myArguments);
202   myDS->SetFuzzyValue(myFuzzyValue);
203   myDS->Init();
204   //
205   // 2.myIterator 
206   myIterator=new BOPDS_Iterator(myAllocator);
207   myIterator->SetRunParallel(myRunParallel);
208   myIterator->SetDS(myDS);
209   myIterator->Prepare();
210   //
211   // 3 myContext
212   myContext=new IntTools_Context;
213   //
214   // 4 NonDestructive flag
215   SetNonDestructive();
216   //
217   myErrorStatus=0;
218 }
219 //=======================================================================
220 // function: Perform
221 // purpose: 
222 //=======================================================================
223 void BOPAlgo_PaveFiller::Perform()
224 {
225   myErrorStatus=0;
226   try { 
227     OCC_CATCH_SIGNALS
228     //
229     PerformInternal();
230   }
231   //
232   catch (Standard_Failure) {
233     myErrorStatus=11;
234   } 
235   //
236   myDS->SetDefaultTolerances();
237 }
238 //=======================================================================
239 // function: PerformInternal
240 // purpose: 
241 //=======================================================================
242 void BOPAlgo_PaveFiller::PerformInternal()
243 {
244   myErrorStatus=0;
245   //
246   Init();
247   if (myErrorStatus) {
248     return; 
249   }
250   //
251   Prepare();
252   if (myErrorStatus) {
253     return; 
254   }
255   // 00
256   PerformVV();
257   if (myErrorStatus) {
258     return; 
259   }
260   // 01
261   PerformVE();
262   if (myErrorStatus) {
263     return; 
264   }
265   //
266   UpdatePaveBlocksWithSDVertices();
267   myDS->UpdatePaveBlocks();
268   // 11
269   PerformEE();
270   if (myErrorStatus) {
271     return; 
272   }
273   UpdatePaveBlocksWithSDVertices();
274   // 02
275   PerformVF();
276   if (myErrorStatus) {
277     return; 
278   }
279   UpdatePaveBlocksWithSDVertices();
280   // 12
281   PerformEF();
282   if (myErrorStatus) {
283     return; 
284   }
285   UpdatePaveBlocksWithSDVertices();
286   //
287   // 22
288   PerformFF();
289   if (myErrorStatus) {
290     return; 
291   }
292   //
293   UpdateBlocksWithSharedVertices();
294   //
295   MakeSplitEdges();
296   if (myErrorStatus) {
297     return; 
298   }
299   //
300   UpdatePaveBlocksWithSDVertices();
301   //
302   MakeBlocks();
303   if (myErrorStatus) {
304     return; 
305   }
306   //
307   RefineFaceInfoOn();
308   //
309   MakePCurves();
310   if (myErrorStatus) {
311     return; 
312   }
313   //
314   ProcessDE();
315   if (myErrorStatus) {
316     return; 
317   }
318   // 03
319   PerformVZ();
320   if (myErrorStatus) {
321     return;
322   }
323   // 13
324   PerformEZ();
325   if (myErrorStatus) {
326     return;
327   }
328   // 23
329   PerformFZ();
330   if (myErrorStatus) {
331     return;
332   }
333   // 33
334   PerformZZ();
335   if (myErrorStatus) {
336     return;
337   }
338