a43ab1f008cbd7c6eb4c27606d1969a3b12665df
[occt.git] / src / BOPAlgo / BOPAlgo_Tools.hxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _BOPAlgo_Tools_HeaderFile
16 #define _BOPAlgo_Tools_HeaderFile
17
18 #include <Standard.hxx>
19 #include <Standard_DefineAlloc.hxx>
20 #include <Standard_Handle.hxx>
21
22 #include <BOPCol_BaseAllocator.hxx>
23 #include <BOPDS_IndexedDataMapOfPaveBlockListOfInteger.hxx>
24 #include <BOPCol_IndexedDataMapOfShapeReal.hxx>
25 #include <BOPCol_ListOfListOfShape.hxx>
26 #include <BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock.hxx>
27 #include <BOPDS_PDS.hxx>
28 #include <Standard_Integer.hxx>
29
30 class BOPDS_PaveBlock;
31 class BOPDS_CommonBlock;
32 class IntTools_Context;
33 class TopoDS_Shape;
34
35 class BOPAlgo_Tools
36 {
37 public:
38
39   //! Makes the chains of the connected elements from the given connexity map
40   template <class theType, class theTypeHasher>
41   static void MakeBlocks(const NCollection_IndexedDataMap<theType, NCollection_List<theType>, theTypeHasher>& theMILI,
42                          NCollection_List<NCollection_List<theType>>& theMBlocks,
43                          const BOPCol_BaseAllocator& theAllocator)
44   {
45     NCollection_Map<theType, theTypeHasher> aMFence;
46     Standard_Integer i, aNb = theMILI.Extent();
47     for (i = 1; i <= aNb; ++i) {
48       const theType& n = theMILI.FindKey(i);
49       if (!aMFence.Add(n))
50         continue;
51       //
52       // Start the chain
53       NCollection_List<theType>& aChain = theMBlocks.Append(NCollection_List<theType>(theAllocator));
54       aChain.Append(n);
55       // Look for connected elements
56       typename NCollection_List<theType>::Iterator aItLChain(aChain);
57       for (; aItLChain.More(); aItLChain.Next()) {
58         const theType& n1 = aItLChain.Value();
59         const NCollection_List<theType>& aLI = theMILI.FindFromKey(n1);
60         // Add connected elements into the chain
61         typename NCollection_List<theType>::Iterator aItLI(aLI);
62         for (; aItLI.More(); aItLI.Next()) {
63           const theType& n2 = aItLI.Value();
64           if (aMFence.Add(n2)) {
65             aChain.Append(n2);
66           }
67         }
68       }
69     }
70   }
71
72   //! Fills the map with the connected entities
73   template <class theType, class theTypeHasher>
74   static void FillMap(const theType& n1,
75                       const theType& n2,
76                       NCollection_IndexedDataMap<theType, NCollection_List<theType>, theTypeHasher>& theMILI,
77                       const BOPCol_BaseAllocator& theAllocator)
78   {
79     NCollection_List<theType> *pList1 = theMILI.ChangeSeek(n1);
80     if (!pList1) {
81       pList1 = &theMILI(theMILI.Add(n1, NCollection_List<theType>(theAllocator)));
82     }
83     pList1->Append(n2);
84     //
85     NCollection_List<theType> *pList2 = theMILI.ChangeSeek(n2);
86     if (!pList2) {
87       pList2 = &theMILI(theMILI.Add(n2, NCollection_List<theType>(theAllocator)));
88     }
89     pList2->Append(n1);
90   }
91
92   Standard_EXPORT static void FillMap(const Handle(BOPDS_PaveBlock)& thePB1,
93                                       const Standard_Integer theF,
94                                       BOPDS_IndexedDataMapOfPaveBlockListOfInteger& theMILI,
95                                       const BOPCol_BaseAllocator& theAllocator);
96   
97   Standard_EXPORT static void PerformCommonBlocks(BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock& theMBlocks,
98                                                   const BOPCol_BaseAllocator& theAllocator,
99                                                   BOPDS_PDS& theDS);
100
101   Standard_EXPORT static void PerformCommonBlocks(const BOPDS_IndexedDataMapOfPaveBlockListOfInteger& theMBlocks,
102                                                   const BOPCol_BaseAllocator& theAllocator,
103                                                   BOPDS_PDS& pDS);
104
105   Standard_EXPORT static Standard_Real ComputeToleranceOfCB
106                                         (const Handle(BOPDS_CommonBlock)& theCB,
107                                          const BOPDS_PDS theDS,
108                                          const Handle(IntTools_Context)& theContext);
109
110   //! Creates planar wires from the given edges.<br>
111   //! The input edges are expected to be planar. And for the performance
112   //! sake the method does not check if the edges are really planar.<br>
113   //! Thus, the result wires will also be not planar if the input edges are not planar.<br>
114   //! The edges may be not shared, but the resulting wires will be sharing the
115   //! coinciding parts and intersecting parts.<br>
116   //! The output wires may be non-manifold and contain free and multi-connected vertices.<br>
117   //! Parameters:
118   //! <theEdges> - input edges;<br>
119   //! <theWires> - output wires;<br>
120   //! <theShared> - boolean flag which defines whether the input edges are already
121   //!               shared or have to be intersected;<br>
122   //! <theAngTol> - the angular tolerance which will be used for distinguishing
123   //!               the planes in which the edges are located. Default value is
124   //!               1.e-8 which is used for intersection of planes in IntTools_FaceFace.<br>
125   //! Method returns the following error statuses:<br>
126   //! 0 - in case of success (at least one wire has been built);<br>
127   //! 1 - in case there are no edges in the given shape;<br>
128   //! 2 - sharing of the edges has failed.<br>
129   Standard_EXPORT static Standard_Integer EdgesToWires(const TopoDS_Shape& theEdges,
130                                                        TopoDS_Shape& theWires,
131                                                        const Standard_Boolean theShared = Standard_False,
132                                                        const Standard_Real theAngTol = 1.e-8);
133
134   //! Creates planar faces from given planar wires.<br>
135   //! The method does not check if the wires are really planar.<br>
136   //! The input wires may be non-manifold but should be shared.<br>
137   //! The wires located in the same planes and included into other wires will create
138   //! holes in the faces built from outer wires.<br>
139   //! The tolerance values of the input shapes may be modified during the operation
140   //! due to projection of the edges on the planes for creation of 2D curves.<br>
141   //! Parameters:
142   //! <theWires> - the given wires;<br>
143   //! <theFaces> - the output faces;<br>
144   //! <theAngTol> - the angular tolerance for distinguishing the planes in which
145   //!               the wires are located. Default value is 1.e-8 which is used
146   //!               for intersection of planes in IntTools_FaceFace.<br>
147   //! Method returns TRUE in case of success, i.e. at least one face has been built.<br>
148   Standard_EXPORT static Standard_Boolean WiresToFaces(const TopoDS_Shape& theWires,
149                                                        TopoDS_Shape& theFaces,
150                                                        const Standard_Real theAngTol = 1.e-8);
151
152   //! Finds chains of intersecting vertices
153   Standard_EXPORT static void IntersectVertices(const BOPCol_IndexedDataMapOfShapeReal& theVertices,
154                                                 const Standard_Boolean theRunParallel,
155                                                 const Standard_Real theFuzzyValue,
156                                                 BOPCol_ListOfListOfShape& theChains);
157
158 };
159
160 #endif // _BOPAlgo_Tools_HeaderFile