0026738: Make Boolean operations safely treating arguments when running with fuzzy...
[occt.git] / src / BOPAlgo / BOPAlgo_PaveFiller.hxx
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 #ifndef _BOPAlgo_PaveFiller_HeaderFile
19 #define _BOPAlgo_PaveFiller_HeaderFile
20
21 #include <Standard.hxx>
22 #include <Standard_DefineAlloc.hxx>
23 #include <Standard_Handle.hxx>
24
25 #include <BOPCol_ListOfShape.hxx>
26 #include <BOPDS_PDS.hxx>
27 #include <BOPDS_PIterator.hxx>
28 #include <BOPAlgo_SectionAttribute.hxx>
29 #include <Standard_Real.hxx>
30 #include <BOPAlgo_Algo.hxx>
31 #include <BOPCol_BaseAllocator.hxx>
32 #include <TopAbs_ShapeEnum.hxx>
33 #include <Standard_Integer.hxx>
34 #include <BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks.hxx>
35 #include <Standard_Boolean.hxx>
36 #include <BOPCol_IndexedMapOfShape.hxx>
37 #include <BOPCol_MapOfInteger.hxx>
38 #include <BOPCol_DataMapOfIntegerReal.hxx>
39 #include <BOPCol_ListOfInteger.hxx>
40 #include <BOPDS_IndexedMapOfPaveBlock.hxx>
41 #include <BOPCol_DataMapOfShapeInteger.hxx>
42 #include <BOPDS_DataMapOfPaveBlockListOfPaveBlock.hxx>
43 #include <BOPCol_DataMapOfIntegerInteger.hxx>
44 #include <BOPDS_ListOfPaveBlock.hxx>
45 #include <IntSurf_ListOfPntOn2S.hxx>
46 #include <BOPCol_DataMapOfIntegerListOfInteger.hxx>
47 #include <BOPDS_MapOfPaveBlock.hxx>
48 #include <BOPDS_VectorOfCurve.hxx>
49 #include <BOPCol_IndexedDataMapOfShapeInteger.hxx>
50 #include <BOPCol_IndexedDataMapOfShapeListOfShape.hxx>
51 class IntTools_Context;
52 class BOPDS_DS;
53 class BOPAlgo_SectionAttribute;
54 class BOPDS_PaveBlock;
55 class BOPDS_CommonBlock;
56 class gp_Pnt;
57 class BOPDS_Curve;
58 class TopoDS_Vertex;
59 class TopoDS_Edge;
60 class TopoDS_Face;
61
62
63 class BOPAlgo_PaveFiller  : public BOPAlgo_Algo
64 {
65 public:
66
67   DEFINE_STANDARD_ALLOC
68
69   
70   Standard_EXPORT BOPAlgo_PaveFiller();
71
72   Standard_EXPORT virtual ~BOPAlgo_PaveFiller();
73   
74   Standard_EXPORT BOPAlgo_PaveFiller(const BOPCol_BaseAllocator& theAllocator);
75   
76   Standard_EXPORT const BOPDS_DS& DS();
77   
78   Standard_EXPORT BOPDS_PDS PDS();
79   
80   Standard_EXPORT const BOPDS_PIterator& Iterator();
81   
82   Standard_EXPORT void SetArguments (const BOPCol_ListOfShape& theLS);
83   
84   Standard_EXPORT const BOPCol_ListOfShape& Arguments() const;
85   
86   Standard_EXPORT Handle(IntTools_Context) Context();
87   
88   Standard_EXPORT void SetSectionAttribute (const BOPAlgo_SectionAttribute& theSecAttr);
89   
90   //! Sets the flag that defines the mode of treatment.
91   //! In non-destructive mode the argument shapes are not modified. Instead
92   //! a copy of a sub-shape is created in the result if it is needed to be updated.
93   Standard_EXPORT void SetNonDestructive(const Standard_Boolean theFlag);
94   
95   //! Returns the flag that defines the mode of treatment.
96   //! In non-destructive mode the argument shapes are not modified. Instead
97   //! a copy of a sub-shape is created in the result if it is needed to be updated.
98   Standard_EXPORT Standard_Boolean NonDestructive() const;
99
100   Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
101   
102   
103
104 protected:
105
106   typedef NCollection_DataMap
107             <Handle(BOPDS_PaveBlock),
108              Bnd_Box,
109              TColStd_MapTransientHasher> BOPAlgo_DataMapOfPaveBlockBndBox;
110
111
112   //! Sets non-destructive mode automatically if an argument 
113   //! contains a locked sub-shape (see TopoDS_Shape::Locked()).
114   Standard_EXPORT void SetNonDestructive();
115      
116   Standard_EXPORT void SetIsPrimary(const Standard_Boolean theFlag);
117    
118   Standard_EXPORT Standard_Boolean IsPrimary() const;
119
120   Standard_EXPORT virtual void PerformInternal();
121   
122   Standard_EXPORT virtual void Clear();
123   
124   Standard_EXPORT virtual void Init();
125   
126   Standard_EXPORT void Prepare();
127   
128   Standard_EXPORT virtual void PerformVV();
129   
130   Standard_EXPORT virtual void PerformVE();
131   
132   Standard_EXPORT virtual void PerformVF();
133   
134   Standard_EXPORT virtual void PerformEE();
135   
136   Standard_EXPORT virtual void PerformEF();
137   
138   Standard_EXPORT virtual void PerformFF();
139   
140   Standard_EXPORT virtual void PerformVZ();
141   
142   Standard_EXPORT virtual void PerformEZ();
143   
144   Standard_EXPORT virtual void PerformFZ();
145   
146   Standard_EXPORT virtual void PerformZZ();
147
148   Standard_EXPORT virtual void PerformSZ(const TopAbs_ShapeEnum aTS);
149   
150   Standard_EXPORT void TreatVerticesEE();
151   
152   Standard_EXPORT void MakeSDVerticesFF(const BOPCol_DataMapOfIntegerListOfInteger& aDMVLV,
153                                         BOPCol_DataMapOfIntegerInteger& theDMNewSD);
154
155   Standard_EXPORT void MakeSplitEdges();
156   
157   Standard_EXPORT void MakeBlocks();
158   
159   Standard_EXPORT void MakePCurves();
160
161   Standard_EXPORT Standard_Integer MakeSDVertices(const BOPCol_ListOfInteger& theVertIndices,
162                                                   const Standard_Boolean theAddInterfs = 1);
163   
164   Standard_EXPORT void ProcessDE();
165   
166   Standard_EXPORT void FillShrunkData (Handle(BOPDS_PaveBlock)& thePB);
167   
168   Standard_EXPORT void FillShrunkData (const TopAbs_ShapeEnum theType1, const TopAbs_ShapeEnum theType2);
169   
170   Standard_EXPORT Standard_Integer PerformVerticesEE (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMVCPB, const BOPCol_BaseAllocator& theAllocator);
171   
172   Standard_EXPORT Standard_Integer PerformVerticesEF (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMVCPB, const BOPCol_BaseAllocator& theAllocator);
173   
174   Standard_EXPORT Standard_Boolean CheckFacePaves (const TopoDS_Vertex& theVnew, const BOPCol_MapOfInteger& theMIF);
175   
176   Standard_EXPORT static Standard_Boolean CheckFacePaves (const Standard_Integer theN, const BOPCol_MapOfInteger& theMIFOn, const BOPCol_MapOfInteger& theMIFIn);
177   
178   Standard_EXPORT Standard_Boolean IsExistingVertex (const gp_Pnt& theP, const Standard_Real theTol, const BOPCol_MapOfInteger& theMVOn) const;
179   
180
181   //! Checks and puts paves from <theMVOn> on the curve <theNC>.
182   Standard_EXPORT void PutPavesOnCurve (const BOPCol_MapOfInteger& theMVOn, 
183                                 const Standard_Real theTolR3D, 
184                                 BOPDS_Curve& theNC, 
185                                 const Standard_Integer nF1, 
186                                 const Standard_Integer nF2, 
187                                 const BOPCol_MapOfInteger& theMI, 
188                                 const BOPCol_MapOfInteger& theMVEF, 
189                                 BOPCol_DataMapOfIntegerReal& theMVTol,
190                                 BOPCol_DataMapOfIntegerListOfInteger& aDMVLV);
191
192   Standard_EXPORT void FilterPavesOnCurves(const BOPDS_VectorOfCurve& theVNC,
193                                            const Standard_Real theTolR3D);
194
195   //! Depending on the parameter aType it checks whether
196   //! the vertex nV was created in EE or EF intersections.
197   //! If so, it increases aTolVExt from tolerance value of vertex to
198   //! the max distance from vertex nV to the ends of the range of common part.
199   //! Possible values of aType:
200   //! 1 - checks only EE;
201   //! 2 - checks only EF;
202   //! other - checks both types of intersections.
203   Standard_EXPORT Standard_Boolean ExtendedTolerance (const Standard_Integer nV, const BOPCol_MapOfInteger& aMI, Standard_Real& aTolVExt, const Standard_Integer aType = 0);
204   
205   Standard_EXPORT void PutBoundPaveOnCurve (const TopoDS_Face& theF1, const TopoDS_Face& theF2, const Standard_Real theTolR3D, BOPDS_Curve& theNC, BOPCol_ListOfInteger& theLBV);
206   
207   Standard_EXPORT Standard_Boolean IsExistingPaveBlock
208     (const Handle(BOPDS_PaveBlock)& thePB, const BOPDS_Curve& theNC,
209      const Standard_Real theTolR3D, const BOPDS_IndexedMapOfPaveBlock& theMPB,
210      const BOPDS_MapOfPaveBlock& theMPBCommon,
211      Handle(BOPDS_PaveBlock)& thePBOut, Standard_Real& theTolNew);
212   
213   Standard_EXPORT Standard_Boolean IsExistingPaveBlock (const Handle(BOPDS_PaveBlock)& thePB, const BOPDS_Curve& theNC, const BOPCol_ListOfInteger& theLSE);
214   
215
216   //! Treatment of section edges.
217   Standard_EXPORT Standard_Integer PostTreatFF (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
218                                                 BOPCol_DataMapOfShapeInteger& theMVI,
219                                                 BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDMExEdges,
220                                                 BOPCol_DataMapOfIntegerInteger& theDMNewSD,
221                                                 const BOPCol_IndexedMapOfShape& theMicroEdges,
222                                                 const BOPCol_BaseAllocator& theAllocator);
223   
224   Standard_EXPORT void FindPaveBlocks (const Standard_Integer theV, const Standard_Integer theF, BOPDS_ListOfPaveBlock& theLPB);
225   
226   Standard_EXPORT void FillPaves (const Standard_Integer theV, const Standard_Integer theE, const Standard_Integer theF, const BOPDS_ListOfPaveBlock& theLPB, const Handle(BOPDS_PaveBlock)& thePB);
227   
228   Standard_EXPORT void MakeSplitEdge (const Standard_Integer theV, const Standard_Integer theF);
229   
230   Standard_EXPORT void GetEFPnts (const Standard_Integer nF1, const Standard_Integer nF2, IntSurf_ListOfPntOn2S& aListOfPnts);
231   
232
233   //! Checks and puts paves created in EF intersections on the curve <theNC>.
234   Standard_EXPORT void PutEFPavesOnCurve (BOPDS_Curve& theNC, 
235                                 const BOPCol_MapOfInteger& theMI, 
236                                 const BOPCol_MapOfInteger& theMVEF, 
237                                 BOPCol_DataMapOfIntegerReal& theMVTol,
238                                 BOPCol_DataMapOfIntegerListOfInteger& aDMVLV);
239   
240
241   //! Puts stick paves on the curve <theNC>
242   Standard_EXPORT void PutStickPavesOnCurve (const TopoDS_Face& aF1, 
243                                 const TopoDS_Face& aF2, 
244                                 const BOPCol_MapOfInteger& theMI, 
245                                 BOPDS_Curve& theNC, 
246                                 const BOPCol_MapOfInteger& theMVStick, 
247                                 BOPCol_DataMapOfIntegerReal& theMVTol,
248                                 BOPCol_DataMapOfIntegerListOfInteger& aDMVLV);
249   
250
251   //! Collects indices of vertices created in all intersections between
252   //! two faces (<nF1> and <nF2>) to the map <theMVStick>.
253   //! Also, it collects indices of EF vertices to the <theMVEF> map
254   //! and indices of all subshapes of these two faces to the <theMI> map.
255   Standard_EXPORT void GetStickVertices (const Standard_Integer nF1, const Standard_Integer nF2, BOPCol_MapOfInteger& theMVStick, BOPCol_MapOfInteger& theMVEF, BOPCol_MapOfInteger& theMI);
256   
257
258   //! Collects index nF and indices of all subshapes of the shape with index <nF>
259   //! to the map <theMI>.
260   Standard_EXPORT void GetFullShapeMap (const Standard_Integer nF, BOPCol_MapOfInteger& theMI);
261   
262
263   //! Removes indices of vertices that are already on the
264   //! curve <theNC> from the map <theMV>.
265   //! It is used in PutEFPavesOnCurve and PutStickPavesOnCurve methods.
266   Standard_EXPORT void RemoveUsedVertices (BOPDS_Curve& theNC, BOPCol_MapOfInteger& theMV);
267   
268
269   //! Puts the pave nV on the curve theNC.
270   //! Parameter aType defines whether to check the pave with
271   //! extended tolerance:
272   //! 0 - do not perform the check;
273   //! other - perform the check (aType goes to ExtendedTolerance).
274   Standard_EXPORT void PutPaveOnCurve (const Standard_Integer nV, 
275                                 const Standard_Real theTolR3D, 
276                                 const BOPDS_Curve& theNC, 
277                                 const BOPCol_MapOfInteger& theMI, 
278                                 BOPCol_DataMapOfIntegerReal& theMVTol,
279                                 BOPCol_DataMapOfIntegerListOfInteger& aDMVLV,
280                                 const Standard_Integer aType = 0);
281   
282
283   //! Adds the existing edges from the map <theMPBOnIn> which interfere
284   //! with the vertices from <theMVB> map to the post treatment of section edges.
285   Standard_EXPORT void ProcessExistingPaveBlocks (const Standard_Integer theInt, const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, const BOPCol_DataMapOfIntegerListOfInteger& theDMBV, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, BOPCol_DataMapOfShapeInteger& theMVI, BOPDS_MapOfPaveBlock& theMPB);
286   
287
288   //! Replaces existing pave block <thePB> with new pave blocks <theLPB>.
289   //! The list <theLPB> contains images of <thePB> which were created in
290   //! the post treatment of section edges.
291   Standard_EXPORT void UpdateExistingPaveBlocks (const Handle(BOPDS_PaveBlock)& thePB, BOPDS_ListOfPaveBlock& theLPB, const Standard_Integer nF1, const Standard_Integer nF2);
292   
293
294   //! Treatment of vertices that were created in EE intersections.
295   Standard_EXPORT void TreatNewVertices(const BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMVCPB, BOPCol_IndexedDataMapOfShapeListOfShape& theImages);
296   
297
298   //! Put paves on the curve <aBC> in case when <aBC>
299   //! is closed 3D-curve
300   Standard_EXPORT void PutClosingPaveOnCurve (BOPDS_Curve& aNC);
301   
302
303   //! Keeps data for post treatment
304   Standard_EXPORT void PreparePostTreatFF (const Standard_Integer aInt, const Standard_Integer aCur, const Handle(BOPDS_PaveBlock)& aPB, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB, BOPCol_DataMapOfShapeInteger& aMVI, BOPDS_ListOfPaveBlock& aLPB);
305   
306
307   //! Refines the state On for the all faces having
308   //! state information
309   Standard_EXPORT void RefineFaceInfoOn();
310   
311
312   //! Updates the information about faces
313   Standard_EXPORT void UpdateFaceInfo (BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDME, const BOPCol_DataMapOfIntegerInteger& theDMV);
314   
315
316   //! Updates tolerance of vertex with index <nV>
317   //! to make it interfere with edge
318   Standard_EXPORT void ForceInterfVE (const Standard_Integer nV, Handle(BOPDS_PaveBlock)& aPB, BOPDS_MapOfPaveBlock& aMPB);
319   
320
321   //! Updates tolerance of vertex with index <nV>
322   //! to make it interfere with face with index <nF>
323   Standard_EXPORT Standard_Boolean ForceInterfVF (const Standard_Integer nV, const Standard_Integer nF);
324   
325
326   //! Checks if there are any common or intersecting sub shapes
327   //! between two planar faces.
328   Standard_EXPORT Standard_Boolean CheckPlanes (const Standard_Integer nF1, const Standard_Integer nF2) const;
329   
330
331   //! Creates new edge from the edge nE with vertices nV1 and nV2
332   //! and returns the index of that new edge in the DS.
333   Standard_EXPORT Standard_Integer SplitEdge (const Standard_Integer nE, const Standard_Integer nV1, const Standard_Real aT1, const Standard_Integer nV2, const Standard_Real aT2);
334   
335
336   //! Updates pave blocks which have the paves with indices contained
337   //! in the map <aDMNewSD>.
338   Standard_EXPORT void UpdatePaveBlocks(const BOPCol_DataMapOfIntegerInteger& aDMNewSD);
339
340   //! Updates tolerance vertex nV due to V/E interference.
341   //! It always creates new vertex if nV is from arguments.
342   //! @return  DS index of updated vertex.
343   Standard_EXPORT Standard_Integer UpdateVertex(const Standard_Integer nV,
344                                                 const Standard_Real aTolNew);
345    
346   Standard_EXPORT void UpdatePaveBlocksWithSDVertices();
347
348   Standard_EXPORT void UpdateCommonBlocksWithSDVertices();
349    
350   Standard_EXPORT void UpdateBlocksWithSharedVertices();
351    
352   Standard_EXPORT Standard_Boolean EstimatePaveOnCurve(const Standard_Integer nV,
353                                                        const BOPDS_Curve& theNC,
354                                                        const Standard_Real theTolR3D);
355       
356   Standard_EXPORT void UpdateEdgeTolerance(const Standard_Integer nE,
357                                            const Standard_Real aTolNew);
358
359   Standard_EXPORT void RemovePaveBlocks(const BOPCol_MapOfInteger theEdges);
360
361   Standard_EXPORT void CorrectToleranceOfSE();
362
363   //! Reduce the intersection range using the common ranges of
364   //! Edge/Edge interferences to avoid creation of close
365   //! intersection vertices
366   Standard_EXPORT void ReduceIntersectionRange(const Standard_Integer theV1,
367                                                const Standard_Integer theV2,
368                                                const Standard_Integer theE,
369                                                const Standard_Integer theF,
370                                                Standard_Real& theTS1,
371                                                Standard_Real& theTS2);
372
373   //! Gets the bounding box for the given Pave Block.
374   //! If Pave Block has shrunk data it will be used to get the box,
375   //! and the Shrunk Range (<theSFirst>, <theSLast>).
376   //! Otherwise the box will be computed using BndLib_Add3dCurve method,
377   //! and the Shrunk Range will be equal to the PB's range.
378   //! To avoid re-computation of the bounding box for the same Pave Block
379   //! it will be saved in the map <thePBBox>.
380   //! Returns FALSE in case the PB's range is less than the
381   //! Precision::PConfusion(), otherwise returns TRUE.
382   Standard_EXPORT Standard_Boolean GetPBBox(const TopoDS_Edge& theE,
383                                             const Handle(BOPDS_PaveBlock)& thePB,
384                                             BOPAlgo_DataMapOfPaveBlockBndBox& thePBBox,
385                                             Standard_Real& theFirst,
386                                             Standard_Real& theLast,
387                                             Standard_Real& theSFirst,
388                                             Standard_Real& theSLast,
389                                             Bnd_Box& theBox);
390
391   BOPCol_ListOfShape myArguments;
392   BOPDS_PDS myDS;
393   BOPDS_PIterator myIterator;
394   Handle(IntTools_Context) myContext;
395   BOPAlgo_SectionAttribute mySectionAttribute;
396   Standard_Boolean myNonDestructive;
397   Standard_Boolean myIsPrimary;
398
399
400 private:
401
402 };
403
404 #endif // _BOPAlgo_PaveFiller_HeaderFile