0026619: Tolerances of operands are modified using bop
[occt.git] / src / IntTools / IntTools_Context.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 _IntTools_Context_HeaderFile
16 #define _IntTools_Context_HeaderFile
17
18 #include <Standard.hxx>
19 #include <Standard_Type.hxx>
20
21 #include <BOPCol_BaseAllocator.hxx>
22 #include <BOPCol_DataMapOfShapeAddress.hxx>
23 #include <BOPCol_DataMapOfTransientAddress.hxx>
24 #include <Standard_Integer.hxx>
25 #include <Standard_Real.hxx>
26 #include <MMgt_TShared.hxx>
27 #include <TopAbs_State.hxx>
28 #include <Standard_Boolean.hxx>
29 class IntTools_FClass2d;
30 class TopoDS_Face;
31 class GeomAPI_ProjectPointOnSurf;
32 class GeomAPI_ProjectPointOnCurve;
33 class TopoDS_Edge;
34 class Geom_Curve;
35 class IntTools_SurfaceRangeLocalizeData;
36 class BRepClass3d_SolidClassifier;
37 class TopoDS_Solid;
38 class Geom2dHatch_Hatcher;
39 class gp_Pnt;
40 class TopoDS_Vertex;
41 class gp_Pnt2d;
42 class IntTools_Curve;
43 class Bnd_Box;
44 class TopoDS_Shape;
45
46
47 class IntTools_Context;
48 DEFINE_STANDARD_HANDLE(IntTools_Context, MMgt_TShared)
49
50
51 //! The intersection Context contains geometrical
52 //! and topological toolkit (classifiers, projectors, etc).
53 //! The intersection Context is for caching the tools
54 //! to increase the performance.
55 class IntTools_Context : public MMgt_TShared
56 {
57
58 public:
59
60   
61   Standard_EXPORT IntTools_Context();
62 Standard_EXPORT virtual  ~IntTools_Context();
63   
64   Standard_EXPORT IntTools_Context(const BOPCol_BaseAllocator& theAllocator);
65   
66
67   //! Returns a reference to point classifier
68   //! for given face
69   Standard_EXPORT IntTools_FClass2d& FClass2d (const TopoDS_Face& aF);
70   
71
72   //! Returns a reference to point projector
73   //! for given face
74   Standard_EXPORT GeomAPI_ProjectPointOnSurf& ProjPS (const TopoDS_Face& aF);
75   
76
77   //! Returns a reference to point projector
78   //! for given edge
79   Standard_EXPORT GeomAPI_ProjectPointOnCurve& ProjPC (const TopoDS_Edge& aE);
80   
81
82   //! Returns a reference to point projector
83   //! for given curve
84   Standard_EXPORT GeomAPI_ProjectPointOnCurve& ProjPT (const Handle(Geom_Curve)& aC);
85   
86
87   //! Returns a reference to surface localization data
88   //! for given face
89   Standard_EXPORT IntTools_SurfaceRangeLocalizeData& SurfaceData (const TopoDS_Face& aF);
90   
91
92   //! Returns a reference to solid classifier
93   //! for given solid
94   Standard_EXPORT BRepClass3d_SolidClassifier& SolidClassifier (const TopoDS_Solid& aSolid);
95   
96
97   //! Returns a reference to 2D hatcher
98   //! for given face
99   Standard_EXPORT Geom2dHatch_Hatcher& Hatcher (const TopoDS_Face& aF);
100   
101
102   //! Computes parameter of the Point theP on
103   //! the edge aE.
104   //! Returns zero if the distance between point
105   //! and edge is less than sum of tolerance value of edge and theTopP,
106   //! otherwise and for following conditions returns
107   //! negative value
108   //! 1. the edge is degenerated (-1)
109   //! 2. the edge does not contain 3d curve and pcurves (-2)
110   //! 3. projection algorithm failed (-3)
111   Standard_EXPORT Standard_Integer ComputePE (const gp_Pnt& theP, const Standard_Real theTolP, const TopoDS_Edge& theE, Standard_Real& theT);
112   
113
114   //! Computes parameter of the vertex aV on
115   //! the edge aE and new increased value of vertex tolerance.
116   //! Returns zero if the distance between vertex
117   //! and edge is less than sum of tolerances,
118   //! otherwise and for following conditions returns
119   //! negative value: <br>
120   //! 1. the edge is degenerated (-1) <br>
121   //! 2. the edge does not contain 3d curve and pcurves (-2) <br>
122   //! 3. projection algorithm failed (-3)
123   Standard_EXPORT Standard_Integer ComputeVE (const TopoDS_Vertex& aV,
124                                               const TopoDS_Edge& aE,
125                                               Standard_Real& aParam,
126                                               Standard_Real& aTolVnew);
127
128
129   //! Computes UV parameters of the vertex aV on face aF
130   //! and new increased value of vertex tolerance.
131   //! Returns zero if the distance between vertex and face is
132   //! less than or equal the sum of tolerances and the projection
133   //! point lays inside boundaries of the face.
134   //! For following conditions returns negative value <br>
135   //! 1. projection algorithm failed (-1) <br>
136   //! 2. distance is more than sum of tolerances (-2) <br>
137   //! 3. projection point out or on the boundaries of face (-3)
138   Standard_EXPORT Standard_Integer ComputeVF (const TopoDS_Vertex& aV,
139                                               const TopoDS_Face& aF,
140                                               Standard_Real& U,
141                                               Standard_Real& V,
142                                               Standard_Real& aTolVnew);
143
144
145   //! Returns the state of the point aP2D
146   //! relative to face aF
147   Standard_EXPORT TopAbs_State StatePointFace (const TopoDS_Face& aF, const gp_Pnt2d& aP2D);
148   
149
150   //! Returns true if the point aP2D is
151   //! inside the boundaries of the face aF,
152   //! otherwise returns false
153   Standard_EXPORT Standard_Boolean IsPointInFace (const TopoDS_Face& aF, const gp_Pnt2d& aP2D);
154   
155
156   //! Returns true if the point aP2D is
157   //! inside the boundaries of the face aF,
158   //! otherwise returns false
159   Standard_EXPORT Standard_Boolean IsPointInFace (const gp_Pnt& aP3D, const TopoDS_Face& aF, const Standard_Real aTol);
160   
161
162   //! Returns true if the point aP2D is
163   //! inside or on the boundaries of aF
164   Standard_EXPORT Standard_Boolean IsPointInOnFace (const TopoDS_Face& aF, const gp_Pnt2d& aP2D);
165   
166
167   //! Returns true if the distance between point aP3D
168   //! and face aF is less or equal to tolerance aTol
169   //! and projection point is inside or on the boundaries
170   //! of the face aF
171   Standard_EXPORT Standard_Boolean IsValidPointForFace (const gp_Pnt& aP3D, const TopoDS_Face& aF, const Standard_Real aTol);
172   
173
174   //! Returns true if IsValidPointForFace returns true
175   //! for both face aF1 and aF2
176   Standard_EXPORT Standard_Boolean IsValidPointForFaces (const gp_Pnt& aP3D, const TopoDS_Face& aF1, const TopoDS_Face& aF2, const Standard_Real aTol);
177   
178
179   //! Returns true if IsValidPointForFace returns true
180   //! for some 3d point that lay on the curve aIC bounded by
181   //! parameters aT1 and aT2
182   Standard_EXPORT Standard_Boolean IsValidBlockForFace (const Standard_Real aT1, const Standard_Real aT2, const IntTools_Curve& aIC, const TopoDS_Face& aF, const Standard_Real aTol);
183   
184
185   //! Returns true if IsValidBlockForFace returns true
186   //! for both faces aF1 and aF2
187   Standard_EXPORT Standard_Boolean IsValidBlockForFaces (const Standard_Real aT1, const Standard_Real aT2, const IntTools_Curve& aIC, const TopoDS_Face& aF1, const TopoDS_Face& aF2, const Standard_Real aTol);
188   
189
190   //! Computes parameter of the vertex aV on
191   //! the curve aIC.
192   //! Returns true if the distance between vertex and
193   //! curve is less than sum of tolerance of aV and aTolC,
194   //! otherwise or if projection algorithm failed
195   //! returns false (in this case aT isn't significant)
196   Standard_EXPORT Standard_Boolean IsVertexOnLine (const TopoDS_Vertex& aV, const IntTools_Curve& aIC, const Standard_Real aTolC, Standard_Real& aT);
197   
198
199   //! Computes parameter of the vertex aV on
200   //! the curve aIC.
201   //! Returns true if the distance between vertex and
202   //! curve is less than sum of tolerance of aV and aTolC,
203   //! otherwise or if projection algorithm failed
204   //! returns false (in this case aT isn't significant)
205   Standard_EXPORT Standard_Boolean IsVertexOnLine (const TopoDS_Vertex& aV, const Standard_Real aTolV, const IntTools_Curve& aIC, const Standard_Real aTolC, Standard_Real& aT);
206   
207
208   //! Computes parameter of the point aP on
209   //! the edge aE.
210   //! Returns false if projection algorithm failed
211   //! other wiese returns true.
212   Standard_EXPORT Standard_Boolean ProjectPointOnEdge (const gp_Pnt& aP, const TopoDS_Edge& aE, Standard_Real& aT);
213   
214   Standard_EXPORT Bnd_Box& BndBox (const TopoDS_Shape& theS);
215   
216   //! Returns true if the solid <theFace> has
217   //! infinite bounds
218   Standard_EXPORT Standard_Boolean IsInfiniteFace (const TopoDS_Face& theFace);
219   
220   //! Sets tolerance to be used for projection of point on surface.
221   //! Clears map of already cached projectors in order to maintain
222   //! correct value for all projectors
223   Standard_EXPORT void SetPOnSProjectionTolerance (const Standard_Real theValue);
224
225
226
227
228   DEFINE_STANDARD_RTTIEXT(IntTools_Context,MMgt_TShared)
229
230 protected:
231
232
233   BOPCol_BaseAllocator myAllocator;
234   BOPCol_DataMapOfShapeAddress myFClass2dMap;
235   BOPCol_DataMapOfShapeAddress myProjPSMap;
236   BOPCol_DataMapOfShapeAddress myProjPCMap;
237   BOPCol_DataMapOfShapeAddress mySClassMap;
238   BOPCol_DataMapOfTransientAddress myProjPTMap;
239   BOPCol_DataMapOfShapeAddress myHatcherMap;
240   BOPCol_DataMapOfShapeAddress myProjSDataMap;
241   BOPCol_DataMapOfShapeAddress myBndBoxDataMap;
242   Standard_Integer myCreateFlag;
243   Standard_Real myPOnSTolerance;
244
245
246 private:
247
248   
249   //! Clears map of already cached projectors.
250   Standard_EXPORT void clearCachedPOnSProjectors();
251
252
253
254 };
255
256
257
258
259
260
261
262 #endif // _IntTools_Context_HeaderFile