0030675: Visualization - remove redundant proxy classes in hierarchy of PrsMgr_Presen...
[occt.git] / src / IntTools / IntTools_ShrunkRange.cxx
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
16 #include <Bnd_Box.hxx>
17 #include <BRepLib.hxx>
18 #include <BndLib_Add3dCurve.hxx>
19 #include <BRep_Tool.hxx>
20 #include <BRepAdaptor_Curve.hxx>
21 #include <GCPnts_AbscissaPoint.hxx>
22 #include <IntTools_ShrunkRange.hxx>
23 #include <Precision.hxx>
24
25 //=======================================================================
26 //function : 
27 //purpose  : 
28 //=======================================================================
29   IntTools_ShrunkRange::IntTools_ShrunkRange ()
30 {
31   myT1=-99;
32   myT2=myT1;
33   myTS1=myT1;
34   myTS2=myT1;
35   myIsDone=Standard_False;
36   myIsSplittable=Standard_False;
37   myLength = 0.0;
38 }
39 //=======================================================================
40 //function : ~
41 //purpose  : 
42 //=======================================================================
43 IntTools_ShrunkRange::~IntTools_ShrunkRange () 
44 {
45 }
46 //=======================================================================
47 //function : SetData
48 //purpose  : 
49 //=======================================================================
50 void IntTools_ShrunkRange::SetData(const TopoDS_Edge& aE,
51                                    const Standard_Real aT1,
52                                    const Standard_Real aT2,
53                                    const TopoDS_Vertex& aV1,
54                                    const TopoDS_Vertex& aV2)
55 {
56   myEdge=aE;
57   myV1=aV1;
58   myV2=aV2;
59   myT1=aT1;
60   myT2=aT2;
61   myIsDone=Standard_False;
62   myIsSplittable=Standard_False;
63   myLength = 0.0;
64 }
65 //=======================================================================
66 //function : SetContext
67 //purpose  : 
68 //=======================================================================
69 void IntTools_ShrunkRange::SetContext(const Handle(IntTools_Context)& aCtx)
70 {
71   myCtx=aCtx;
72 }
73 //=======================================================================
74 //function : Context
75 //purpose  : 
76 //=======================================================================
77 const Handle(IntTools_Context)& IntTools_ShrunkRange::Context()const
78 {
79   return myCtx;
80 }
81 //=======================================================================
82 //function : Edge
83 //purpose  : 
84 //=======================================================================
85 const TopoDS_Edge& IntTools_ShrunkRange::Edge() const
86 {
87   return myEdge;
88 }
89 //=======================================================================
90 //function : ShrunkRange
91 //purpose  : 
92 //=======================================================================
93 void IntTools_ShrunkRange::ShrunkRange(Standard_Real& aT1,
94                                        Standard_Real& aT2) const
95 {
96   aT1=myTS1;
97   aT2=myTS2;
98 }
99 //=======================================================================
100 //function : BndBox
101 //purpose  : 
102 //=======================================================================
103 const Bnd_Box& IntTools_ShrunkRange::BndBox() const
104 {
105   return myBndBox;
106 }
107 //=======================================================================
108 //function : SetShrunkRange
109 //purpose  : 
110 //=======================================================================
111 void IntTools_ShrunkRange::SetShrunkRange(const Standard_Real aT1,
112                                           const Standard_Real aT2) 
113 {
114   myTS1=aT1;
115   myTS2=aT2;
116   //
117   BRepAdaptor_Curve aBAC(myEdge);
118   BndLib_Add3dCurve::Add(aBAC, aT1, aT2, 0., myBndBox);
119 }
120
121 //=======================================================================
122 //function : Perform
123 //purpose  : 
124 //=======================================================================
125 void IntTools_ShrunkRange::Perform()
126 {
127   myIsDone = Standard_False;
128   myIsSplittable = Standard_False;
129   //
130   // default tolerance - Precision::Confusion()
131   Standard_Real aDTol = Precision::Confusion();
132   // default parametric tolerance - Precision::PConfusion()
133   Standard_Real aPDTol = Precision::PConfusion();
134   //
135   if (myT2 - myT1 < aPDTol) {
136     return;
137   }
138   //
139   gp_Pnt aP1 = BRep_Tool::Pnt(myV1);
140   gp_Pnt aP2 = BRep_Tool::Pnt(myV2);
141   Standard_Real aTolE, aTolV1, aTolV2;
142   aTolE = BRep_Tool::Tolerance(myEdge);
143   aTolV1 = BRep_Tool::Tolerance(myV1);
144   aTolV2 = BRep_Tool::Tolerance(myV2);
145   //
146   if (aTolV1 < aTolE) {
147     aTolV1 = aTolE;
148   }
149   //
150   if (aTolV2 < aTolE) {
151     aTolV2 = aTolE;
152   }
153   //
154   // to have correspondence with intersection precision
155   // the tolerances of vertices are increased on Precision::Confusion()
156   aTolV1 += aDTol;
157   aTolV2 += aDTol;
158
159   // compute the shrunk range - part of the edge not covered
160   // by the tolerance spheres of its vertices
161   BRepAdaptor_Curve aBAC(myEdge);
162   if (!BRepLib::FindValidRange(aBAC, aTolE, myT1, aP1, aTolV1,
163                                myT2, aP2, aTolV2, myTS1, myTS2)) {
164     // no valid range
165     return;
166   }
167   if ((myTS2 - myTS1) < aPDTol) {
168     // micro edge
169     return;
170   }
171   //
172   // compute the length of the edge on the shrunk range
173   //
174   // parametric tolerance for the edge
175   // to be used in AbscissaPoint computations
176   Standard_Real aPTolE = aBAC.Resolution(aTolE);
177   // for the edges with big tolerance use 
178   // min parametric tolerance - 1% of its range
179   Standard_Real aPTolEMin = (myT2 - myT1) / 100.;
180   if (aPTolE > aPTolEMin) {
181     aPTolE = aPTolEMin;
182   }
183   myLength = GCPnts_AbscissaPoint::Length(aBAC, myTS1, myTS2, aPTolE);
184   if (myLength < aDTol) {
185     // micro edge
186     return;
187   }
188   //
189   myIsDone = Standard_True;
190   //
191   // check the shrunk range to have the length not less than
192   // 2*aTolE+2*Precision::Confusion()
193   // for the edge to have possibility to be split at least once:
194   // 2*TolE - minimal diameter of tolerance sphere of splitting vertex
195   // 2*Precision::Confusion() - minimal length of the new edges
196   if (myLength > (2 * aTolE + 2 * aDTol)) {
197     myIsSplittable = Standard_True;
198   }
199   //
200   // build bounding box for the edge on the shrunk range
201   BndLib_Add3dCurve::Add(aBAC, myTS1, myTS2, aTolE + aDTol, myBndBox);
202 }