1 // Created on: 1993-04-29
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
22 // 20/02/97 : PMN -> Positionement local sur BSpline (PRO6902)
23 // 10/07/97 : PMN -> Pas de calcul de resolution dans Nb(Intervals)(PRO9248)
24 // 20/10/97 : RBV -> traitement des offset curves
26 #define No_Standard_RangeError
27 #define No_Standard_OutOfRange
29 #include <GeomAdaptor_Curve.ixx>
31 #include <GeomAdaptor_HCurve.hxx>
32 #include <Adaptor3d_HCurve.hxx>
33 #include <BSplCLib.hxx>
34 #include <GeomAbs_Shape.hxx>
35 #include <TColgp_Array1OfPnt.hxx>
36 #include <TColStd_Array1OfReal.hxx>
37 #include <TColStd_Array1OfInteger.hxx>
38 #include <TColStd_HArray1OfInteger.hxx>
39 #include <Precision.hxx>
40 #include <Geom_TrimmedCurve.hxx>
41 #include <Geom_Circle.hxx>
42 #include <Geom_Line.hxx>
43 #include <Geom_TrimmedCurve.hxx>
44 #include <Geom_BezierCurve.hxx>
45 #include <Geom_BSplineCurve.hxx>
46 #include <Geom_Ellipse.hxx>
47 #include <Geom_Parabola.hxx>
48 #include <Geom_Hyperbola.hxx>
49 //#include <GeomConvert_BSplineCurveKnotSplitting.hxx>
51 #include <Standard_OutOfRange.hxx>
52 #include <Standard_NoSuchObject.hxx>
53 #include <Standard_NullObject.hxx>
54 #include <Standard_NotImplemented.hxx>
55 #include <Geom_OffsetCurve.hxx>
57 #define myBspl (*((Handle(Geom_BSplineCurve)*)&myCurve))
58 #define PosTol Precision::PConfusion()/2
60 //=======================================================================
61 //function : LocalContinuity
62 //purpose : Computes the Continuity of a BSplineCurve
63 // between the parameters U1 and U2
64 // The continuity is C(d-m)
66 // m = max multiplicity of the Knots between U1 and U2
67 //=======================================================================
69 GeomAbs_Shape GeomAdaptor_Curve::LocalContinuity(const Standard_Real U1,
70 const Standard_Real U2)
73 Standard_NoSuchObject_Raise_if(myTypeCurve!=GeomAbs_BSplineCurve," ");
74 Standard_Integer Nb = myBspl->NbKnots();
75 Standard_Integer Index1 = 0;
76 Standard_Integer Index2 = 0;
77 Standard_Real newFirst, newLast;
78 TColStd_Array1OfReal TK(1,Nb);
79 TColStd_Array1OfInteger TM(1,Nb);
81 myBspl->Multiplicities(TM);
82 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,U1,myBspl->IsPeriodic(),
83 1,Nb,Index1,newFirst);
84 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,U2,myBspl->IsPeriodic(),
86 if ( Abs(newFirst-TK(Index1+1))<Precision::PConfusion()) {
87 if (Index1 < Nb) Index1++;
89 if ( Abs(newLast-TK(Index2))<Precision::PConfusion())
91 Standard_Integer MultMax;
92 // attention aux courbes peridiques.
93 if ( (myBspl->IsPeriodic()) && (Index1 == Nb) )
96 if ( Index2 - Index1 <= 0) {
97 MultMax = 100; // CN entre 2 Noeuds consecutifs
100 MultMax = TM(Index1+1);
101 for(Standard_Integer i = Index1+1;i<=Index2;i++) {
102 if ( TM(i)>MultMax) MultMax=TM(i);
104 MultMax = myBspl->Degree() - MultMax;
109 else if ( MultMax == 1) {
112 else if ( MultMax == 2) {
115 else if ( MultMax == 3) {
124 //=======================================================================
127 //=======================================================================
129 void GeomAdaptor_Curve::load(const Handle(Geom_Curve)& C,
130 const Standard_Real UFirst,
131 const Standard_Real ULast)
139 const Handle(Standard_Type)& TheType = C->DynamicType();
140 if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) {
141 Load((*((Handle(Geom_TrimmedCurve)*)&C))->BasisCurve(),UFirst,ULast);
143 else if ( TheType == STANDARD_TYPE(Geom_Circle)) {
144 myTypeCurve = GeomAbs_Circle;
146 else if ( TheType ==STANDARD_TYPE(Geom_Line)) {
147 myTypeCurve = GeomAbs_Line;
149 else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) {
150 myTypeCurve = GeomAbs_Ellipse;
152 else if ( TheType == STANDARD_TYPE(Geom_Parabola)) {
153 myTypeCurve = GeomAbs_Parabola;
155 else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) {
156 myTypeCurve = GeomAbs_Hyperbola;
158 else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) {
159 myTypeCurve = GeomAbs_BezierCurve;
161 else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) {
162 myTypeCurve = GeomAbs_BSplineCurve;
165 myTypeCurve = GeomAbs_OtherCurve;
171 // -- Global methods - Apply to the whole curve.
174 //=======================================================================
175 //function : Continuity
177 //=======================================================================
179 GeomAbs_Shape GeomAdaptor_Curve::Continuity() const
181 if (myTypeCurve == GeomAbs_BSplineCurve)
182 return LocalContinuity(myFirst, myLast);
184 if (myCurve->IsKind(STANDARD_TYPE(Geom_OffsetCurve)))
186 const GeomAbs_Shape S =
187 (*((Handle(Geom_OffsetCurve)*)&myCurve))->BasisCurve()->Continuity();
190 case GeomAbs_CN: return GeomAbs_CN;
191 case GeomAbs_C3: return GeomAbs_C2;
192 case GeomAbs_C2: return GeomAbs_C1;
193 case GeomAbs_C1: return GeomAbs_C0;
195 Standard_NoSuchObject::Raise("GeomAdaptor_Curve::Continuity");
198 else if (myTypeCurve == GeomAbs_OtherCurve) {
199 Standard_NoSuchObject::Raise("GeomAdaptor_Curve::Contunuity");
205 //=======================================================================
206 //function : NbIntervals
208 //=======================================================================
210 Standard_Integer GeomAdaptor_Curve::NbIntervals(const GeomAbs_Shape S)
212 Standard_Integer myNbIntervals = 1;
213 Standard_Integer NbSplit;
214 if (myTypeCurve == GeomAbs_BSplineCurve) {
215 Standard_Integer FirstIndex = myBspl->FirstUKnotIndex();
216 Standard_Integer LastIndex = myBspl->LastUKnotIndex();
217 TColStd_Array1OfInteger Inter (1, LastIndex-FirstIndex+1);
218 if ( S > Continuity()) {
219 Standard_Integer Cont;
223 Standard_DomainError::Raise("GeomAdaptor_Curve::NbIntervals");
233 if ( S == GeomAbs_C1) Cont = 1;
234 else if ( S == GeomAbs_C2) Cont = 2;
235 else if ( S == GeomAbs_C3) Cont = 3;
236 else Cont = myBspl->Degree();
237 Standard_Integer FirstIndex = myBspl->FirstUKnotIndex();
238 Standard_Integer LastIndex = myBspl->LastUKnotIndex();
239 Standard_Integer Degree = myBspl->Degree();
240 Standard_Integer NbKnots = myBspl->NbKnots();
241 TColStd_Array1OfInteger Mults (1, NbKnots);
242 myBspl->Multiplicities (Mults);
244 Standard_Integer Index = FirstIndex;
245 Inter (NbSplit) = Index;
248 while (Index < LastIndex)
250 if (Degree - Mults (Index) < Cont)
252 Inter (NbSplit) = Index;
257 Inter (NbSplit) = Index;
259 Standard_Integer NbInt = NbSplit-1;
261 Standard_Integer Nb = myBspl->NbKnots();
262 Standard_Integer Index1 = 0;
263 Standard_Integer Index2 = 0;
264 Standard_Real newFirst, newLast;
265 TColStd_Array1OfReal TK(1,Nb);
266 TColStd_Array1OfInteger TM(1,Nb);
268 myBspl->Multiplicities(TM);
269 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,myFirst,
270 myBspl->IsPeriodic(),
271 1,Nb,Index1,newFirst);
272 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,myLast,
273 myBspl->IsPeriodic(),
274 1,Nb,Index2,newLast);
276 // On decale eventuellement les indices
277 // On utilise une "petite" tolerance, la resolution ne doit
278 // servir que pour les tres longue courbes....(PRO9248)
279 Standard_Real Eps = Min(Resolution(Precision::Confusion()),
280 Precision::PConfusion());
281 if ( Abs(newFirst-TK(Index1+1))< Eps) Index1++;
282 if ( newLast-TK(Index2)> Eps) Index2++;
285 for ( Standard_Integer i=1; i<=NbInt; i++)
286 if (Inter(i)>Index1 && Inter(i)<Index2) myNbIntervals++;
293 else if (myCurve->IsKind(STANDARD_TYPE(Geom_OffsetCurve))){
294 GeomAbs_Shape BaseS=GeomAbs_C0;
298 Standard_DomainError::Raise("GeomAdaptor_Curve::NbIntervals");
300 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
301 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
302 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
303 default: BaseS = GeomAbs_CN;
306 ((*((Handle(Geom_OffsetCurve)*)&myCurve))->BasisCurve());
307 // akm 05/04/02 (OCC278) If our curve is trimmed we must recalculate
308 // the number of intervals obtained from the basis to
309 // vvv reflect parameter bounds
310 Standard_Integer iNbBasisInt = C.NbIntervals(BaseS), iInt;
313 TColStd_Array1OfReal rdfInter(1,1+iNbBasisInt);
314 C.Intervals(rdfInter,BaseS);
315 for (iInt=1; iInt<=iNbBasisInt; iInt++)
316 if (rdfInter(iInt)>myFirst && rdfInter(iInt)<myLast)
321 return myNbIntervals;
324 //=======================================================================
325 //function : Intervals
327 //=======================================================================
329 void GeomAdaptor_Curve::Intervals(TColStd_Array1OfReal& T,
330 const GeomAbs_Shape S )
332 Standard_Integer myNbIntervals = 1;
333 Standard_Integer NbSplit;
335 if (myTypeCurve == GeomAbs_BSplineCurve)
337 Standard_Integer FirstIndex = myBspl->FirstUKnotIndex();
338 Standard_Integer LastIndex = myBspl->LastUKnotIndex();
339 TColStd_Array1OfInteger Inter (1, LastIndex-FirstIndex+1);
341 if ( S > Continuity()) {
342 Standard_Integer Cont;
346 Standard_DomainError::Raise("Geom2dAdaptor_Curve::NbIntervals");
356 if ( S == GeomAbs_C1) Cont = 1;
357 else if ( S == GeomAbs_C2) Cont = 2;
358 else if ( S == GeomAbs_C3) Cont = 3;
359 else Cont = myBspl->Degree();
360 Standard_Integer FirstIndex = myBspl->FirstUKnotIndex();
361 Standard_Integer LastIndex = myBspl->LastUKnotIndex();
362 Standard_Integer Degree = myBspl->Degree();
363 Standard_Integer NbKnots = myBspl->NbKnots();
364 TColStd_Array1OfInteger Mults (1, NbKnots);
365 myBspl->Multiplicities (Mults);
367 Standard_Integer Index = FirstIndex;
368 Inter (NbSplit) = Index;
371 while (Index < LastIndex)
373 if (Degree - Mults (Index) < Cont)
375 Inter (NbSplit) = Index;
380 Inter (NbSplit) = Index;
381 Standard_Integer NbInt = NbSplit-1;
382 // GeomConvert_BSplineCurveKnotSplitting Convector(myBspl, Cont);
383 // Standard_Integer NbInt = Convector.NbSplits()-1;
384 // TColStd_Array1OfInteger Inter(1,NbInt+1);
385 // Convector.Splitting( Inter);
387 Standard_Integer Nb = myBspl->NbKnots();
388 Standard_Integer Index1 = 0;
389 Standard_Integer Index2 = 0;
390 Standard_Real newFirst, newLast;
391 TColStd_Array1OfReal TK(1,Nb);
392 TColStd_Array1OfInteger TM(1,Nb);
394 myBspl->Multiplicities(TM);
395 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,myFirst,
396 myBspl->IsPeriodic(),
397 1,Nb,Index1,newFirst);
398 BSplCLib::LocateParameter(myBspl->Degree(),TK,TM,myLast,
399 myBspl->IsPeriodic(),
400 1,Nb,Index2,newLast);
401 // On decale eventuellement les indices
402 // On utilise une "petite" tolerance, la resolution ne doit
403 // servir que pour les tres longue courbes....(PRO9248)
404 Standard_Real Eps = Min(Resolution(Precision::Confusion()),
405 Precision::PConfusion());
406 if ( Abs(newFirst-TK(Index1+1))< Eps) Index1++;
407 if ( newLast-TK(Index2)> Eps) Index2++;
411 for ( Standard_Integer i=1; i<=NbInt; i++) {
412 if (Inter(i) > Index1 && Inter(i)<Index2 ) {
414 Inter(myNbIntervals) = Inter(i);
417 Inter(myNbIntervals+1) = Index2;
419 for (Standard_Integer I=1;I<=myNbIntervals+1;I++) {
428 else if (myCurve->IsKind(STANDARD_TYPE(Geom_OffsetCurve))){
429 GeomAbs_Shape BaseS=GeomAbs_C0;
433 Standard_DomainError::Raise("GeomAdaptor_Curve::NbIntervals");
435 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
436 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
437 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
438 default: BaseS = GeomAbs_CN;
441 ((*((Handle(Geom_OffsetCurve)*)&myCurve))->BasisCurve());
442 // akm 05/04/02 (OCC278) If our curve is trimmed we must recalculate
443 // the array of intervals obtained from the basis to
444 // vvv reflect parameter bounds
445 Standard_Integer iNbBasisInt = C.NbIntervals(BaseS), iInt;
448 TColStd_Array1OfReal rdfInter(1,1+iNbBasisInt);
449 C.Intervals(rdfInter,BaseS);
450 for (iInt=1; iInt<=iNbBasisInt; iInt++)
451 if (rdfInter(iInt)>myFirst && rdfInter(iInt)<myLast)
452 T(++myNbIntervals)=rdfInter(iInt);
454 // old - myNbIntervals = C.NbIntervals(BaseS);
455 // old - C.Intervals(T, BaseS);
459 T( T.Lower() ) = myFirst;
460 T( T.Lower() + myNbIntervals ) = myLast;
463 //=======================================================================
466 //=======================================================================
468 Handle(Adaptor3d_HCurve) GeomAdaptor_Curve::Trim(const Standard_Real First,
469 const Standard_Real Last,
470 const Standard_Real /*Tol*/) const
472 return Handle(GeomAdaptor_HCurve)(new GeomAdaptor_HCurve(myCurve,First,Last));
476 //=======================================================================
477 //function : IsClosed
479 //=======================================================================
481 Standard_Boolean GeomAdaptor_Curve::IsClosed() const
483 if (!Precision::IsPositiveInfinite(myLast) &&
484 !Precision::IsNegativeInfinite(myFirst))
486 const gp_Pnt Pd = Value(myFirst);
487 const gp_Pnt Pf = Value(myLast);
488 return (Pd.Distance(Pf) <= Precision::Confusion());
490 return Standard_False;
493 //=======================================================================
494 //function : IsPeriodic
496 //=======================================================================
498 Standard_Boolean GeomAdaptor_Curve::IsPeriodic() const
500 return (myCurve->IsPeriodic()? IsClosed() : Standard_False);
503 //=======================================================================
506 //=======================================================================
508 Standard_Real GeomAdaptor_Curve::Period() const
510 return myCurve->LastParameter() - myCurve->FirstParameter();
513 //=======================================================================
516 //=======================================================================
518 gp_Pnt GeomAdaptor_Curve::Value(const Standard_Real U) const
520 if ( (myTypeCurve == GeomAbs_BSplineCurve)&&
521 (U==myFirst || U==myLast) ) {
522 Standard_Integer Ideb, Ifin;
524 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
526 if (Ideb>=Ifin) Ifin = Ideb+1;
529 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
530 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
531 if (Ideb>=Ifin) Ideb = Ifin-1;
533 return myBspl->LocalValue(U, Ideb, Ifin);
535 return myCurve->Value(U);
538 //=======================================================================
541 //=======================================================================
543 void GeomAdaptor_Curve::D0(const Standard_Real U, gp_Pnt& P) const
545 if ( (myTypeCurve == GeomAbs_BSplineCurve)&&
546 (U==myFirst || U==myLast) ) {
547 Standard_Integer Ideb, Ifin;
549 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
551 if (Ideb>=Ifin) Ifin = Ideb+1;
554 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
555 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
556 if (Ideb>=Ifin) Ideb = Ifin-1;
558 myBspl->LocalD0( U, Ideb, Ifin, P);
565 //=======================================================================
568 //=======================================================================
570 void GeomAdaptor_Curve::D1(const Standard_Real U, gp_Pnt& P, gp_Vec& V) const
572 if ( (myTypeCurve == GeomAbs_BSplineCurve)&&
573 (U==myFirst || U==myLast) ) {
574 Standard_Integer Ideb, Ifin;
576 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
578 if (Ideb>=Ifin) Ifin = Ideb+1;
581 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
582 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
583 if (Ideb>=Ifin) Ideb = Ifin-1;
585 myBspl->LocalD1( U, Ideb, Ifin, P, V);
588 myCurve->D1( U, P, V);
592 //=======================================================================
595 //=======================================================================
597 void GeomAdaptor_Curve::D2(const Standard_Real U,
598 gp_Pnt& P, gp_Vec& V1, gp_Vec& V2) const
600 if ( (myTypeCurve == GeomAbs_BSplineCurve)&&
601 (U==myFirst || U==myLast) ) {
602 Standard_Integer Ideb, Ifin;
604 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
606 if (Ideb>=Ifin) Ifin = Ideb+1;
609 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
610 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
611 if (Ideb>=Ifin) Ideb = Ifin-1;
613 myBspl->LocalD2( U, Ideb, Ifin, P, V1, V2);
616 myCurve->D2( U, P, V1, V2);
620 //=======================================================================
623 //=======================================================================
625 void GeomAdaptor_Curve::D3(const Standard_Real U,
626 gp_Pnt& P, gp_Vec& V1,
627 gp_Vec& V2, gp_Vec& V3) const
629 if ( (myTypeCurve == GeomAbs_BSplineCurve) &&
630 (U==myFirst || U==myLast) ) {
631 Standard_Integer Ideb, Ifin;
633 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
635 if (Ideb>=Ifin) Ifin = Ideb+1;
638 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
639 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
640 if (Ideb>=Ifin) Ideb = Ifin-1;
642 myBspl->LocalD3( U, Ideb, Ifin, P, V1, V2, V3);
645 myCurve->D3( U, P, V1, V2, V3);
649 //=======================================================================
652 //=======================================================================
654 gp_Vec GeomAdaptor_Curve::DN(const Standard_Real U,
655 const Standard_Integer N) const
657 if ( (myTypeCurve == GeomAbs_BSplineCurve) &&
658 (U==myFirst || U==myLast) ) {
659 Standard_Integer Ideb, Ifin;
661 myBspl->LocateU(myFirst, PosTol, Ideb, Ifin);
663 if (Ideb>=Ifin) Ifin = Ideb+1;
666 myBspl->LocateU(myLast, PosTol, Ideb, Ifin);
667 if (Ifin>myBspl->NbKnots()) Ifin = myBspl->NbKnots();
668 if (Ideb>=Ifin) Ideb = Ifin-1;
670 return myBspl->LocalDN( U, Ideb, Ifin, N);
673 return myCurve->DN( U, N);
677 //=======================================================================
678 //function : Resolution
680 //=======================================================================
682 Standard_Real GeomAdaptor_Curve::Resolution(const Standard_Real R3D) const
684 switch ( myTypeCurve) {
687 case GeomAbs_Circle: {
688 Standard_Real R = (*((Handle(Geom_Circle)*)&myCurve))->Circ().Radius();
690 return 2*ASin(R3D/(2*R));
694 case GeomAbs_Ellipse: {
695 return R3D / (*((Handle(Geom_Ellipse)*)&myCurve))->MajorRadius();
697 case GeomAbs_BezierCurve: {
699 (*((Handle(Geom_BezierCurve)*)&myCurve))->Resolution(R3D,res);
702 case GeomAbs_BSplineCurve: {
704 (*((Handle(Geom_BSplineCurve)*)&myCurve))->Resolution(R3D,res);
708 return Precision::Parametric(R3D);
714 // -- The following methods must be called when GetType returned
715 // -- the corresponding type.
718 //=======================================================================
721 //=======================================================================
723 gp_Lin GeomAdaptor_Curve::Line() const
725 Standard_NoSuchObject_Raise_if(myTypeCurve != GeomAbs_Line, "");
726 return (*((Handle(Geom_Line)*)&myCurve))->Lin();
729 //=======================================================================
732 //=======================================================================
734 gp_Circ GeomAdaptor_Curve::Circle() const
736 Standard_NoSuchObject_Raise_if(myTypeCurve != GeomAbs_Circle, "");
737 return (*((Handle(Geom_Circle)*)&myCurve))->Circ();
740 //=======================================================================
743 //=======================================================================
745 gp_Elips GeomAdaptor_Curve::Ellipse() const
747 Standard_NoSuchObject_Raise_if(myTypeCurve != GeomAbs_Ellipse, "");
748 return (*((Handle(Geom_Ellipse)*)&myCurve))->Elips();
751 //=======================================================================
752 //function : Hyperbola
754 //=======================================================================
756 gp_Hypr GeomAdaptor_Curve::Hyperbola() const
758 Standard_NoSuchObject_Raise_if(myTypeCurve != GeomAbs_Hyperbola, "");
759 return (*((Handle(Geom_Hyperbola)*)&myCurve))->Hypr();
762 //=======================================================================
763 //function : Parabola
765 //=======================================================================
767 gp_Parab GeomAdaptor_Curve::Parabola() const
769 Standard_NoSuchObject_Raise_if(myTypeCurve != GeomAbs_Parabola, "");
770 return (*((Handle(Geom_Parabola)*)&myCurve))->Parab();
773 //=======================================================================
776 //=======================================================================
778 Standard_Integer GeomAdaptor_Curve::Degree() const
780 if (myTypeCurve == GeomAbs_BezierCurve)
781 return (*((Handle(Geom_BezierCurve)*)&myCurve))->Degree();
782 else if (myTypeCurve == GeomAbs_BSplineCurve)
783 return (*((Handle(Geom_BSplineCurve)*)&myCurve))->Degree();
785 Standard_NoSuchObject::Raise();
790 //=======================================================================
791 //function : IsRational
793 //=======================================================================
795 Standard_Boolean GeomAdaptor_Curve::IsRational() const {
796 switch( myTypeCurve) {
797 case GeomAbs_BSplineCurve:
798 return (*((Handle(Geom_BSplineCurve)*)&myCurve))->IsRational();
799 case GeomAbs_BezierCurve:
800 return (*((Handle(Geom_BezierCurve)*)&myCurve))->IsRational();
802 return Standard_False;
806 //=======================================================================
809 //=======================================================================
811 Standard_Integer GeomAdaptor_Curve::NbPoles() const
813 if (myTypeCurve == GeomAbs_BezierCurve)
814 return (*((Handle(Geom_BezierCurve)*)&myCurve))->NbPoles();
815 else if (myTypeCurve == GeomAbs_BSplineCurve)
816 return (*((Handle(Geom_BSplineCurve)*)&myCurve))->NbPoles();
818 Standard_NoSuchObject::Raise();
823 //=======================================================================
826 //=======================================================================
828 Standard_Integer GeomAdaptor_Curve::NbKnots() const
830 if ( myTypeCurve != GeomAbs_BSplineCurve)
831 Standard_NoSuchObject::Raise("GeomAdaptor_Curve::NbKnots");
832 return (*((Handle(Geom_BSplineCurve)*)&myCurve))->NbKnots();
835 //=======================================================================
838 //=======================================================================
840 Handle(Geom_BezierCurve) GeomAdaptor_Curve::Bezier() const
842 if ( myTypeCurve != GeomAbs_BezierCurve)
843 Standard_NoSuchObject::Raise("GeomAdaptor_Curve::Bezier");
844 return *((Handle(Geom_BezierCurve)*)&myCurve);
847 //=======================================================================
850 //=======================================================================
852 Handle(Geom_BSplineCurve) GeomAdaptor_Curve::BSpline() const
854 if ( myTypeCurve != GeomAbs_BSplineCurve)
855 Standard_NoSuchObject::Raise("GeomAdaptor_Curve::BSpline");
857 return *((Handle(Geom_BSplineCurve)*)&myCurve);