0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / ShapeAnalysis / ShapeAnalysis_Curve.cxx
index 0d8b306..7062de7 100644 (file)
@@ -52,6 +52,7 @@
 #include <Geom2dAdaptor_Curve.hxx>
 #include <Geom_Circle.hxx>
 #include <Extrema_LocateExtPC.hxx>
+#include <Geom_BoundedCurve.hxx>
 
 //=======================================================================
 //function : ProjectOnSegments
@@ -122,10 +123,11 @@ Standard_Real ShapeAnalysis_Curve::Project(const Handle(Geom_Curve)& C3D,
   Standard_Real uMin = (cf < cl ? cf : cl);
   Standard_Real uMax = (cf < cl ? cl : cf);
   
+  GeomAdaptor_Curve GAC(C3D, uMin, uMax);
   if (C3D->IsKind(STANDARD_TYPE(Geom_BoundedCurve))) {
     Standard_Real prec = ( AdjustToEnds ? preci : Precision::Confusion() ); //:j8 abv 10 Dec 98: tr10_r0501_db.stp #9423: protection against densing of points near one end
-    gp_Pnt LowBound = C3D->Value(uMin);
-    gp_Pnt HigBound = C3D->Value(uMax);
+    gp_Pnt LowBound = GAC.Value(uMin);
+    gp_Pnt HigBound = GAC.Value(uMax);
     distmin = LowBound.Distance(P3D);
     if (distmin <= prec) {
       param = uMin;
@@ -140,7 +142,6 @@ Standard_Real ShapeAnalysis_Curve::Project(const Handle(Geom_Curve)& C3D,
     }
   }
 
-  GeomAdaptor_Curve GAC(C3D, uMin, uMax);
   if (!C3D->IsClosed()) {
     //modified by rln on 16/12/97 after CSR# PRO11641 entity 20767
     //the VIso was not closed (according to C3D->IsClosed()) while it "almost"
@@ -403,10 +404,11 @@ Standard_Real ShapeAnalysis_Curve::NextProject(const Standard_Real paramPrev,
   Standard_Real uMin = (cf < cl ? cf : cl);
   Standard_Real uMax = (cf < cl ? cl : cf);
   Standard_Real distmin = Precision::Infinite();
+  GeomAdaptor_Curve GAC(C3D, uMin, uMax);
   if (C3D->IsKind(STANDARD_TYPE(Geom_BoundedCurve))) {
     Standard_Real prec = ( AdjustToEnds ? preci : Precision::Confusion() ); //:j8 abv 10 Dec 98: tr10_r0501_db.stp #9423: protection against densing of points near one end
-    gp_Pnt LowBound = C3D->Value(uMin);
-    gp_Pnt HigBound = C3D->Value(uMax);
+    gp_Pnt LowBound = GAC.Value(uMin);
+    gp_Pnt HigBound = GAC.Value(uMax);
     distmin = LowBound.Distance(P3D);
     if (distmin <= prec) {
       param = uMin;
@@ -421,7 +423,6 @@ Standard_Real ShapeAnalysis_Curve::NextProject(const Standard_Real paramPrev,
     }
   }
 
-  GeomAdaptor_Curve GAC(C3D, uMin, uMax);
   if (!C3D->IsClosed()) {
     //modified by rln on 16/12/97 after CSR# PRO11641 entity 20767
     //the VIso was not closed (according to C3D->IsClosed()) while it "almost"
@@ -764,7 +765,7 @@ static gp_XYZ GetAnyNormal ( gp_XYZ orig )
 //purpose  : 
 //=======================================================================
 static void AppendControlPoles (TColgp_SequenceOfPnt& seq,
-                               const Handle(Geom_Curve) curve)
+                               const Handle(Geom_Curve)& curve)
 {
   if ( curve->IsKind(STANDARD_TYPE(Geom_Line))) {
     seq.Append(curve->Value(0));
@@ -775,7 +776,7 @@ static void AppendControlPoles (TColgp_SequenceOfPnt& seq,
     seq.Append(curve->Value(M_PI));
   } else if ( curve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
     //DeclareAndCast(Geom_TrimmedCurve, Trimmed, curve);
-    Handle(Geom_TrimmedCurve) Trimmed = *((Handle(Geom_TrimmedCurve) *) &curve);
+    Handle(Geom_TrimmedCurve) Trimmed = Handle(Geom_TrimmedCurve)::DownCast (curve);
 //     AppendControlPoles(seq,Trimmed->BasisCurve());
     Handle(Geom_Curve) aBaseCrv = Trimmed->BasisCurve();
     Standard_Boolean done = Standard_False;
@@ -810,14 +811,14 @@ static void AppendControlPoles (TColgp_SequenceOfPnt& seq,
     }
   } else if ( curve->IsKind(STANDARD_TYPE(Geom_OffsetCurve))) {
     //DeclareAndCast(Geom_OffsetCurve, OffsetC, curve);
-    Handle(Geom_OffsetCurve) OffsetC = *((Handle(Geom_OffsetCurve) *) &curve);
+    Handle(Geom_OffsetCurve) OffsetC = Handle(Geom_OffsetCurve)::DownCast (curve);
 //     AppendControlPoles(seq,OffsetC->BasisCurve());
     seq.Append(curve->Value(curve->FirstParameter()));
     seq.Append(curve->Value((curve->FirstParameter() + curve->LastParameter())/2.));
     seq.Append(curve->Value(curve->LastParameter()));
   } else if ( curve->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
     //DeclareAndCast(Geom_BSplineCurve, BSpline, curve);
-    Handle(Geom_BSplineCurve) BSpline = *((Handle(Geom_BSplineCurve) *) &curve);
+    Handle(Geom_BSplineCurve) BSpline = Handle(Geom_BSplineCurve)::DownCast (curve);
     TColgp_Array1OfPnt Poles(1,BSpline->NbPoles());
     BSpline->Poles(Poles);
     for(Standard_Integer i = 1; i <= BSpline->NbPoles(); i++)
@@ -825,7 +826,7 @@ static void AppendControlPoles (TColgp_SequenceOfPnt& seq,
   } else if ( curve->IsKind(STANDARD_TYPE(Geom_BezierCurve)))  {
     //DeclareAndCast(Geom_BezierCurve, Bezier, curve);
     //Handle(Geom_BezierCurve) Bezier = Handle(Geom_BezierCurve)::DownCast(curve);
-    Handle(Geom_BezierCurve) Bezier = *((Handle(Geom_BezierCurve) *) &curve);
+    Handle(Geom_BezierCurve) Bezier = Handle(Geom_BezierCurve)::DownCast (curve);
     TColgp_Array1OfPnt Poles(1,Bezier->NbPoles());
     Bezier->Poles(Poles);
     for(Standard_Integer i = 1; i <= Bezier->NbPoles(); i++)
@@ -914,7 +915,7 @@ Standard_Boolean ShapeAnalysis_Curve::IsPlanar (const TColgp_Array1OfPnt& pnts,
 
   if (curve->IsKind(STANDARD_TYPE(Geom_Line))) {
     //DeclareAndCast(Geom_Line, Line, curve);
-    Handle(Geom_Line) Line = *((Handle(Geom_Line) *) &curve);
+    Handle(Geom_Line) Line = Handle(Geom_Line)::DownCast (curve);
     gp_XYZ N1 = Line->Position().Direction().XYZ();
     if (noNorm) {
       Normal = GetAnyNormal(N1);
@@ -925,7 +926,7 @@ Standard_Boolean ShapeAnalysis_Curve::IsPlanar (const TColgp_Array1OfPnt& pnts,
 
   if (curve->IsKind(STANDARD_TYPE(Geom_Conic))) {
     //DeclareAndCast(Geom_Conic, Conic, curve);
-    Handle(Geom_Conic) Conic = *((Handle(Geom_Conic) *) &curve);
+    Handle(Geom_Conic) Conic = Handle(Geom_Conic)::DownCast (curve);
     gp_XYZ N1 = Conic->Axis().Direction().XYZ();
     if (noNorm) {
       Normal = N1;
@@ -937,19 +938,19 @@ Standard_Boolean ShapeAnalysis_Curve::IsPlanar (const TColgp_Array1OfPnt& pnts,
 
   if (curve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
     //DeclareAndCast(Geom_TrimmedCurve, Trimmed, curve);
-    Handle(Geom_TrimmedCurve) Trimmed = *((Handle(Geom_TrimmedCurve) *) &curve);
+    Handle(Geom_TrimmedCurve) Trimmed = Handle(Geom_TrimmedCurve)::DownCast (curve);
     return IsPlanar(Trimmed->BasisCurve(),Normal,precision);
   }
 
   if (curve->IsKind(STANDARD_TYPE(Geom_OffsetCurve))) {
     //DeclareAndCast(Geom_OffsetCurve, OffsetC, curve);
-    Handle(Geom_OffsetCurve) OffsetC = *((Handle(Geom_OffsetCurve) *) &curve);
+    Handle(Geom_OffsetCurve) OffsetC = Handle(Geom_OffsetCurve)::DownCast (curve);
     return IsPlanar(OffsetC->BasisCurve(),Normal,precision);
   }
 
   if (curve->IsKind(STANDARD_TYPE(Geom_BSplineCurve))) {
     //DeclareAndCast(Geom_BSplineCurve, BSpline, curve);
-    Handle(Geom_BSplineCurve) BSpline = *((Handle(Geom_BSplineCurve) *) &curve);
+    Handle(Geom_BSplineCurve) BSpline = Handle(Geom_BSplineCurve)::DownCast (curve);
     TColgp_Array1OfPnt Poles(1,BSpline->NbPoles());
     BSpline->Poles(Poles);
     return IsPlanar(Poles,Normal,precision);
@@ -957,7 +958,7 @@ Standard_Boolean ShapeAnalysis_Curve::IsPlanar (const TColgp_Array1OfPnt& pnts,
 
   if (curve->IsKind(STANDARD_TYPE(Geom_BezierCurve))) {
     //DeclareAndCast(Geom_BezierCurve, Bezier, curve);
-    Handle(Geom_BezierCurve) Bezier = *((Handle(Geom_BezierCurve) *) &curve);
+    Handle(Geom_BezierCurve) Bezier = Handle(Geom_BezierCurve)::DownCast (curve);
     TColgp_Array1OfPnt Poles(1,Bezier->NbPoles());
     Bezier->Poles(Poles);
     return IsPlanar(Poles,Normal,precision);
@@ -965,7 +966,7 @@ Standard_Boolean ShapeAnalysis_Curve::IsPlanar (const TColgp_Array1OfPnt& pnts,
 
   if (curve->IsKind(STANDARD_TYPE(ShapeExtend_ComplexCurve))) {
     //DeclareAndCast(ShapeExtend_ComplexCurve, Complex, curve);
-    Handle(ShapeExtend_ComplexCurve) Complex = *((Handle(ShapeExtend_ComplexCurve) *) &curve);
+    Handle(ShapeExtend_ComplexCurve) Complex = Handle(ShapeExtend_ComplexCurve)::DownCast (curve);
     TColgp_SequenceOfPnt sequence;
     Standard_Integer i; // svv Jan11 2000 : porting on DEC
     for (i = 1; i <= Complex->NbCurves(); i++)
@@ -1017,11 +1018,13 @@ Standard_Boolean ShapeAnalysis_Curve::GetSamplePoints (const Handle(Geom_Curve)&
     Handle(Geom_TrimmedCurve) aC = Handle(Geom_TrimmedCurve)::DownCast(curve);
     return GetSamplePoints(aC->BasisCurve(),first,last,seq);
   }
+
+  GeomAdaptor_Curve GAC(curve);
   Standard_Real step = ( last - first ) / (Standard_Real)( nbp - 1 );
   Standard_Real par = first, stop = last - 0.5 * step;
   for ( ; par < stop; par += step )
-    seq.Append(curve->Value(par));
-  seq.Append(curve->Value(last));
+    seq.Append(GAC.Value(par));
+  seq.Append(GAC.Value(last));
   return Standard_True;
 }
 //=======================================================================
@@ -1043,8 +1046,8 @@ Standard_Boolean ShapeAnalysis_Curve::GetSamplePoints (const Handle(Geom2d_Curve
   Standard_Real step = ( last - first ) / (Standard_Real)( nbs - 1 );
   Standard_Real par = first, stop = last - 0.5 * step;
   for ( ; par < stop; par += step )
-    seq.Append(curve->Value(par));
-  seq.Append(curve->Value(last));
+    seq.Append(C.Value(par));
+  seq.Append(C.Value(last));
   return Standard_True;
 /*
   Standard_Integer i;