1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #include <Adaptor3d_IsoCurve.ixx>
16 #include <Adaptor3d_HIsoCurve.hxx>
17 #include <Adaptor3d_HSurfaceOfRevolution.hxx>
18 #include <Geom_BezierSurface.hxx>
19 #include <Geom_BSplineSurface.hxx>
20 #include <GeomAbs_SurfaceType.hxx>
21 #include <Standard_NoSuchObject.hxx>
22 #include <Standard_NotImplemented.hxx>
26 #include <BSplCLib.hxx>
27 #include <BSplSLib.hxx>
28 #include <Precision.hxx>
29 #include <TColgp_Array1OfPnt.hxx>
30 #include <TColgp_Array2OfPnt.hxx>
33 //=======================================================================
34 //function : Adaptor3d_IsoCurve
36 //=======================================================================
38 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve() :
39 myIso(GeomAbs_NoneIso),
45 //=======================================================================
46 //function : Adaptor3d_IsoCurve
48 //=======================================================================
50 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& S) :
58 //=======================================================================
59 //function : Adaptor3d_IsoCurve
61 //=======================================================================
63 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& S,
64 const GeomAbs_IsoType Iso,
65 const Standard_Real Param)
71 //=======================================================================
72 //function : Adaptor3d_IsoCurve
74 //=======================================================================
76 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& S,
77 const GeomAbs_IsoType Iso,
78 const Standard_Real Param,
79 const Standard_Real WFirst,
80 const Standard_Real WLast)
83 Load(Iso,Param,WFirst,WLast);
86 //=======================================================================
89 //=======================================================================
91 void Adaptor3d_IsoCurve::Load(const Handle(Adaptor3d_HSurface)& S )
94 myIso = GeomAbs_NoneIso;
97 //=======================================================================
100 //=======================================================================
102 void Adaptor3d_IsoCurve::Load(const GeomAbs_IsoType Iso,
103 const Standard_Real Param)
109 mySurface->FirstVParameter(),
110 mySurface->LastVParameter());
115 mySurface->FirstUParameter(),
116 mySurface->LastUParameter());
119 case GeomAbs_NoneIso:
120 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
125 //=======================================================================
128 //=======================================================================
130 void Adaptor3d_IsoCurve::Load(const GeomAbs_IsoType Iso,
131 const Standard_Real Param,
132 const Standard_Real WFirst,
133 const Standard_Real WLast)
141 if (myIso == GeomAbs_IsoU) {
142 myFirst = Max(myFirst, mySurface->FirstVParameter());
143 myLast = Min(myLast, mySurface->LastVParameter());
146 myFirst = Max(myFirst, mySurface->FirstUParameter());
147 myLast = Min(myLast, mySurface->LastUParameter());
150 // Adjust the parameters on periodic surfaces
152 Standard_Real dummy = myParameter;
154 if (mySurface->IsUPeriodic()) {
156 if (myIso == GeomAbs_IsoU) {
157 ElCLib::AdjustPeriodic
158 (mySurface->FirstUParameter(),
159 mySurface->FirstUParameter()+
160 mySurface->UPeriod(),
161 mySurface->UResolution(Precision::Confusion()),
165 ElCLib::AdjustPeriodic
166 (mySurface->FirstUParameter(),
167 mySurface->FirstUParameter()+
168 mySurface->UPeriod(),
169 mySurface->UResolution(Precision::Confusion()),
174 if (mySurface->IsVPeriodic()) {
176 if (myIso == GeomAbs_IsoV) {
177 ElCLib::AdjustPeriodic
178 (mySurface->FirstVParameter(),
179 mySurface->FirstVParameter() +
180 mySurface->VPeriod(),
181 mySurface->VResolution(Precision::Confusion()),
185 ElCLib::AdjustPeriodic
186 (mySurface->FirstVParameter(),
187 mySurface->FirstVParameter() +
188 mySurface->VPeriod(),
189 mySurface->VResolution(Precision::Confusion()),
196 //=======================================================================
197 //function : Continuity
199 //=======================================================================
201 GeomAbs_Shape Adaptor3d_IsoCurve::Continuity() const
205 return mySurface->VContinuity();
207 return mySurface->UContinuity();
208 case GeomAbs_NoneIso:
213 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
217 //=======================================================================
218 //function : NbIntervals
220 //=======================================================================
222 Standard_Integer Adaptor3d_IsoCurve::NbIntervals(const GeomAbs_Shape S)
224 if (myIso == GeomAbs_NoneIso) Standard_NoSuchObject::Raise();
225 Standard_Boolean UIso = (myIso == GeomAbs_IsoU);
227 Standard_Integer nbInter = UIso ?
228 mySurface->NbVIntervals(S) :
229 mySurface->NbUIntervals(S);
231 TColStd_Array1OfReal T(1,nbInter+1);
234 mySurface->VIntervals(T,S);
236 mySurface->UIntervals(T,S);
238 if(nbInter == 1) return nbInter;
240 Standard_Integer first = 1;
241 while (T(first) <= myFirst) first++;
242 Standard_Integer last = nbInter+1;
243 while (T(last) >= myLast) last--;
244 return (last - first + 2);
247 //=======================================================================
248 //function : Intervals
250 //=======================================================================
252 void Adaptor3d_IsoCurve::Intervals(TColStd_Array1OfReal& TI,
253 const GeomAbs_Shape S)
255 if (myIso == GeomAbs_NoneIso) Standard_NoSuchObject::Raise();
256 Standard_Boolean UIso = (myIso == GeomAbs_IsoU);
258 Standard_Integer nbInter = UIso ?
259 mySurface->NbVIntervals(S) :
260 mySurface->NbUIntervals(S);
262 TColStd_Array1OfReal T(1,nbInter+1);
265 mySurface->VIntervals(T,S);
267 mySurface->UIntervals(T,S);
270 TI(TI.Lower()) = myFirst ;
271 TI(TI.Lower() + 1) = myLast ;
275 Standard_Integer first = 1;
276 while (T(first) <= myFirst) first++;
277 Standard_Integer last = nbInter+1;
278 while (T(last) >= myLast) last--;
280 Standard_Integer i = TI.Lower(), j;
281 for (j = first-1; j <= last+1; j++) {
285 TI(TI.Lower()) = myFirst ;
286 TI(TI.Lower() + last-first + 2) = myLast ;
289 //=======================================================================
292 //=======================================================================
294 Handle(Adaptor3d_HCurve) Adaptor3d_IsoCurve::Trim
295 (const Standard_Real First,
296 const Standard_Real Last,
297 const Standard_Real) const
299 Handle(Adaptor3d_HIsoCurve) HI = new Adaptor3d_HIsoCurve(*this);
300 ((Adaptor3d_IsoCurve *)&(HI->Curve()))->Load(myIso,myParameter,First,Last);
304 //=======================================================================
305 //function : IsClosed
307 //=======================================================================
309 Standard_Boolean Adaptor3d_IsoCurve::IsClosed() const
313 return mySurface->IsVClosed();
315 return mySurface->IsUClosed();
316 case GeomAbs_NoneIso:
321 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
322 return Standard_False;
325 //=======================================================================
326 //function : IsPeriodic
328 //=======================================================================
330 Standard_Boolean Adaptor3d_IsoCurve::IsPeriodic() const
334 return mySurface->IsVPeriodic();
336 return mySurface->IsUPeriodic();
337 case GeomAbs_NoneIso:
342 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
343 return Standard_False;
346 //=======================================================================
349 //=======================================================================
351 Standard_Real Adaptor3d_IsoCurve::Period() const
355 return mySurface->VPeriod();
357 return mySurface->UPeriod();
358 case GeomAbs_NoneIso:
363 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
367 //=======================================================================
370 //=======================================================================
372 gp_Pnt Adaptor3d_IsoCurve::Value(const Standard_Real T) const
377 return mySurface->Value(myParameter,T);
380 return mySurface->Value(T,myParameter);
382 case GeomAbs_NoneIso:
384 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
393 //=======================================================================
396 //=======================================================================
398 void Adaptor3d_IsoCurve::D0(const Standard_Real T, gp_Pnt& P) const
403 mySurface->D0(myParameter,T,P);
407 mySurface->D0(T,myParameter,P);
410 case GeomAbs_NoneIso:
411 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
416 //=======================================================================
419 //=======================================================================
421 void Adaptor3d_IsoCurve::D1(const Standard_Real T, gp_Pnt& P, gp_Vec& V) const
427 mySurface->D1(myParameter,T,P,dummy,V);
431 mySurface->D1(T,myParameter,P,V,dummy);
434 case GeomAbs_NoneIso:
435 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
440 //=======================================================================
443 //=======================================================================
445 void Adaptor3d_IsoCurve::D2(const Standard_Real T, gp_Pnt& P,
446 gp_Vec& V1, gp_Vec& V2) const
448 gp_Vec dummy1,dummy2,dummy3;
452 mySurface->D2(myParameter,T,P,
453 dummy1,V1,dummy2,V2,dummy3);
456 mySurface->D2(T,myParameter,
457 P,V1,dummy1,V2,dummy2,dummy3);
459 case GeomAbs_NoneIso:
460 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
465 //=======================================================================
468 //=======================================================================
470 void Adaptor3d_IsoCurve::D3(const Standard_Real T, gp_Pnt& P,
471 gp_Vec& V1, gp_Vec& V2, gp_Vec& V3) const
477 mySurface->D3(myParameter,T,P,dummy[0],V1,dummy[1],
478 V2,dummy[2],dummy[3],V3,dummy[4],dummy[5]);
482 mySurface->D3(T,myParameter,P,V1,dummy[0],V2,dummy[1],
483 dummy[2],V3,dummy[3],dummy[4],dummy[5]);
486 case GeomAbs_NoneIso:
487 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
492 //=======================================================================
495 //=======================================================================
497 gp_Vec Adaptor3d_IsoCurve::DN(const Standard_Real T,
498 const Standard_Integer N) const
503 return mySurface->DN(myParameter,T,0,N);
505 return mySurface->DN(T,myParameter,N,0);
506 case GeomAbs_NoneIso:
508 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
518 //=======================================================================
519 //function : Resolution
521 //=======================================================================
523 Standard_Real Adaptor3d_IsoCurve::Resolution(const Standard_Real R3D) const
525 // Peut-on faire mieux ??
526 return Precision::Parametric(R3D);
531 //=======================================================================
534 //=======================================================================
536 GeomAbs_CurveType Adaptor3d_IsoCurve::GetType() const {
538 switch (mySurface->GetType()) {
543 case GeomAbs_Cylinder:
551 return GeomAbs_Circle;
553 case GeomAbs_NoneIso:
555 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
557 return GeomAbs_OtherCurve;
565 return GeomAbs_Circle;
567 case GeomAbs_BezierSurface:
568 return GeomAbs_BezierCurve;
570 case GeomAbs_BSplineSurface:
571 return GeomAbs_BSplineCurve;
573 case GeomAbs_SurfaceOfRevolution:
577 return mySurface->BasisCurve()->GetType();
580 return GeomAbs_Circle;
582 case GeomAbs_NoneIso:
583 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
585 return GeomAbs_OtherCurve;
591 case GeomAbs_SurfaceOfExtrusion:
598 return mySurface->BasisCurve()->GetType();
600 case GeomAbs_NoneIso:
601 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
603 return GeomAbs_OtherCurve;
609 return GeomAbs_OtherCurve;
613 return GeomAbs_OtherCurve;
616 //=======================================================================
619 //=======================================================================
621 gp_Lin Adaptor3d_IsoCurve::Line() const
629 //=======================================================================
630 //function : computeHR
632 //=======================================================================
634 static void computeHR(const gp_Ax3& axes,
637 Standard_Real& radius)
639 gp_Vec V(axes.Location(),P);
640 h = V * axes.Direction();
641 radius = V * axes.XDirection();
644 //=======================================================================
647 //=======================================================================
649 gp_Circ Adaptor3d_IsoCurve::Circle() const
652 Standard_Real radius,h = 0.;
654 switch (mySurface->GetType()) {
656 case GeomAbs_Cylinder:
658 gp_Cylinder cyl = mySurface->Cylinder();
664 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:UIso");
669 return ElSLib::CylinderVIso(cyl.Position(),cyl.Radius(),myParameter);
671 case GeomAbs_NoneIso:
673 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
682 gp_Cone cone = mySurface->Cone();
688 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:UIso");
693 return ElSLib::ConeVIso(cone.Position(),cone.RefRadius(),
694 cone.SemiAngle(),myParameter);
696 case GeomAbs_NoneIso:
698 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
707 gp_Sphere sph = mySurface->Sphere();
713 return ElSLib::SphereUIso(sph.Position(),sph.Radius(),myParameter);
718 return ElSLib::SphereVIso(sph.Position(),sph.Radius(),myParameter);
721 case GeomAbs_NoneIso:
723 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
730 case GeomAbs_Torus: {
731 gp_Torus tor = mySurface->Torus();
737 return ElSLib::TorusUIso(tor.Position(),tor.MajorRadius(),
738 tor.MinorRadius(),myParameter);
743 return ElSLib::TorusVIso(tor.Position(),tor.MajorRadius(),
744 tor.MinorRadius(),myParameter);
747 case GeomAbs_NoneIso:
749 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
756 case GeomAbs_SurfaceOfRevolution:
758 if (myIso == GeomAbs_IsoV) {
759 gp_Ax1 Ax1 = mySurface->AxeOfRevolution();
760 gp_Vec DX(Ax1.Location(), Value(0));
761 if(DX.IsParallel(Ax1.Direction(),Precision::Angular())) {
762 return gp_Circ(gp_Ax2(Value(0), Ax1.Direction()),0);
765 axes = gp_Ax3(Ax1.Location(), Ax1.Direction(), DX);
766 computeHR(axes,Value(0),h,radius);
767 gp_Vec VT = axes.Direction();
768 axes.Translate(VT * h);
769 return gp_Circ(axes.Ax2(),radius);
773 return mySurface->BasisCurve()->Circle().Rotated
774 (mySurface->AxeOfRevolution(),myParameter);
778 case GeomAbs_SurfaceOfExtrusion: {
779 return mySurface->BasisCurve()->Circle().Translated
780 (myParameter * gp_Vec(mySurface->Direction()));
784 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Circle");
793 //=======================================================================
796 //=======================================================================
798 gp_Elips Adaptor3d_IsoCurve::Ellipse() const
800 switch (mySurface->GetType()) {
802 case GeomAbs_SurfaceOfExtrusion: {
803 return mySurface->BasisCurve()->Ellipse().Translated
804 (myParameter * gp_Vec(mySurface->Direction()));
808 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Ellipse");
814 //=======================================================================
815 //function : Hyperbola
817 //=======================================================================
819 gp_Hypr Adaptor3d_IsoCurve::Hyperbola() const
821 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Hyperbola");
825 //=======================================================================
826 //function : Parabola
828 //=======================================================================
830 gp_Parab Adaptor3d_IsoCurve::Parabola() const
832 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Parabola");
836 //=======================================================================
839 //=======================================================================
841 Standard_Integer Adaptor3d_IsoCurve::Degree() const
843 Standard_Integer degree = 0 ;
844 GeomAbs_SurfaceType type = mySurface->GetType() ;
846 case GeomAbs_BezierSurface:
847 case GeomAbs_BSplineSurface:
851 degree = mySurface->VDegree() ;
854 degree = mySurface->UDegree() ;
857 case GeomAbs_NoneIso:
859 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
863 case GeomAbs_SurfaceOfRevolution:
867 degree = mySurface->BasisCurve()->Degree();
870 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
874 case GeomAbs_SurfaceOfExtrusion:
878 degree = mySurface->BasisCurve()->Degree();
881 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
886 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
892 //=======================================================================
893 //function : IsRational
895 //=======================================================================
897 Standard_Boolean Adaptor3d_IsoCurve::IsRational() const
899 Standard_Integer is_rational = Standard_False ;
900 GeomAbs_SurfaceType type = mySurface->GetType() ;
902 case GeomAbs_BezierSurface:
903 case GeomAbs_BSplineSurface:
907 is_rational = mySurface->IsVRational() ;
910 is_rational = mySurface->IsURational() ;
913 case GeomAbs_NoneIso:
915 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
919 case GeomAbs_SurfaceOfRevolution:
923 is_rational = mySurface->BasisCurve()->IsRational();
926 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
930 case GeomAbs_SurfaceOfExtrusion:
934 is_rational = mySurface->BasisCurve()->IsRational();
937 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
942 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
948 //=======================================================================
951 //=======================================================================
953 Standard_Integer Adaptor3d_IsoCurve::NbPoles() const
955 Standard_Integer nb_poles = 0 ;
956 GeomAbs_SurfaceType type = mySurface->GetType() ;
958 case GeomAbs_BezierSurface:
959 case GeomAbs_BSplineSurface:
962 nb_poles = mySurface->NbVPoles() ;
965 nb_poles = mySurface->NbUPoles() ;
968 case GeomAbs_NoneIso:
970 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
973 case GeomAbs_SurfaceOfRevolution:
978 nb_poles = mySurface->BasisCurve()->NbPoles();
982 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
986 case GeomAbs_SurfaceOfExtrusion:
991 nb_poles = mySurface->BasisCurve()->NbPoles();
995 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1001 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1007 //=======================================================================
1008 //function : NbKnots
1010 //=======================================================================
1012 Standard_Integer Adaptor3d_IsoCurve::NbKnots() const
1014 Standard_Integer nb_knots = 0 ;
1015 GeomAbs_SurfaceType type = mySurface->GetType() ;
1017 case GeomAbs_BSplineSurface:
1021 nb_knots = mySurface->NbVKnots() ;
1024 nb_knots = mySurface->NbUKnots() ;
1027 case GeomAbs_NoneIso:
1029 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1033 case GeomAbs_SurfaceOfRevolution:
1038 nb_knots = mySurface->BasisCurve()->NbKnots() ;
1042 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1046 case GeomAbs_SurfaceOfExtrusion:
1051 nb_knots = mySurface->BasisCurve()->NbKnots() ;
1055 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1060 Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1066 //=======================================================================
1069 //=======================================================================
1071 Handle(Geom_BezierCurve) Adaptor3d_IsoCurve::Bezier() const
1073 Handle(Geom_BezierCurve) C;
1074 if (mySurface->GetType() == GeomAbs_SurfaceOfRevolution) {
1075 C = mySurface->BasisCurve()->Bezier();
1076 C = Handle(Geom_BezierCurve)::DownCast(C->Copy());
1077 C->Rotate(mySurface->AxeOfRevolution(),myParameter);
1079 else if (mySurface->GetType() == GeomAbs_SurfaceOfExtrusion) {
1080 C = mySurface->BasisCurve()->Bezier();
1081 C = Handle(Geom_BezierCurve)::DownCast(C->Copy());
1082 C->Translate(myParameter * gp_Vec(mySurface->Direction()));
1084 else if (myIso == GeomAbs_IsoU) {
1085 C = Handle(Geom_BezierCurve)::DownCast
1086 (mySurface->Bezier()->UIso(myParameter)) ;
1089 C = Handle(Geom_BezierCurve)::DownCast
1090 (mySurface->Bezier()->VIso(myParameter));
1092 // C->Segment(myFirst,myLast);
1096 //=======================================================================
1097 //function : BSpline
1099 //=======================================================================
1101 Handle(Geom_BSplineCurve) Adaptor3d_IsoCurve::BSpline() const
1103 Handle(Geom_BSplineCurve) C;
1104 if (mySurface->GetType() == GeomAbs_SurfaceOfRevolution) {
1105 C = mySurface->BasisCurve()->BSpline();
1106 C = Handle(Geom_BSplineCurve)::DownCast(C->Copy());
1107 C->Rotate(mySurface->AxeOfRevolution(),myParameter);
1109 else if (mySurface->GetType() == GeomAbs_SurfaceOfExtrusion) {
1110 C = mySurface->BasisCurve()->BSpline();
1111 C = Handle(Geom_BSplineCurve)::DownCast(C->Copy());
1112 C->Translate(myParameter * gp_Vec(mySurface->Direction()));
1114 else if (myIso == GeomAbs_IsoU) {
1115 C = Handle(Geom_BSplineCurve)::DownCast
1116 (mySurface->BSpline()->UIso(myParameter)) ;
1119 C = Handle(Geom_BSplineCurve)::DownCast
1120 (mySurface->BSpline()->VIso(myParameter));
1122 // C->Segment(myFirst,myLast);