2 // Created: Tue Aug 1 09:24:34 2000
3 // Author: Peter KURNEV
7 #include <IntTools.ixx>
8 #include <GProp_GProps.hxx>
9 #include <BRepGProp.hxx>
10 #include <BRep_Tool.hxx>
11 #include <IntTools_Root.hxx>
12 #include <IntTools_Array1OfRoots.hxx>
13 #include <IntTools_Compare.hxx>
14 #include <IntTools_QuickSort.hxx>
15 #include <IntTools_Root.hxx>
17 #include <gce_MakeCirc.hxx>
18 #include <gp_Circ.hxx>
19 #include <BRepAdaptor_Curve.hxx>
20 #include <IntTools_CArray1OfReal.hxx>
21 #include <TColStd_ListOfReal.hxx>
22 #include <GCPnts_QuasiUniformDeflection.hxx>
23 #include <TColStd_ListIteratorOfListOfReal.hxx>
24 #include <gce_ErrorType.hxx>
27 #pragma warning ( disable : 4101 )
29 //=======================================================================
30 //function : IntTools::GetRadius
32 //=======================================================================
33 Standard_Integer IntTools::GetRadius(const BRepAdaptor_Curve& C,
34 const Standard_Real t1,
35 const Standard_Real t3,
38 GeomAbs_CurveType aType=C.GetType();
39 if (aType==GeomAbs_Line) {
43 if (aType==GeomAbs_Circle) {
44 gp_Circ aCrc=C.Circle();
59 gce_MakeCirc aMakeCirc(P1, P2, P3);
60 gce_ErrorType anErrorType;
62 anErrorType=aMakeCirc.Status();
64 if (!aMakeCirc.IsDone()) {
66 if (anErrorType==gce_ConfusedPoints ||
67 anErrorType==gce_IntersectionError ||
68 anErrorType==gce_ColinearPoints) {//modified by NIZNHY-PKV Fri Sep 24 09:54:05 2004ft
75 gp_Circ aCirc=aMakeCirc.Value();
81 //=======================================================================
82 //function : PrepareArgs
84 //=======================================================================
85 Standard_Integer IntTools::PrepareArgs(BRepAdaptor_Curve& C,
86 const Standard_Real Tmax,
87 const Standard_Real Tmin,
88 const Standard_Integer Discret,
89 const Standard_Real Deflection,
90 IntTools_CArray1OfReal& anArgs)
93 TColStd_ListOfReal aPars;
94 Standard_Real dt, tCurrent, tNext, aR, anAbsDeflection;
95 Standard_Integer ip, i, j, aNbDeflectionPoints, aDiscretBis;
96 Standard_Boolean aRFlag;
98 GeomAbs_CurveType aCurveType;
99 aCurveType=C.GetType();
101 dt=(Tmax-Tmin)/Discret;
103 for (i=1; i<=Discret; i++) {
104 tCurrent=Tmin+(i-1)*dt;
105 aPars.Append(tCurrent);
109 ///////////////////////////////////////////////////
113 if (aCurveType==GeomAbs_BSplineCurve||
114 aCurveType==GeomAbs_BezierCurve ||
115 aCurveType==GeomAbs_Ellipse ||
116 aCurveType==GeomAbs_OtherCurve) { //modified by NIZNHY-PKV Fri Sep 24 09:52:42 2004ft
120 ip=IntTools::GetRadius (C, tCurrent, tNext, aR);
126 anAbsDeflection=Deflection*aR;
127 GCPnts_QuasiUniformDeflection anUD;
128 anUD.Initialize (C, anAbsDeflection, tCurrent, tNext);
129 if (!anUD.IsDone()) {
133 aNbDeflectionPoints=anUD.NbPoints();
134 if (aNbDeflectionPoints > 2) {
135 aNbDeflectionPoints--;
136 for (j=2; j<=aNbDeflectionPoints; j++) {
137 tCurrent=anUD.Parameter(j);
138 aPars.Append(tCurrent);
145 aDiscretBis=aPars.Extent();
146 anArgs.Resize(aDiscretBis);
147 TColStd_ListIteratorOfListOfReal anIt(aPars);
148 for (i=0; anIt.More(); anIt.Next(), i++) {
149 anArgs(i)=anIt.Value();
154 //=======================================================================
155 //function : IntTools::Length
157 //=======================================================================
158 Standard_Real IntTools::Length (const TopoDS_Edge& anEdge)
160 Standard_Real aLength=0;
162 if (!BRep_Tool::Degenerated(anEdge) &&
163 BRep_Tool::IsGeometric(anEdge)) {
166 BRepGProp::LinearProperties(anEdge, Temp);
167 aLength = Temp.Mass();
172 //=======================================================================
173 //function : RemoveIdenticalRoots
175 //=======================================================================
176 void IntTools::RemoveIdenticalRoots(IntTools_SequenceOfRoots& aSR,
177 const Standard_Real anEpsT)
179 Standard_Integer aNbRoots, j, k;
180 Standard_Real anEpsT2=0.5*anEpsT;
181 aNbRoots=aSR.Length();
182 for (j=1; j<=aNbRoots; j++) {
183 const IntTools_Root& aRj=aSR(j);
184 for (k=j+1; k<=aNbRoots; k++) {
185 const IntTools_Root& aRk=aSR(k);
186 if (fabs (aRj.Root()-aRk.Root()) < anEpsT2) {
188 aNbRoots=aSR.Length();
194 //=======================================================================
195 //function : SortRoots
197 //=======================================================================
198 void IntTools::SortRoots(IntTools_SequenceOfRoots& mySequenceOfRoots,
199 const Standard_Real myEpsT)
201 Standard_Integer j, aNbRoots;
203 aNbRoots=mySequenceOfRoots.Length();
205 IntTools_Array1OfRoots anArray1OfRoots(1, aNbRoots);
206 IntTools_Compare aComparator(myEpsT);
208 for (j=1; j<=aNbRoots; j++) {
209 anArray1OfRoots(j)=mySequenceOfRoots(j);
212 IntTools_QuickSort aQS;
213 aQS.Sort(anArray1OfRoots, aComparator);
215 mySequenceOfRoots.Clear();
216 for (j=1; j<=aNbRoots; j++) {
217 mySequenceOfRoots.Append(anArray1OfRoots(j));
220 //=======================================================================
221 //function :FindRootStates
223 //=======================================================================
224 void IntTools::FindRootStates(IntTools_SequenceOfRoots& mySequenceOfRoots,
225 const Standard_Real myEpsNull)
227 Standard_Integer aType, j, aNbRoots;
228 Standard_Real t, t1, t2, f1, f2, absf1, absf2;
230 aNbRoots=mySequenceOfRoots.Length();
232 for (j=1; j<=aNbRoots; j++) {
233 IntTools_Root& aR=mySequenceOfRoots.ChangeValue(j);
236 aR.Interval (t1, t2, f1, f2);
240 case 0: // Simple Root
241 if (f1>0. && f2<0.) {
242 aR.SetStateBefore(TopAbs_OUT);
243 aR.SetStateAfter (TopAbs_IN);
246 aR.SetStateBefore(TopAbs_IN);
247 aR.SetStateAfter (TopAbs_OUT);
251 case 1: // Complete 0;
252 aR.SetStateBefore(TopAbs_ON);
253 aR.SetStateAfter (TopAbs_ON);
259 if (absf2 < myEpsNull) {
260 aR.SetStateAfter (TopAbs_ON);
262 aR.SetStateBefore(TopAbs_OUT);
265 aR.SetStateBefore(TopAbs_IN);
270 aR.SetStateBefore(TopAbs_ON);
272 aR.SetStateAfter (TopAbs_OUT);
275 aR.SetStateAfter (TopAbs_IN);
284 #include <GeomAdaptor_Curve.hxx>
285 #include <gp_Pnt.hxx>
286 #include <ElCLib.hxx>
287 #include <gp_Lin.hxx>
288 #include <gp_Circ.hxx>
289 #include <gp_Elips.hxx>
290 #include <gp_Hypr.hxx>
291 #include <gp_Parab.hxx>
292 #include <GeomAPI_ProjectPointOnCurve.hxx>
294 //=======================================================================
295 //function :Parameter
297 //=======================================================================
298 Standard_Integer IntTools::Parameter (const gp_Pnt& aP,
299 const Handle(Geom_Curve)& aCurve,
300 Standard_Real& aParameter)
302 Standard_Real aFirst, aLast;
303 GeomAbs_CurveType aCurveType;
305 aFirst=aCurve->FirstParameter();
306 aLast =aCurve->LastParameter ();
308 GeomAdaptor_Curve aGAC;
310 aGAC.Load (aCurve, aFirst, aLast);
312 aCurveType=aGAC.GetType();
318 gp_Lin aLin=aGAC.Line();
319 aParameter=ElCLib::Parameter (aLin, aP);
324 gp_Circ aCircle=aGAC.Circle();
325 aParameter=ElCLib::Parameter (aCircle, aP);
328 case GeomAbs_Ellipse:
330 gp_Elips aElips=aGAC.Ellipse();
331 aParameter=ElCLib::Parameter (aElips, aP);
334 case GeomAbs_Hyperbola:
336 gp_Hypr aHypr=aGAC.Hyperbola();
337 aParameter=ElCLib::Parameter (aHypr, aP);
340 case GeomAbs_Parabola:
342 gp_Parab aParab=aGAC.Parabola();
343 aParameter=ElCLib::Parameter (aParab, aP);
347 case GeomAbs_BezierCurve:
348 case GeomAbs_BSplineCurve:
350 GeomAPI_ProjectPointOnCurve aProjector;
352 aProjector.Init(aP, aCurve, aFirst, aLast);
353 Standard_Integer aNbPoints=aProjector.NbPoints();
355 aParameter=aProjector.LowerDistanceParameter();
370 #pragma warning ( default : 4101 )