0025621: CAST analysis - Avoid constructors not supplying an initial value for all...
[occt.git] / src / Adaptor3d / Adaptor3d_IsoCurve.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
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.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <Adaptor3d_IsoCurve.ixx>
15
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>
23 #include <gp_Ax2.hxx>
24 #include <ElCLib.hxx>
25 #include <ElSLib.hxx>
26 #include <BSplCLib.hxx>
27 #include <BSplSLib.hxx>
28 #include <Precision.hxx>
29 #include <TColgp_Array1OfPnt.hxx>
30 #include <TColgp_Array2OfPnt.hxx>
31
32
33 //=======================================================================
34 //function : Adaptor3d_IsoCurve
35 //purpose  : 
36 //=======================================================================
37
38 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve()
39 : myIso      (GeomAbs_NoneIso),
40   myFirst    (0.0),
41   myLast     (0.0),
42   myParameter(0.0)
43 {
44 }
45
46 //=======================================================================
47 //function : Adaptor3d_IsoCurve
48 //purpose  : 
49 //=======================================================================
50
51 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& S)
52 : mySurface  (S),
53   myIso      (GeomAbs_NoneIso),
54   myFirst    (0.0),
55   myLast     (0.0),
56   myParameter(0.0)
57 {
58 }
59
60 //=======================================================================
61 //function : Adaptor3d_IsoCurve
62 //purpose  : 
63 //=======================================================================
64
65 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& S,
66                                        const GeomAbs_IsoType theIso,
67                                        const Standard_Real theParam)
68 : mySurface  (S),
69   myIso      (GeomAbs_NoneIso),
70   myFirst    (0.0),
71   myLast     (0.0),
72   myParameter(0.0)
73 {
74   Load(theIso, theParam);
75 }
76
77 //=======================================================================
78 //function : Adaptor3d_IsoCurve
79 //purpose  : 
80 //=======================================================================
81
82 Adaptor3d_IsoCurve::Adaptor3d_IsoCurve(const Handle(Adaptor3d_HSurface)& theS,
83                                        const GeomAbs_IsoType theIso,
84                                        const Standard_Real theParam,
85                                        const Standard_Real theWFirst,
86                                        const Standard_Real theWLast)
87 : mySurface  (theS),
88   myIso      (theIso),
89   myFirst    (theWFirst),
90   myLast     (theWLast),
91   myParameter(theParam)
92 {
93   Load(theIso, theParam, theWFirst, theWLast);
94 }
95
96 //=======================================================================
97 //function : Load
98 //purpose  : 
99 //=======================================================================
100
101 void Adaptor3d_IsoCurve::Load(const Handle(Adaptor3d_HSurface)& S ) 
102 {
103   mySurface = S;
104   myIso = GeomAbs_NoneIso;
105 }
106
107 //=======================================================================
108 //function : Load
109 //purpose  : 
110 //=======================================================================
111
112 void Adaptor3d_IsoCurve::Load(const GeomAbs_IsoType Iso,
113                             const Standard_Real Param) 
114 {
115   switch (Iso) {
116
117   case GeomAbs_IsoU:
118     Load(Iso,Param,
119          mySurface->FirstVParameter(),
120          mySurface->LastVParameter());
121     break;
122       
123   case GeomAbs_IsoV:
124     Load(Iso,Param,
125          mySurface->FirstUParameter(),
126          mySurface->LastUParameter());
127     break;
128
129   case GeomAbs_NoneIso:
130     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
131     break;
132   }
133 }
134
135 //=======================================================================
136 //function : Load
137 //purpose  : 
138 //=======================================================================
139
140 void Adaptor3d_IsoCurve::Load(const GeomAbs_IsoType Iso,
141                             const Standard_Real Param,
142                             const Standard_Real WFirst,
143                             const Standard_Real WLast) 
144 {
145   myIso =Iso;
146   myParameter = Param;
147   myFirst = WFirst;
148   myLast = WLast;
149
150
151   if (myIso == GeomAbs_IsoU) {
152     myFirst = Max(myFirst, mySurface->FirstVParameter());
153     myLast  = Min(myLast,  mySurface->LastVParameter());
154   }
155   else {
156     myFirst = Max(myFirst, mySurface->FirstUParameter());
157     myLast  = Min(myLast,  mySurface->LastUParameter());
158   }
159
160 // Adjust the parameters on periodic surfaces
161
162   Standard_Real dummy = myParameter;
163
164   if (mySurface->IsUPeriodic()) {
165     
166     if (myIso == GeomAbs_IsoU) {
167       ElCLib::AdjustPeriodic
168         (mySurface->FirstUParameter(),
169          mySurface->FirstUParameter()+
170          mySurface->UPeriod(),
171          mySurface->UResolution(Precision::Confusion()),
172          myParameter,dummy);
173     }
174     else {
175       ElCLib::AdjustPeriodic
176         (mySurface->FirstUParameter(),
177          mySurface->FirstUParameter()+
178          mySurface->UPeriod(),
179          mySurface->UResolution(Precision::Confusion()),
180          myFirst,myLast);
181     }
182   }
183   
184   if (mySurface->IsVPeriodic()) {
185     
186     if (myIso == GeomAbs_IsoV) {
187       ElCLib::AdjustPeriodic
188         (mySurface->FirstVParameter(),
189          mySurface->FirstVParameter() +
190          mySurface->VPeriod(),
191          mySurface->VResolution(Precision::Confusion()),
192          myParameter,dummy);
193     }
194     else {
195       ElCLib::AdjustPeriodic
196         (mySurface->FirstVParameter(),
197          mySurface->FirstVParameter() +
198          mySurface->VPeriod(),
199          mySurface->VResolution(Precision::Confusion()),
200          myFirst,myLast);
201     }
202   }
203   
204 }
205
206 //=======================================================================
207 //function : Continuity
208 //purpose  : 
209 //=======================================================================
210
211 GeomAbs_Shape Adaptor3d_IsoCurve::Continuity() const
212 {
213   switch (myIso) {
214   case GeomAbs_IsoU: 
215     return mySurface->VContinuity();
216   case GeomAbs_IsoV:
217     return mySurface->UContinuity();
218   case GeomAbs_NoneIso:
219   default:
220     break;
221   }
222   
223   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
224   return GeomAbs_C0;
225 }
226
227 //=======================================================================
228 //function : NbIntervals
229 //purpose  : 
230 //=======================================================================
231
232 Standard_Integer Adaptor3d_IsoCurve::NbIntervals(const GeomAbs_Shape S)  
233 {
234   if (myIso == GeomAbs_NoneIso) Standard_NoSuchObject::Raise();
235   Standard_Boolean UIso =  (myIso == GeomAbs_IsoU);
236
237   Standard_Integer nbInter = UIso ? 
238       mySurface->NbVIntervals(S) :  
239       mySurface->NbUIntervals(S);
240
241   TColStd_Array1OfReal T(1,nbInter+1);
242
243   if (UIso) 
244     mySurface->VIntervals(T,S);
245   else
246     mySurface->UIntervals(T,S);
247
248   if(nbInter == 1) return nbInter;
249
250   Standard_Integer first = 1;
251   while (T(first) <= myFirst) first++;
252   Standard_Integer last = nbInter+1;
253   while (T(last) >= myLast) last--;
254   return (last - first + 2);
255 }
256
257 //=======================================================================
258 //function : Intervals
259 //purpose  : 
260 //=======================================================================
261
262 void Adaptor3d_IsoCurve::Intervals(TColStd_Array1OfReal& TI,
263                                  const GeomAbs_Shape S)  
264 {
265   if (myIso == GeomAbs_NoneIso) Standard_NoSuchObject::Raise();
266   Standard_Boolean UIso =  (myIso == GeomAbs_IsoU);
267
268   Standard_Integer nbInter = UIso ? 
269       mySurface->NbVIntervals(S) :  
270       mySurface->NbUIntervals(S);
271
272   TColStd_Array1OfReal T(1,nbInter+1);
273
274   if (UIso) 
275     mySurface->VIntervals(T,S);
276   else
277     mySurface->UIntervals(T,S);
278
279   if(nbInter == 1) {
280     TI(TI.Lower()) = myFirst ;
281     TI(TI.Lower() + 1) = myLast ;
282     return;
283   }
284
285   Standard_Integer first = 1;
286   while (T(first) <= myFirst) first++;
287   Standard_Integer last = nbInter+1;
288   while (T(last) >= myLast) last--;
289
290   Standard_Integer i = TI.Lower(), j;
291   for (j = first-1; j <= last+1; j++) {
292     TI(i) = T(j);
293     i++;
294   }
295   TI(TI.Lower()) = myFirst ;
296   TI(TI.Lower() + last-first + 2) = myLast ; 
297 }
298
299 //=======================================================================
300 //function : Trim
301 //purpose  : 
302 //=======================================================================
303
304 Handle(Adaptor3d_HCurve) Adaptor3d_IsoCurve::Trim
305  (const Standard_Real First,
306   const Standard_Real Last,
307   const Standard_Real) const 
308 {
309   Handle(Adaptor3d_HIsoCurve) HI = new Adaptor3d_HIsoCurve(*this);
310   ((Adaptor3d_IsoCurve *)&(HI->Curve()))->Load(myIso,myParameter,First,Last);
311   return HI;
312 }
313
314 //=======================================================================
315 //function : IsClosed
316 //purpose  : 
317 //=======================================================================
318
319 Standard_Boolean Adaptor3d_IsoCurve::IsClosed() const
320 {
321   switch (myIso) {
322   case GeomAbs_IsoU:
323     return mySurface->IsVClosed();
324   case GeomAbs_IsoV:
325     return mySurface->IsUClosed();
326   case GeomAbs_NoneIso:
327   default:
328     break;
329   }
330
331   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
332   return Standard_False;
333 }
334
335 //=======================================================================
336 //function : IsPeriodic
337 //purpose  : 
338 //=======================================================================
339
340 Standard_Boolean Adaptor3d_IsoCurve::IsPeriodic() const
341 {
342   switch (myIso) {
343   case GeomAbs_IsoU:
344     return mySurface->IsVPeriodic();
345   case GeomAbs_IsoV:
346     return mySurface->IsUPeriodic();
347   case GeomAbs_NoneIso:
348   default:
349     break;
350   }
351
352   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
353   return Standard_False;
354 }
355
356 //=======================================================================
357 //function : Period
358 //purpose  : 
359 //=======================================================================
360
361 Standard_Real Adaptor3d_IsoCurve::Period() const
362 {
363   switch (myIso) {
364   case GeomAbs_IsoU:
365     return mySurface->VPeriod();
366   case GeomAbs_IsoV:
367     return mySurface->UPeriod();
368   case GeomAbs_NoneIso:
369   default:
370     break;
371   }
372
373   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
374   return 0.;
375 }
376
377 //=======================================================================
378 //function : Value
379 //purpose  : 
380 //=======================================================================
381
382 gp_Pnt Adaptor3d_IsoCurve::Value(const Standard_Real T) const
383 {
384   switch (myIso) {
385         
386   case GeomAbs_IsoU:
387     return mySurface->Value(myParameter,T);
388     
389   case GeomAbs_IsoV:
390     return mySurface->Value(T,myParameter);
391     
392   case GeomAbs_NoneIso: 
393     {
394       Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
395       break;
396     }
397   }
398   // portage WNT
399   return gp_Pnt();
400 }
401
402
403 //=======================================================================
404 //function : D0
405 //purpose  : 
406 //=======================================================================
407
408 void Adaptor3d_IsoCurve::D0(const Standard_Real T, gp_Pnt& P) const
409 {
410   switch (myIso) {
411     
412   case GeomAbs_IsoU:
413     mySurface->D0(myParameter,T,P);
414     break;
415     
416   case GeomAbs_IsoV:
417     mySurface->D0(T,myParameter,P);
418     break;
419     
420   case GeomAbs_NoneIso:
421     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
422     break;
423   }
424 }
425
426 //=======================================================================
427 //function : D1
428 //purpose  : 
429 //=======================================================================
430
431 void Adaptor3d_IsoCurve::D1(const Standard_Real T, gp_Pnt& P, gp_Vec& V) const
432 {
433   gp_Vec dummy;
434   switch (myIso) {
435     
436   case GeomAbs_IsoU:
437     mySurface->D1(myParameter,T,P,dummy,V);
438     break;
439     
440   case GeomAbs_IsoV:
441     mySurface->D1(T,myParameter,P,V,dummy);
442     break;
443     
444   case GeomAbs_NoneIso:
445     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
446     break;
447   }
448 }
449
450 //=======================================================================
451 //function : D2
452 //purpose  : 
453 //=======================================================================
454
455 void Adaptor3d_IsoCurve::D2(const Standard_Real T, gp_Pnt& P, 
456                           gp_Vec& V1, gp_Vec& V2) const
457 {
458   gp_Vec dummy1,dummy2,dummy3;
459   switch (myIso) {
460     
461   case GeomAbs_IsoU:
462     mySurface->D2(myParameter,T,P,
463                   dummy1,V1,dummy2,V2,dummy3);
464     break;      
465   case GeomAbs_IsoV:
466     mySurface->D2(T,myParameter,
467                   P,V1,dummy1,V2,dummy2,dummy3);
468     break;
469   case GeomAbs_NoneIso:
470     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
471     break;
472   }
473 }
474
475 //=======================================================================
476 //function : D3
477 //purpose  : 
478 //=======================================================================
479
480 void Adaptor3d_IsoCurve::D3(const Standard_Real T, gp_Pnt& P,
481                           gp_Vec& V1, gp_Vec& V2, gp_Vec& V3) const
482 {
483   gp_Vec dummy[6];
484   switch (myIso) {
485     
486   case GeomAbs_IsoU:
487     mySurface->D3(myParameter,T,P,dummy[0],V1,dummy[1],
488                   V2,dummy[2],dummy[3],V3,dummy[4],dummy[5]);
489     break;
490     
491   case GeomAbs_IsoV:
492     mySurface->D3(T,myParameter,P,V1,dummy[0],V2,dummy[1],
493                   dummy[2],V3,dummy[3],dummy[4],dummy[5]);
494     break;
495     
496   case GeomAbs_NoneIso:
497     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
498     break;
499   }
500 }
501
502 //=======================================================================
503 //function : DN
504 //purpose  : 
505 //=======================================================================
506
507 gp_Vec Adaptor3d_IsoCurve::DN(const Standard_Real T, 
508                             const Standard_Integer N) const
509 {
510   switch (myIso) {
511     
512   case GeomAbs_IsoU:
513     return mySurface->DN(myParameter,T,0,N);
514   case GeomAbs_IsoV:
515     return mySurface->DN(T,myParameter,N,0);
516   case GeomAbs_NoneIso:
517     {
518       Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
519       break;
520     }
521   }
522
523   // portage WNT
524   return gp_Vec();
525 }
526
527
528 //=======================================================================
529 //function : Resolution
530 //purpose  : 
531 //=======================================================================
532
533 Standard_Real Adaptor3d_IsoCurve::Resolution(const Standard_Real R3D) const
534 {
535   // Peut-on faire mieux ??
536   return Precision::Parametric(R3D);
537 }
538
539
540
541 //=======================================================================
542 //function : GetType
543 //purpose  : 
544 //=======================================================================
545
546 GeomAbs_CurveType Adaptor3d_IsoCurve::GetType() const {
547   
548   switch (mySurface->GetType()) {
549
550   case GeomAbs_Plane:
551     return GeomAbs_Line;
552     
553   case GeomAbs_Cylinder:
554   case GeomAbs_Cone:
555     {
556       switch (myIso) {
557       case GeomAbs_IsoU:
558         return GeomAbs_Line;
559         
560       case GeomAbs_IsoV:
561         return GeomAbs_Circle;
562         
563       case GeomAbs_NoneIso:
564         {
565           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
566           // portage WNT
567           return GeomAbs_OtherCurve;
568         }
569       }
570       break;
571     }
572     
573   case GeomAbs_Sphere:
574   case GeomAbs_Torus:
575     return GeomAbs_Circle;
576     
577   case GeomAbs_BezierSurface:
578     return GeomAbs_BezierCurve;
579     
580   case GeomAbs_BSplineSurface:
581     return GeomAbs_BSplineCurve;
582     
583   case GeomAbs_SurfaceOfRevolution:
584     {
585       switch (myIso) {
586       case GeomAbs_IsoU:
587         return mySurface->BasisCurve()->GetType();
588         
589       case GeomAbs_IsoV:
590         return GeomAbs_Circle;
591         
592       case GeomAbs_NoneIso:
593         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
594         // portage WNT
595         return GeomAbs_OtherCurve;
596         break;
597       }
598       break;
599     }
600     
601   case GeomAbs_SurfaceOfExtrusion:
602     {
603       switch (myIso) {
604       case GeomAbs_IsoU:
605         return GeomAbs_Line;
606         
607       case GeomAbs_IsoV:
608         return mySurface->BasisCurve()->GetType();
609         
610       case GeomAbs_NoneIso:
611         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
612         // portage WNT
613         return GeomAbs_OtherCurve;
614         break;
615       }
616       break;
617     }
618   default:
619     return GeomAbs_OtherCurve;
620   }
621
622   // portage WNT
623   return GeomAbs_OtherCurve;
624 }
625
626 //=======================================================================
627 //function : Line
628 //purpose  : 
629 //=======================================================================
630
631 gp_Lin Adaptor3d_IsoCurve::Line() const
632 {
633   gp_Pnt P;
634   gp_Vec V;
635   D1(0,P,V);
636   return gp_Lin(P,V);
637 }
638
639 //=======================================================================
640 //function : computeHR
641 //purpose  : 
642 //=======================================================================
643
644 static void computeHR(const gp_Ax3&        axes, 
645                       const gp_Pnt&        P, 
646                             Standard_Real& h,
647                             Standard_Real& radius)
648 {
649   gp_Vec V(axes.Location(),P);
650   h = V * axes.Direction();
651   radius = V * axes.XDirection();
652 }
653
654 //=======================================================================
655 //function : Circle
656 //purpose  : 
657 //=======================================================================
658
659 gp_Circ Adaptor3d_IsoCurve::Circle() const
660 {
661   gp_Ax3 axes;
662   Standard_Real radius,h = 0.;
663
664   switch (mySurface->GetType()) {
665     
666   case GeomAbs_Cylinder: 
667     {
668       gp_Cylinder cyl = mySurface->Cylinder();
669       
670       switch (myIso) {
671         
672       case GeomAbs_IsoU: 
673         {
674           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:UIso");
675           return gp_Circ();
676         }
677       case GeomAbs_IsoV: 
678         {
679           return ElSLib::CylinderVIso(cyl.Position(),cyl.Radius(),myParameter);
680         }
681       case GeomAbs_NoneIso: 
682         {
683           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
684           return gp_Circ();
685         }
686       }
687       break;
688     }
689
690   case GeomAbs_Cone: 
691     {
692       gp_Cone cone = mySurface->Cone();
693       
694       switch (myIso) {
695         
696       case GeomAbs_IsoU: 
697         {
698           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:UIso");
699           return gp_Circ();
700         }
701       case GeomAbs_IsoV: 
702         {
703           return ElSLib::ConeVIso(cone.Position(),cone.RefRadius(),
704                                   cone.SemiAngle(),myParameter);
705         }
706       case GeomAbs_NoneIso: 
707         {
708           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
709           return gp_Circ();
710         }
711       }
712       break;
713     }
714     
715   case GeomAbs_Sphere: 
716     {
717       gp_Sphere sph = mySurface->Sphere();
718       
719       switch (myIso) {
720         
721       case GeomAbs_IsoU: 
722         {
723           return ElSLib::SphereUIso(sph.Position(),sph.Radius(),myParameter);
724         }
725         
726       case GeomAbs_IsoV: 
727         {
728           return ElSLib::SphereVIso(sph.Position(),sph.Radius(),myParameter);
729         }
730         
731       case GeomAbs_NoneIso: 
732         {
733           Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
734           return gp_Circ();
735         }
736       }
737       break;
738     }
739     
740   case GeomAbs_Torus: {
741     gp_Torus tor = mySurface->Torus();
742
743     switch (myIso) {
744
745     case GeomAbs_IsoU: 
746       {
747         return ElSLib::TorusUIso(tor.Position(),tor.MajorRadius(),
748                                  tor.MinorRadius(),myParameter);
749       }
750       
751     case GeomAbs_IsoV: 
752       {
753         return ElSLib::TorusVIso(tor.Position(),tor.MajorRadius(),
754                                  tor.MinorRadius(),myParameter);
755       }
756       
757     case GeomAbs_NoneIso: 
758       {
759         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
760         return gp_Circ();
761       }
762     }
763     break;
764   }
765     
766   case GeomAbs_SurfaceOfRevolution: 
767     {
768       if (myIso == GeomAbs_IsoV) {
769         gp_Ax1 Ax1 = mySurface->AxeOfRevolution();
770         gp_Vec DX(Ax1.Location(), Value(0));
771         if(DX.IsParallel(Ax1.Direction(),Precision::Angular())) {
772           return gp_Circ(gp_Ax2(Value(0), Ax1.Direction()),0);
773         }
774         else {
775           axes = gp_Ax3(Ax1.Location(), Ax1.Direction(), DX);
776           computeHR(axes,Value(0),h,radius);
777           gp_Vec VT = axes.Direction();
778           axes.Translate(VT * h);
779           return gp_Circ(axes.Ax2(),radius);
780         }
781       }
782       else {
783         return mySurface->BasisCurve()->Circle().Rotated
784           (mySurface->AxeOfRevolution(),myParameter);
785       }
786     }
787     
788   case GeomAbs_SurfaceOfExtrusion: {
789     return  mySurface->BasisCurve()->Circle().Translated
790       (myParameter * gp_Vec(mySurface->Direction()));
791   }
792   default:  
793     {
794       Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Circle");
795       return gp_Circ();
796     }
797     
798   }
799   // portage WNT
800   return gp_Circ();
801 }
802
803 //=======================================================================
804 //function : Ellipse
805 //purpose  : 
806 //=======================================================================
807
808 gp_Elips Adaptor3d_IsoCurve::Ellipse() const
809 {
810   switch (mySurface->GetType()) {
811     
812   case GeomAbs_SurfaceOfExtrusion: {
813     return  mySurface->BasisCurve()->Ellipse().Translated
814       (myParameter * gp_Vec(mySurface->Direction()));
815   }
816   default:  
817     {
818       Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Ellipse");
819     } 
820   }
821   return gp_Elips();
822 }
823
824 //=======================================================================
825 //function : Hyperbola
826 //purpose  : 
827 //=======================================================================
828
829 gp_Hypr Adaptor3d_IsoCurve::Hyperbola() const
830 {
831   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Hyperbola");
832   return gp_Hypr();
833 }
834
835 //=======================================================================
836 //function : Parabola
837 //purpose  : 
838 //=======================================================================
839
840 gp_Parab Adaptor3d_IsoCurve::Parabola() const
841 {
842   Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:Parabola");
843   return gp_Parab();
844 }
845
846 //=======================================================================
847 //function : Degree
848 //purpose  : 
849 //=======================================================================
850
851 Standard_Integer Adaptor3d_IsoCurve::Degree() const 
852 {
853   Standard_Integer degree = 0 ;
854   GeomAbs_SurfaceType type = mySurface->GetType() ;
855   switch(type) {
856   case GeomAbs_BezierSurface:
857   case GeomAbs_BSplineSurface:
858     {
859       switch (myIso) {
860       case GeomAbs_IsoU:
861         degree = mySurface->VDegree() ;
862         break ;
863       case GeomAbs_IsoV:
864         degree = mySurface->UDegree() ;
865         break ;
866         
867       case GeomAbs_NoneIso:
868       default:
869         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
870       } 
871     }
872     break ;
873   case GeomAbs_SurfaceOfRevolution:
874     {
875       switch (myIso) {
876       case GeomAbs_IsoU:
877         degree = mySurface->BasisCurve()->Degree();
878         break;
879       default:
880         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
881       }
882     }
883     break;
884   case GeomAbs_SurfaceOfExtrusion:
885     {
886       switch (myIso) {
887       case GeomAbs_IsoV:
888         degree = mySurface->BasisCurve()->Degree();
889         break;
890       default:
891         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
892       }
893     }
894     break;
895   default:
896     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
897     break ;
898   }
899   return degree ;
900 }
901
902 //=======================================================================
903 //function : IsRational
904 //purpose  : 
905 //=======================================================================
906
907 Standard_Boolean Adaptor3d_IsoCurve::IsRational() const 
908 {
909   Standard_Integer is_rational = Standard_False ;
910   GeomAbs_SurfaceType type = mySurface->GetType() ;
911   switch(type) {
912   case GeomAbs_BezierSurface:
913   case GeomAbs_BSplineSurface:
914     {
915       switch (myIso) {
916       case GeomAbs_IsoU:
917         is_rational = mySurface->IsVRational() ;
918         break ;
919       case GeomAbs_IsoV:
920         is_rational = mySurface->IsURational() ;
921         break ;
922         
923       case GeomAbs_NoneIso:
924       default:
925         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
926       } 
927     }
928     break ;
929   case GeomAbs_SurfaceOfRevolution:
930     {
931       switch (myIso) {
932       case GeomAbs_IsoU:
933         is_rational = mySurface->BasisCurve()->IsRational();
934         break;
935       default:
936         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
937       }
938     }
939     break;
940   case GeomAbs_SurfaceOfExtrusion:
941     {
942       switch (myIso) {
943       case GeomAbs_IsoV:
944         is_rational = mySurface->BasisCurve()->IsRational();
945         break;
946       default:
947         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
948       }
949     }
950     break;
951   default:
952     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
953   }
954   return is_rational;
955 }       
956
957
958 //=======================================================================
959 //function : NbPoles
960 //purpose  : 
961 //=======================================================================
962
963 Standard_Integer Adaptor3d_IsoCurve::NbPoles() const 
964 {
965   Standard_Integer nb_poles = 0 ;
966   GeomAbs_SurfaceType type = mySurface->GetType() ;
967   switch(type) {
968   case GeomAbs_BezierSurface:
969   case GeomAbs_BSplineSurface:
970     switch (myIso) {
971     case GeomAbs_IsoU:
972       nb_poles = mySurface->NbVPoles() ;
973       break ;
974     case GeomAbs_IsoV:
975       nb_poles = mySurface->NbUPoles() ;
976       break ;
977       
978     case GeomAbs_NoneIso:
979     default:
980       Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
981     }   
982     break ;
983   case GeomAbs_SurfaceOfRevolution: 
984     {
985       switch( myIso) {
986       case GeomAbs_IsoU: 
987         {
988           nb_poles = mySurface->BasisCurve()->NbPoles();
989         }
990         break;
991       default:
992         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
993       }
994     }
995     break;
996   case GeomAbs_SurfaceOfExtrusion:
997     {
998       switch( myIso) {
999       case GeomAbs_IsoV: 
1000         {
1001           nb_poles = mySurface->BasisCurve()->NbPoles();
1002         }
1003         break;
1004       default:
1005         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1006       }
1007     }
1008     break;
1009
1010   default:
1011     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1012     break ;
1013   }
1014  return nb_poles ;
1015  }
1016
1017 //=======================================================================
1018 //function : NbKnots
1019 //purpose  : 
1020 //=======================================================================
1021
1022 Standard_Integer Adaptor3d_IsoCurve::NbKnots() const 
1023 {
1024   Standard_Integer nb_knots = 0 ;
1025   GeomAbs_SurfaceType type = mySurface->GetType() ;
1026   switch(type) {
1027   case GeomAbs_BSplineSurface:
1028     {
1029       switch (myIso) {
1030       case GeomAbs_IsoU:
1031         nb_knots = mySurface->NbVKnots() ;
1032         break ;
1033       case GeomAbs_IsoV:
1034         nb_knots = mySurface->NbUKnots() ;
1035         break ;
1036         
1037       case GeomAbs_NoneIso:
1038       default:
1039         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1040       } 
1041     }
1042     break ;
1043   case GeomAbs_SurfaceOfRevolution:
1044     {
1045       switch (myIso) {
1046       case GeomAbs_IsoU:
1047         {
1048           nb_knots = mySurface->BasisCurve()->NbKnots() ;
1049           break ;
1050         }
1051       default:
1052         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1053       } 
1054     }
1055     break ;
1056   case GeomAbs_SurfaceOfExtrusion:
1057     {
1058       switch (myIso) {
1059       case GeomAbs_IsoV:
1060         {
1061           nb_knots = mySurface->BasisCurve()->NbKnots() ;
1062           break ;
1063         }
1064       default:
1065         Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1066       } 
1067     }
1068     break ;
1069   default:
1070     Standard_NoSuchObject::Raise("Adaptor3d_IsoCurve:NoneIso");
1071     break ;
1072   }
1073   return nb_knots ;
1074  }
1075
1076 //=======================================================================
1077 //function : Bezier
1078 //purpose  : 
1079 //=======================================================================
1080
1081 Handle(Geom_BezierCurve) Adaptor3d_IsoCurve::Bezier() const 
1082 {
1083   Handle(Geom_BezierCurve) C;
1084   if (mySurface->GetType() == GeomAbs_SurfaceOfRevolution) {
1085     C = mySurface->BasisCurve()->Bezier();
1086     C = Handle(Geom_BezierCurve)::DownCast(C->Copy());
1087     C->Rotate(mySurface->AxeOfRevolution(),myParameter);
1088   }
1089   else if (mySurface->GetType() == GeomAbs_SurfaceOfExtrusion) {
1090     C = mySurface->BasisCurve()->Bezier();
1091     C = Handle(Geom_BezierCurve)::DownCast(C->Copy());
1092     C->Translate(myParameter * gp_Vec(mySurface->Direction()));
1093   }
1094   else if (myIso == GeomAbs_IsoU) {
1095     C = Handle(Geom_BezierCurve)::DownCast
1096       (mySurface->Bezier()->UIso(myParameter)) ;
1097   }
1098   else {
1099     C = Handle(Geom_BezierCurve)::DownCast
1100       (mySurface->Bezier()->VIso(myParameter));
1101   }
1102 //  C->Segment(myFirst,myLast);
1103   return C;
1104 }
1105
1106 //=======================================================================
1107 //function : BSpline
1108 //purpose  : 
1109 //=======================================================================
1110
1111 Handle(Geom_BSplineCurve) Adaptor3d_IsoCurve::BSpline() const 
1112 {
1113   Handle(Geom_BSplineCurve) C;
1114   if (mySurface->GetType() == GeomAbs_SurfaceOfRevolution) {
1115     C = mySurface->BasisCurve()->BSpline();
1116     C = Handle(Geom_BSplineCurve)::DownCast(C->Copy());
1117     C->Rotate(mySurface->AxeOfRevolution(),myParameter);
1118   }
1119   else if (mySurface->GetType() == GeomAbs_SurfaceOfExtrusion) {
1120     C = mySurface->BasisCurve()->BSpline();
1121     C = Handle(Geom_BSplineCurve)::DownCast(C->Copy());
1122     C->Translate(myParameter * gp_Vec(mySurface->Direction()));
1123   }
1124   else if (myIso == GeomAbs_IsoU) {
1125     C = Handle(Geom_BSplineCurve)::DownCast
1126       (mySurface->BSpline()->UIso(myParameter)) ;
1127   }
1128   else {
1129     C = Handle(Geom_BSplineCurve)::DownCast
1130       (mySurface->BSpline()->VIso(myParameter));
1131   }
1132 //  C->Segment(myFirst,myLast);
1133   return C;
1134 }
1135