1 // Created on: 1993-05-14
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // Modified: Thu Nov 26 16:37:18 1998
18 // correction in NbUIntervals for SurfaceOfLinearExtrusion
21 #define No_Standard_RangeError
22 #define No_Standard_OutOfRange
24 #include <Adaptor3d_HCurve.hxx>
25 #include <Adaptor3d_HSurface.hxx>
26 #include <BSplCLib.hxx>
27 #include <BSplSLib_Cache.hxx>
28 #include <Geom_BezierSurface.hxx>
29 #include <Geom_BSplineSurface.hxx>
30 #include <Geom_Circle.hxx>
31 #include <Geom_ConicalSurface.hxx>
32 #include <Geom_Curve.hxx>
33 #include <Geom_CylindricalSurface.hxx>
34 #include <Geom_OffsetSurface.hxx>
35 #include <Geom_Plane.hxx>
36 #include <Geom_RectangularTrimmedSurface.hxx>
37 #include <Geom_SphericalSurface.hxx>
38 #include <Geom_Surface.hxx>
39 #include <Geom_SurfaceOfLinearExtrusion.hxx>
40 #include <Geom_SurfaceOfRevolution.hxx>
41 #include <Geom_ToroidalSurface.hxx>
42 #include <GeomAdaptor_Curve.hxx>
43 #include <GeomAdaptor_HCurve.hxx>
44 #include <GeomAdaptor_HSurface.hxx>
45 #include <GeomAdaptor_Surface.hxx>
46 #include <GeomEvaluator_OffsetSurface.hxx>
47 #include <GeomEvaluator_SurfaceOfExtrusion.hxx>
48 #include <GeomEvaluator_SurfaceOfRevolution.hxx>
50 #include <gp_Circ.hxx>
51 #include <gp_Cone.hxx>
52 #include <gp_Cylinder.hxx>
57 #include <gp_Sphere.hxx>
58 #include <gp_Torus.hxx>
59 #include <gp_Trsf.hxx>
61 #include <Precision.hxx>
62 #include <Standard_ConstructionError.hxx>
63 #include <Standard_DomainError.hxx>
64 #include <Standard_NoSuchObject.hxx>
65 #include <Standard_NullObject.hxx>
66 #include <Standard_OutOfRange.hxx>
67 #include <TColStd_Array1OfInteger.hxx>
68 #include <TColStd_Array1OfReal.hxx>
69 #include <TColStd_HArray1OfInteger.hxx>
71 static const Standard_Real PosTol = Precision::PConfusion()*0.5;
73 //=======================================================================
74 //function : LocalContinuity
76 //=======================================================================
78 GeomAbs_Shape LocalContinuity(Standard_Integer Degree,
80 TColStd_Array1OfReal& TK,
81 TColStd_Array1OfInteger& TM,
84 Standard_Boolean IsPeriodic)
86 Standard_DomainError_Raise_if( (TK.Length()!=Nb || TM.Length()!=Nb )," ");
87 Standard_Integer Index1 = 0;
88 Standard_Integer Index2 = 0;
89 Standard_Real newFirst, newLast;
90 BSplCLib::LocateParameter(Degree,TK,TM,PFirst,IsPeriodic,1,Nb,Index1,newFirst);
91 BSplCLib::LocateParameter(Degree,TK,TM,PLast, IsPeriodic,1,Nb,Index2,newLast );
92 const Standard_Real EpsKnot = Precision::PConfusion();
93 if (Abs(newFirst-TK(Index1+1))< EpsKnot) Index1++;
94 if (Abs(newLast -TK(Index2 ))< EpsKnot) Index2--;
95 // attention aux courbes peridiques.
96 if ( (IsPeriodic) && (Index1 == Nb) )
101 Standard_Integer i, Multmax = TM(Index1+1);
102 for (i = Index1+1; i<=Index2; i++) {
103 if (TM(i)>Multmax) Multmax=TM(i);
105 Multmax = Degree - Multmax;
106 if (Multmax <= 0) return GeomAbs_C0;
108 case 1: return GeomAbs_C1;
109 case 2: return GeomAbs_C2;
110 case 3: return GeomAbs_C3;
116 //=======================================================================
119 //=======================================================================
121 void GeomAdaptor_Surface::load(const Handle(Geom_Surface)& S,
122 const Standard_Real UFirst,
123 const Standard_Real ULast,
124 const Standard_Real VFirst,
125 const Standard_Real VLast,
126 const Standard_Real TolU,
127 const Standard_Real TolV)
136 if ( mySurface != S) {
138 mySurfaceCache = Handle(BSplSLib_Cache)();
139 myNestedEvaluator = Handle(GeomEvaluator_Surface)();
141 const Handle(Standard_Type)& TheType = S->DynamicType();
142 if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
143 Load(Handle(Geom_RectangularTrimmedSurface)::DownCast (S)->BasisSurface(),
144 UFirst,ULast,VFirst,VLast);
146 else if ( TheType == STANDARD_TYPE(Geom_Plane))
147 mySurfaceType = GeomAbs_Plane;
148 else if ( TheType == STANDARD_TYPE(Geom_CylindricalSurface))
149 mySurfaceType = GeomAbs_Cylinder;
150 else if ( TheType == STANDARD_TYPE(Geom_ConicalSurface))
151 mySurfaceType = GeomAbs_Cone;
152 else if ( TheType == STANDARD_TYPE(Geom_SphericalSurface))
153 mySurfaceType = GeomAbs_Sphere;
154 else if ( TheType == STANDARD_TYPE(Geom_ToroidalSurface))
155 mySurfaceType = GeomAbs_Torus;
156 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution))
158 mySurfaceType = GeomAbs_SurfaceOfRevolution;
159 Handle(Geom_SurfaceOfRevolution) myRevSurf =
160 Handle(Geom_SurfaceOfRevolution)::DownCast(mySurface);
161 // Create nested adaptor for base curve
162 Handle(Geom_Curve) aBaseCurve = myRevSurf->BasisCurve();
163 Handle(GeomAdaptor_HCurve) aBaseAdaptor = new GeomAdaptor_HCurve(aBaseCurve);
164 // Create corresponding evaluator
165 myNestedEvaluator = new GeomEvaluator_SurfaceOfRevolution(
166 Handle(Adaptor3d_HCurve)::DownCast(aBaseAdaptor),
167 myRevSurf->Direction(), myRevSurf->Location());
169 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion))
171 mySurfaceType = GeomAbs_SurfaceOfExtrusion;
172 Handle(Geom_SurfaceOfLinearExtrusion) myExtSurf =
173 Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(mySurface);
174 // Create nested adaptor for base curve
175 Handle(Geom_Curve) aBaseCurve = myExtSurf->BasisCurve();
176 Handle(GeomAdaptor_HCurve) aBaseAdaptor = new GeomAdaptor_HCurve(aBaseCurve);
177 // Create corresponding evaluator
178 myNestedEvaluator = new GeomEvaluator_SurfaceOfExtrusion(
179 Handle(Adaptor3d_HCurve)::DownCast(aBaseAdaptor), myExtSurf->Direction());
181 else if (TheType == STANDARD_TYPE(Geom_BezierSurface))
183 mySurfaceType = GeomAbs_BezierSurface;
184 // Create cache for Bezier
185 Handle(Geom_BezierSurface) aBezier = Handle(Geom_BezierSurface)::DownCast(mySurface);
186 Standard_Integer aDegU = aBezier->UDegree();
187 Standard_Integer aDegV = aBezier->VDegree();
188 TColStd_Array1OfReal aFlatKnotsU(BSplCLib::FlatBezierKnots(aDegU), 1, 2 * (aDegU + 1));
189 TColStd_Array1OfReal aFlatKnotsV(BSplCLib::FlatBezierKnots(aDegV), 1, 2 * (aDegV + 1));
190 mySurfaceCache = new BSplSLib_Cache(
191 aDegU, aBezier->IsUPeriodic(), aFlatKnotsU,
192 aDegV, aBezier->IsVPeriodic(), aFlatKnotsV,
193 aBezier->Poles(), aBezier->Weights());
195 else if (TheType == STANDARD_TYPE(Geom_BSplineSurface)) {
196 mySurfaceType = GeomAbs_BSplineSurface;
197 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
198 // Create cache for B-spline
199 mySurfaceCache = new BSplSLib_Cache(
200 myBspl->UDegree(), myBspl->IsUPeriodic(), myBspl->UKnotSequence(),
201 myBspl->VDegree(), myBspl->IsVPeriodic(), myBspl->VKnotSequence(),
202 myBspl->Poles(), myBspl->Weights());
204 else if ( TheType == STANDARD_TYPE(Geom_OffsetSurface))
206 mySurfaceType = GeomAbs_OffsetSurface;
207 Handle(Geom_OffsetSurface) myOffSurf = Handle(Geom_OffsetSurface)::DownCast(mySurface);
208 // Create nested adaptor for base surface
209 Handle(Geom_Surface) aBaseSurf = myOffSurf->BasisSurface();
210 Handle(GeomAdaptor_HSurface) aBaseAdaptor =
211 new GeomAdaptor_HSurface(aBaseSurf, myUFirst, myULast, myVFirst, myVLast, myTolU, myTolV);
212 myNestedEvaluator = new GeomEvaluator_OffsetSurface(
213 aBaseAdaptor, myOffSurf->Offset(), myOffSurf->OsculatingSurface());
216 mySurfaceType = GeomAbs_OtherSurface;
221 // -- Global methods - Apply to the whole Surface.
225 //=======================================================================
226 //function : UContinuity
228 //=======================================================================
230 GeomAbs_Shape GeomAdaptor_Surface::UContinuity() const
232 switch (mySurfaceType)
234 case GeomAbs_BSplineSurface:
236 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
237 const Standard_Integer N = myBspl->NbUKnots();
238 TColStd_Array1OfReal TK(1,N);
239 TColStd_Array1OfInteger TM(1,N);
241 myBspl->UMultiplicities(TM);
242 return LocalContinuity(myBspl->UDegree(), myBspl->NbUKnots(), TK, TM,
243 myUFirst, myULast, IsUPeriodic());
245 case GeomAbs_OffsetSurface:
247 switch(BasisSurface()->UContinuity())
250 case GeomAbs_C3 : return GeomAbs_CN;
252 case GeomAbs_C2 : return GeomAbs_C1;
254 case GeomAbs_C1 : return GeomAbs_C0;
255 case GeomAbs_C0 : break;
257 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UContinuity");
260 case GeomAbs_SurfaceOfExtrusion:
262 Handle(Geom_SurfaceOfLinearExtrusion) myExtSurf =
263 Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(mySurface);
264 GeomAdaptor_Curve GC(myExtSurf->BasisCurve(), myUFirst, myULast);
265 return GC.Continuity();
267 case GeomAbs_OtherSurface:
268 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UContinuity");
270 case GeomAbs_Cylinder:
274 case GeomAbs_BezierSurface:
275 case GeomAbs_SurfaceOfRevolution: break;
280 //=======================================================================
281 //function : VContinuity
283 //=======================================================================
285 GeomAbs_Shape GeomAdaptor_Surface::VContinuity() const
287 switch (mySurfaceType)
289 case GeomAbs_BSplineSurface:
291 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
292 const Standard_Integer N = myBspl->NbVKnots();
293 TColStd_Array1OfReal TK(1,N);
294 TColStd_Array1OfInteger TM(1,N);
296 myBspl->VMultiplicities(TM);
297 return LocalContinuity(myBspl->VDegree(), myBspl->NbVKnots(), TK, TM,
298 myVFirst, myVLast, IsVPeriodic());
300 case GeomAbs_OffsetSurface:
302 switch(BasisSurface()->VContinuity())
305 case GeomAbs_C3 : return GeomAbs_CN;
307 case GeomAbs_C2 : return GeomAbs_C1;
309 case GeomAbs_C1 : return GeomAbs_C0;
310 case GeomAbs_C0 : break;
312 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VContinuity");
315 case GeomAbs_SurfaceOfRevolution:
317 Handle(Geom_SurfaceOfRevolution) myRevSurf =
318 Handle(Geom_SurfaceOfRevolution)::DownCast(mySurface);
319 GeomAdaptor_Curve GC(myRevSurf->BasisCurve(), myVFirst, myVLast);
320 return GC.Continuity();
322 case GeomAbs_OtherSurface:
323 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VContinuity");
325 case GeomAbs_Cylinder:
329 case GeomAbs_BezierSurface:
330 case GeomAbs_SurfaceOfExtrusion: break;
335 //=======================================================================
336 //function : NbUIntervals
338 //=======================================================================
340 Standard_Integer GeomAdaptor_Surface::NbUIntervals(const GeomAbs_Shape S) const
342 switch (mySurfaceType)
344 case GeomAbs_BSplineSurface:
346 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
347 GeomAdaptor_Curve myBasisCurve
348 (myBspl->VIso(myBspl->VKnot(myBspl->FirstVKnotIndex())),myUFirst,myULast);
349 return myBasisCurve.NbIntervals(S);
351 case GeomAbs_SurfaceOfExtrusion:
353 Handle(Geom_SurfaceOfLinearExtrusion) myExtSurf =
354 Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(mySurface);
355 GeomAdaptor_Curve myBasisCurve(myExtSurf->BasisCurve(), myUFirst, myULast);
356 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
357 return myBasisCurve.NbIntervals(S);
360 case GeomAbs_OffsetSurface:
362 GeomAbs_Shape BaseS = GeomAbs_CN;
366 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::NbUIntervals");
367 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
368 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
369 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
371 case GeomAbs_CN: break;
373 Handle(Geom_OffsetSurface) myOffSurf = Handle(Geom_OffsetSurface)::DownCast(mySurface);
374 GeomAdaptor_Surface Sur(myOffSurf->BasisSurface());
375 return Sur.NbUIntervals(BaseS);
378 case GeomAbs_Cylinder:
382 case GeomAbs_BezierSurface:
383 case GeomAbs_OtherSurface:
384 case GeomAbs_SurfaceOfRevolution: break;
389 //=======================================================================
390 //function : NbVIntervals
392 //=======================================================================
394 Standard_Integer GeomAdaptor_Surface::NbVIntervals(const GeomAbs_Shape S) const
396 switch (mySurfaceType)
398 case GeomAbs_BSplineSurface:
400 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
401 GeomAdaptor_Curve myBasisCurve
402 (myBspl->UIso(myBspl->UKnot(myBspl->FirstUKnotIndex())),myVFirst,myVLast);
403 return myBasisCurve.NbIntervals(S);
405 case GeomAbs_SurfaceOfRevolution:
407 Handle(Geom_SurfaceOfRevolution) myRevSurf =
408 Handle(Geom_SurfaceOfRevolution)::DownCast(mySurface);
409 GeomAdaptor_Curve myBasisCurve(myRevSurf->BasisCurve(), myVFirst, myVLast);
410 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
411 return myBasisCurve.NbIntervals(S);
414 case GeomAbs_OffsetSurface:
416 GeomAbs_Shape BaseS = GeomAbs_CN;
420 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::NbVIntervals");
421 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
422 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
423 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
425 case GeomAbs_CN: break;
427 Handle(Geom_OffsetSurface) myOffSurf = Handle(Geom_OffsetSurface)::DownCast(mySurface);
428 GeomAdaptor_Surface Sur(myOffSurf->BasisSurface());
429 return Sur.NbVIntervals(BaseS);
432 case GeomAbs_Cylinder:
436 case GeomAbs_BezierSurface:
437 case GeomAbs_OtherSurface:
438 case GeomAbs_SurfaceOfExtrusion: break;
443 //=======================================================================
444 //function : UIntervals
446 //=======================================================================
448 void GeomAdaptor_Surface::UIntervals(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
450 Standard_Integer myNbUIntervals = 1;
452 switch (mySurfaceType)
454 case GeomAbs_BSplineSurface:
456 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
457 GeomAdaptor_Curve myBasisCurve
458 (myBspl->VIso(myBspl->VKnot(myBspl->FirstVKnotIndex())),myUFirst,myULast);
459 myNbUIntervals = myBasisCurve.NbIntervals(S);
460 myBasisCurve.Intervals(T,S);
463 case GeomAbs_SurfaceOfExtrusion:
465 GeomAdaptor_Curve myBasisCurve
466 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
467 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
469 myNbUIntervals = myBasisCurve.NbIntervals(S);
470 myBasisCurve.Intervals(T,S);
474 case GeomAbs_OffsetSurface:
476 GeomAbs_Shape BaseS = GeomAbs_CN;
480 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::UIntervals");
481 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
482 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
483 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
485 case GeomAbs_CN: break;
487 Handle(Geom_OffsetSurface) myOffSurf = Handle(Geom_OffsetSurface)::DownCast(mySurface);
488 GeomAdaptor_Surface Sur(myOffSurf->BasisSurface());
489 myNbUIntervals = Sur.NbUIntervals(BaseS);
490 Sur.UIntervals(T, BaseS);
493 case GeomAbs_Cylinder:
497 case GeomAbs_BezierSurface:
498 case GeomAbs_OtherSurface:
499 case GeomAbs_SurfaceOfRevolution: break;
502 T(T.Lower()) = myUFirst;
503 T(T.Lower() + myNbUIntervals) = myULast;
506 //=======================================================================
507 //function : VIntervals
509 //=======================================================================
511 void GeomAdaptor_Surface::VIntervals(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
513 Standard_Integer myNbVIntervals = 1;
515 switch (mySurfaceType)
517 case GeomAbs_BSplineSurface:
519 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
520 GeomAdaptor_Curve myBasisCurve
521 (myBspl->UIso(myBspl->UKnot(myBspl->FirstUKnotIndex())),myVFirst,myVLast);
522 myNbVIntervals = myBasisCurve.NbIntervals(S);
523 myBasisCurve.Intervals(T,S);
526 case GeomAbs_SurfaceOfRevolution:
528 Handle(Geom_SurfaceOfRevolution) myRevSurf =
529 Handle(Geom_SurfaceOfRevolution)::DownCast(mySurface);
530 GeomAdaptor_Curve myBasisCurve(myRevSurf->BasisCurve(), myVFirst, myVLast);
531 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
533 myNbVIntervals = myBasisCurve.NbIntervals(S);
534 myBasisCurve.Intervals(T,S);
538 case GeomAbs_OffsetSurface:
540 GeomAbs_Shape BaseS = GeomAbs_CN;
544 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::VIntervals");
545 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
546 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
547 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
549 case GeomAbs_CN: break;
551 Handle(Geom_OffsetSurface) myOffSurf = Handle(Geom_OffsetSurface)::DownCast(mySurface);
552 GeomAdaptor_Surface Sur(myOffSurf->BasisSurface());
553 myNbVIntervals = Sur.NbVIntervals(BaseS);
554 Sur.VIntervals(T, BaseS);
557 case GeomAbs_Cylinder:
561 case GeomAbs_BezierSurface:
562 case GeomAbs_OtherSurface:
563 case GeomAbs_SurfaceOfExtrusion: break;
566 T(T.Lower()) = myVFirst;
567 T(T.Lower() + myNbVIntervals) = myVLast;
570 //=======================================================================
573 //=======================================================================
575 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::UTrim(const Standard_Real First,
576 const Standard_Real Last ,
577 const Standard_Real Tol ) const
579 return Handle(GeomAdaptor_HSurface)
580 (new GeomAdaptor_HSurface(mySurface,First,Last,myVFirst,myVLast,Tol,myTolV));
583 //=======================================================================
586 //=======================================================================
588 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::VTrim(const Standard_Real First,
589 const Standard_Real Last ,
590 const Standard_Real Tol ) const
592 return Handle(GeomAdaptor_HSurface)
593 (new GeomAdaptor_HSurface(mySurface,myUFirst,myULast,First,Last,myTolU,Tol));
596 //=======================================================================
597 //function : IsUClosed
599 //=======================================================================
601 Standard_Boolean GeomAdaptor_Surface::IsUClosed() const
603 if (!mySurface->IsUClosed())
604 return Standard_False;
606 Standard_Real U1,U2,V1,V2;
607 mySurface->Bounds(U1,U2,V1,V2);
608 if (mySurface->IsUPeriodic())
609 return (Abs(Abs(U1-U2)-Abs(myUFirst-myULast))<Precision::PConfusion());
611 return ( Abs(U1-myUFirst)<Precision::PConfusion()
612 && Abs(U2-myULast )<Precision::PConfusion() );
615 //=======================================================================
616 //function : IsVClosed
618 //=======================================================================
620 Standard_Boolean GeomAdaptor_Surface::IsVClosed() const
622 if (!mySurface->IsVClosed())
623 return Standard_False;
625 Standard_Real U1,U2,V1,V2;
626 mySurface->Bounds(U1,U2,V1,V2);
627 if (mySurface->IsVPeriodic())
628 return (Abs(Abs(V1-V2)-Abs(myVFirst-myVLast))<Precision::PConfusion());
630 return ( Abs(V1-myVFirst)<Precision::PConfusion()
631 && Abs(V2-myVLast )<Precision::PConfusion() );
634 //=======================================================================
635 //function : IsUPeriodic
637 //=======================================================================
639 Standard_Boolean GeomAdaptor_Surface::IsUPeriodic() const
641 return (mySurface->IsUPeriodic());
644 //=======================================================================
647 //=======================================================================
649 Standard_Real GeomAdaptor_Surface::UPeriod() const
651 Standard_NoSuchObject_Raise_if(!IsUPeriodic()," ");
652 return mySurface->UPeriod();
655 //=======================================================================
656 //function : IsVPeriodic
658 //=======================================================================
660 Standard_Boolean GeomAdaptor_Surface::IsVPeriodic() const
662 return (mySurface->IsVPeriodic());
665 //=======================================================================
668 //=======================================================================
670 Standard_Real GeomAdaptor_Surface::VPeriod() const
672 Standard_NoSuchObject_Raise_if(!IsVPeriodic()," ");
673 return mySurface->VPeriod();
676 //=======================================================================
677 //function : RebuildCache
679 //=======================================================================
680 void GeomAdaptor_Surface::RebuildCache(const Standard_Real theU,
681 const Standard_Real theV) const
683 if (mySurfaceType == GeomAbs_BezierSurface)
685 Handle(Geom_BezierSurface) aBezier = Handle(Geom_BezierSurface)::DownCast(mySurface);
686 Standard_Integer aDegU = aBezier->UDegree();
687 Standard_Integer aDegV = aBezier->VDegree();
688 TColStd_Array1OfReal aFlatKnotsU(BSplCLib::FlatBezierKnots(aDegU), 1, 2 * (aDegU + 1));
689 TColStd_Array1OfReal aFlatKnotsV(BSplCLib::FlatBezierKnots(aDegV), 1, 2 * (aDegV + 1));
690 mySurfaceCache->BuildCache(theU, theV,
691 aDegU, aBezier->IsUPeriodic(), aFlatKnotsU,
692 aDegV, aBezier->IsVPeriodic(), aFlatKnotsV,
693 aBezier->Poles(), aBezier->Weights());
695 else if (mySurfaceType == GeomAbs_BSplineSurface)
697 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
698 mySurfaceCache->BuildCache(theU, theV,
699 myBspl->UDegree(), myBspl->IsUPeriodic(), myBspl->UKnotSequence(),
700 myBspl->VDegree(), myBspl->IsVPeriodic(), myBspl->VKnotSequence(),
701 myBspl->Poles(), myBspl->Weights());
705 //=======================================================================
708 //=======================================================================
710 gp_Pnt GeomAdaptor_Surface::Value(const Standard_Real U,
711 const Standard_Real V) const
718 //=======================================================================
721 //=======================================================================
723 void GeomAdaptor_Surface::D0(const Standard_Real U,
724 const Standard_Real V, gp_Pnt& P) const
726 switch (mySurfaceType)
728 case GeomAbs_BezierSurface:
729 case GeomAbs_BSplineSurface:
730 if (!mySurfaceCache.IsNull())
732 if (!mySurfaceCache->IsCacheValid(U, V))
734 mySurfaceCache->D0(U, V, P);
737 mySurface->D0(U, V, P);
740 case GeomAbs_OffsetSurface:
741 case GeomAbs_SurfaceOfExtrusion:
742 case GeomAbs_SurfaceOfRevolution:
743 Standard_NoSuchObject_Raise_if(myNestedEvaluator.IsNull(),
744 "GeomAdaptor_Surface::D0: evaluator is not initialized");
745 myNestedEvaluator->D0(U, V, P);
749 mySurface->D0(U, V, P);
754 //=======================================================================
757 //=======================================================================
759 void GeomAdaptor_Surface::D1(const Standard_Real U,
760 const Standard_Real V,
765 Standard_Integer Ideb, Ifin, IVdeb, IVfin, USide=0, VSide=0;
766 Standard_Real u = U, v = V;
767 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
768 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
769 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
770 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
772 switch(mySurfaceType) {
773 case GeomAbs_BezierSurface:
774 case GeomAbs_BSplineSurface: {
775 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
776 if (!myBspl.IsNull() &&
777 (USide != 0 || VSide != 0) &&
778 IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
779 myBspl->LocalD1(u, v, Ideb, Ifin, IVdeb, IVfin, P, D1U, D1V);
780 else if (!mySurfaceCache.IsNull())
782 if (!mySurfaceCache->IsCacheValid(U, V))
784 mySurfaceCache->D1(U, V, P, D1U, D1V);
787 mySurface->D1(u, v, P, D1U, D1V);
791 case GeomAbs_SurfaceOfExtrusion:
792 case GeomAbs_SurfaceOfRevolution:
793 case GeomAbs_OffsetSurface:
794 Standard_NoSuchObject_Raise_if(myNestedEvaluator.IsNull(),
795 "GeomAdaptor_Surface::D1: evaluator is not initialized");
796 myNestedEvaluator->D1(u, v, P, D1U, D1V);
800 mySurface->D1(u, v, P, D1U, D1V);
804 //=======================================================================
807 //=======================================================================
809 void GeomAdaptor_Surface::D2(const Standard_Real U,
810 const Standard_Real V,
818 Standard_Integer Ideb, Ifin, IVdeb, IVfin, USide=0, VSide=0;
819 Standard_Real u = U, v = V;
820 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
821 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
822 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
823 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
825 switch(mySurfaceType) {
826 case GeomAbs_BezierSurface:
827 case GeomAbs_BSplineSurface: {
828 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
829 if (!myBspl.IsNull() &&
830 (USide != 0 || VSide != 0) &&
831 IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
832 myBspl->LocalD2(u, v, Ideb, Ifin, IVdeb, IVfin, P, D1U, D1V, D2U, D2V, D2UV);
833 else if (!mySurfaceCache.IsNull())
835 if (!mySurfaceCache->IsCacheValid(U, V))
837 mySurfaceCache->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
840 mySurface->D2(u, v, P, D1U, D1V, D2U, D2V, D2UV);
844 case GeomAbs_SurfaceOfExtrusion :
845 case GeomAbs_SurfaceOfRevolution :
846 case GeomAbs_OffsetSurface :
847 Standard_NoSuchObject_Raise_if(myNestedEvaluator.IsNull(),
848 "GeomAdaptor_Surface::D2: evaluator is not initialized");
849 myNestedEvaluator->D2(u, v, P, D1U, D1V, D2U, D2V, D2UV);
852 default: { mySurface->D2(u, v, P, D1U, D1V, D2U, D2V, D2UV);
858 //=======================================================================
861 //=======================================================================
863 void GeomAdaptor_Surface::D3(const Standard_Real U, const Standard_Real V,
864 gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V,
865 gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV,
866 gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV,
869 Standard_Integer Ideb,Ifin,IVdeb,IVfin,USide=0,VSide=0;
870 Standard_Real u = U, v = V;
871 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
872 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
873 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
874 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
876 switch(mySurfaceType) {
877 case GeomAbs_BSplineSurface: {
878 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
879 if ((USide == 0) && (VSide == 0))
880 myBspl->D3(u, v, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
882 if (IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
883 myBspl->LocalD3(u, v, Ideb, Ifin, IVdeb, IVfin,
884 P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
886 myBspl->D3(u, v, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
891 case GeomAbs_SurfaceOfExtrusion :
892 case GeomAbs_SurfaceOfRevolution :
893 case GeomAbs_OffsetSurface:
894 Standard_NoSuchObject_Raise_if(myNestedEvaluator.IsNull(),
895 "GeomAdaptor_Surface::D3: evaluator is not initialized");
896 myNestedEvaluator->D3(u, v, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
899 default : { mySurface->D3(u,v,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
904 //=======================================================================
907 //=======================================================================
909 gp_Vec GeomAdaptor_Surface::DN(const Standard_Real U,
910 const Standard_Real V,
911 const Standard_Integer Nu,
912 const Standard_Integer Nv) const
914 Standard_Integer Ideb,Ifin,IVdeb,IVfin,USide=0,VSide=0;
915 Standard_Real u = U, v = V;
916 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
917 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
918 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
919 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
921 switch(mySurfaceType)
923 case GeomAbs_BSplineSurface: {
924 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
925 if ((USide == 0) && (VSide == 0))
926 return myBspl->DN(u, v, Nu, Nv);
928 if (IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
929 return myBspl->LocalDN(u, v, Ideb, Ifin, IVdeb, IVfin, Nu, Nv);
931 return myBspl->DN(u, v, Nu, Nv);
935 case GeomAbs_SurfaceOfExtrusion:
936 case GeomAbs_SurfaceOfRevolution:
937 case GeomAbs_OffsetSurface:
938 Standard_NoSuchObject_Raise_if(myNestedEvaluator.IsNull(),
939 "GeomAdaptor_Surface::DN: evaluator is not initialized");
940 return myNestedEvaluator->DN(u, v, Nu, Nv);
943 case GeomAbs_Cylinder:
947 case GeomAbs_BezierSurface:
948 case GeomAbs_OtherSurface:
953 return mySurface->DN(u,v, Nu, Nv);
957 //=======================================================================
958 //function : UResolution
960 //=======================================================================
962 Standard_Real GeomAdaptor_Surface::UResolution(const Standard_Real R3d) const
964 Standard_Real Res = 0.;
966 switch (mySurfaceType)
968 case GeomAbs_SurfaceOfExtrusion:
970 GeomAdaptor_Curve myBasisCurve
971 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
972 return myBasisCurve.Resolution(R3d);
976 Handle(Geom_ToroidalSurface) S (Handle(Geom_ToroidalSurface)::DownCast (mySurface));
977 const Standard_Real R = S->MajorRadius() + S->MinorRadius();
978 if(R>Precision::Confusion())
984 Handle(Geom_SphericalSurface) S (Handle(Geom_SphericalSurface)::DownCast (mySurface));
985 const Standard_Real R = S->Radius();
986 if(R>Precision::Confusion())
990 case GeomAbs_Cylinder:
992 Handle(Geom_CylindricalSurface) S (Handle(Geom_CylindricalSurface)::DownCast (mySurface));
993 const Standard_Real R = S->Radius();
994 if(R>Precision::Confusion())
1000 if (myVLast - myVFirst > 1.e10) {
1001 // Pas vraiment borne => resolution inconnue
1002 return Precision::Parametric(R3d);
1004 Handle(Geom_ConicalSurface) S (Handle(Geom_ConicalSurface)::DownCast (mySurface));
1005 Handle(Geom_Curve) C = S->VIso(myVLast);
1006 const Standard_Real Rayon1 = Handle(Geom_Circle)::DownCast (C)->Radius();
1007 C = S->VIso(myVFirst);
1008 const Standard_Real Rayon2 = Handle(Geom_Circle)::DownCast (C)->Radius();
1009 const Standard_Real R = (Rayon1 > Rayon2)? Rayon1 : Rayon2;
1010 return (R>Precision::Confusion()? (R3d / R) : 0.);
1016 case GeomAbs_BezierSurface:
1018 Standard_Real Ures,Vres;
1019 Handle(Geom_BezierSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1022 case GeomAbs_BSplineSurface:
1024 Standard_Real Ures,Vres;
1025 Handle(Geom_BSplineSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1028 case GeomAbs_OffsetSurface:
1030 Handle(Geom_Surface) base = Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface();
1031 GeomAdaptor_Surface gabase(base,myUFirst,myULast,myVFirst,myVLast);
1032 return gabase.UResolution(R3d);
1034 default: return Precision::Parametric(R3d);
1038 return 2.*ASin(Res);
1043 //=======================================================================
1044 //function : VResolution
1046 //=======================================================================
1048 Standard_Real GeomAdaptor_Surface::VResolution(const Standard_Real R3d) const
1050 Standard_Real Res = 0.;
1052 switch (mySurfaceType)
1054 case GeomAbs_SurfaceOfRevolution:
1056 GeomAdaptor_Curve myBasisCurve
1057 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1058 return myBasisCurve.Resolution(R3d);
1062 Handle(Geom_ToroidalSurface) S (Handle(Geom_ToroidalSurface)::DownCast (mySurface));
1063 const Standard_Real R = S->MinorRadius();
1064 if(R>Precision::Confusion())
1068 case GeomAbs_Sphere:
1070 Handle(Geom_SphericalSurface) S (Handle(Geom_SphericalSurface)::DownCast (mySurface));
1071 const Standard_Real R = S->Radius();
1072 if(R>Precision::Confusion())
1076 case GeomAbs_SurfaceOfExtrusion:
1077 case GeomAbs_Cylinder:
1083 case GeomAbs_BezierSurface:
1085 Standard_Real Ures,Vres;
1086 Handle(Geom_BezierSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1089 case GeomAbs_BSplineSurface:
1091 Standard_Real Ures,Vres;
1092 Handle(Geom_BSplineSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1095 case GeomAbs_OffsetSurface:
1097 Handle(Geom_Surface) base = Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface();
1098 GeomAdaptor_Surface gabase(base,myUFirst,myULast,myVFirst,myVLast);
1099 return gabase.VResolution(R3d);
1101 default: return Precision::Parametric(R3d);
1105 return 2.*ASin(Res);
1110 //=======================================================================
1113 //=======================================================================
1115 gp_Pln GeomAdaptor_Surface::Plane() const
1117 if (mySurfaceType != GeomAbs_Plane)
1118 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Plane");
1119 return Handle(Geom_Plane)::DownCast (mySurface)->Pln();
1122 //=======================================================================
1123 //function : Cylinder
1125 //=======================================================================
1127 gp_Cylinder GeomAdaptor_Surface::Cylinder() const
1129 if (mySurfaceType != GeomAbs_Cylinder)
1130 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Cylinder");
1131 return Handle(Geom_CylindricalSurface)::DownCast (mySurface)->Cylinder();
1134 //=======================================================================
1137 //=======================================================================
1139 gp_Cone GeomAdaptor_Surface::Cone() const
1141 if (mySurfaceType != GeomAbs_Cone)
1142 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Cone");
1143 return Handle(Geom_ConicalSurface)::DownCast (mySurface)->Cone();
1146 //=======================================================================
1149 //=======================================================================
1151 gp_Sphere GeomAdaptor_Surface::Sphere() const
1153 if (mySurfaceType != GeomAbs_Sphere)
1154 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Sphere");
1155 return Handle(Geom_SphericalSurface)::DownCast (mySurface)->Sphere();
1158 //=======================================================================
1161 //=======================================================================
1163 gp_Torus GeomAdaptor_Surface::Torus() const
1165 if (mySurfaceType != GeomAbs_Torus)
1166 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Torus");
1167 return Handle(Geom_ToroidalSurface)::DownCast (mySurface)->Torus();
1170 //=======================================================================
1171 //function : UDegree
1173 //=======================================================================
1175 Standard_Integer GeomAdaptor_Surface::UDegree() const
1177 if (mySurfaceType == GeomAbs_BSplineSurface)
1178 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->UDegree();
1179 if ( mySurfaceType == GeomAbs_BezierSurface)
1180 return Handle(Geom_BezierSurface)::DownCast (mySurface)->UDegree();
1181 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1183 GeomAdaptor_Curve myBasisCurve
1184 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1185 return myBasisCurve.Degree();
1187 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UDegree");
1191 //=======================================================================
1192 //function : NbUPoles
1194 //=======================================================================
1196 Standard_Integer GeomAdaptor_Surface::NbUPoles() const
1198 if (mySurfaceType == GeomAbs_BSplineSurface)
1199 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbUPoles();
1200 if ( mySurfaceType == GeomAbs_BezierSurface)
1201 return Handle(Geom_BezierSurface)::DownCast (mySurface)->NbUPoles();
1202 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1204 GeomAdaptor_Curve myBasisCurve
1205 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1206 return myBasisCurve.NbPoles();
1208 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbUPoles");
1212 //=======================================================================
1213 //function : VDegree
1215 //=======================================================================
1217 Standard_Integer GeomAdaptor_Surface::VDegree() const
1219 if (mySurfaceType == GeomAbs_BSplineSurface)
1220 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->VDegree();
1221 if ( mySurfaceType == GeomAbs_BezierSurface)
1222 return Handle(Geom_BezierSurface)::DownCast (mySurface)->VDegree();
1223 if ( mySurfaceType == GeomAbs_SurfaceOfRevolution)
1225 GeomAdaptor_Curve myBasisCurve
1226 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1227 return myBasisCurve.Degree();
1229 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VDegree");
1233 //=======================================================================
1234 //function : NbVPoles
1236 //=======================================================================
1238 Standard_Integer GeomAdaptor_Surface::NbVPoles() const
1240 if (mySurfaceType == GeomAbs_BSplineSurface)
1241 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbVPoles();
1242 if ( mySurfaceType == GeomAbs_BezierSurface)
1243 return Handle(Geom_BezierSurface)::DownCast (mySurface)->NbVPoles();
1244 if ( mySurfaceType == GeomAbs_SurfaceOfRevolution)
1246 GeomAdaptor_Curve myBasisCurve
1247 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1248 return myBasisCurve.NbPoles();
1250 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbVPoles");
1254 //=======================================================================
1255 //function : NbUKnots
1257 //=======================================================================
1259 Standard_Integer GeomAdaptor_Surface::NbUKnots() const
1261 if (mySurfaceType == GeomAbs_BSplineSurface)
1262 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbUKnots();
1263 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1265 GeomAdaptor_Curve myBasisCurve
1266 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1267 return myBasisCurve.NbKnots();
1269 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbUKnots");
1273 //=======================================================================
1274 //function : NbVKnots
1276 //=======================================================================
1278 Standard_Integer GeomAdaptor_Surface::NbVKnots() const
1280 if (mySurfaceType == GeomAbs_BSplineSurface)
1281 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbVKnots();
1282 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbVKnots");
1285 //=======================================================================
1286 //function : IsURational
1288 //=======================================================================
1290 Standard_Boolean GeomAdaptor_Surface::IsURational() const
1292 if (mySurfaceType == GeomAbs_BSplineSurface)
1293 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->IsURational();
1294 if (mySurfaceType == GeomAbs_BezierSurface)
1295 return Handle(Geom_BezierSurface)::DownCast (mySurface)->IsURational();
1296 return Standard_False;
1299 //=======================================================================
1300 //function : IsVRational
1302 //=======================================================================
1304 Standard_Boolean GeomAdaptor_Surface::IsVRational() const
1306 if (mySurfaceType == GeomAbs_BSplineSurface)
1307 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->IsVRational();
1308 if (mySurfaceType == GeomAbs_BezierSurface)
1309 return Handle(Geom_BezierSurface)::DownCast (mySurface)->IsVRational();
1310 return Standard_False;
1313 //=======================================================================
1316 //=======================================================================
1318 Handle(Geom_BezierSurface) GeomAdaptor_Surface::Bezier() const
1320 if (mySurfaceType != GeomAbs_BezierSurface)
1321 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Bezier");
1322 return Handle(Geom_BezierSurface)::DownCast (mySurface);
1325 //=======================================================================
1326 //function : BSpline
1328 //=======================================================================
1330 Handle(Geom_BSplineSurface) GeomAdaptor_Surface::BSpline() const
1332 if (mySurfaceType != GeomAbs_BSplineSurface)
1333 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BSpline");
1334 return Handle(Geom_BSplineSurface)::DownCast (mySurface);
1337 //=======================================================================
1338 //function : AxeOfRevolution
1340 //=======================================================================
1342 gp_Ax1 GeomAdaptor_Surface::AxeOfRevolution() const
1344 if (mySurfaceType != GeomAbs_SurfaceOfRevolution)
1345 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::AxeOfRevolution");
1346 return Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->Axis();
1349 //=======================================================================
1350 //function : Direction
1352 //=======================================================================
1354 gp_Dir GeomAdaptor_Surface::Direction() const
1356 if (mySurfaceType != GeomAbs_SurfaceOfExtrusion)
1357 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Direction");
1358 return Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->Direction();
1361 //=======================================================================
1362 //function : BasisCurve
1364 //=======================================================================
1366 Handle(Adaptor3d_HCurve) GeomAdaptor_Surface::BasisCurve() const
1368 Handle(Geom_Curve) C;
1369 if (mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1370 C = Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve();
1371 else if (mySurfaceType == GeomAbs_SurfaceOfRevolution)
1372 C = Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve();
1374 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisCurve");
1375 return Handle(GeomAdaptor_HCurve)(new GeomAdaptor_HCurve(C));
1378 //=======================================================================
1379 //function : BasisSurface
1381 //=======================================================================
1383 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::BasisSurface() const
1385 if (mySurfaceType != GeomAbs_OffsetSurface)
1386 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisSurface");
1387 return new GeomAdaptor_HSurface
1388 (Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface(),
1389 myUFirst,myULast,myVFirst,myVLast);
1392 //=======================================================================
1393 //function : OffsetValue
1395 //=======================================================================
1397 Standard_Real GeomAdaptor_Surface::OffsetValue() const
1399 if (mySurfaceType != GeomAbs_OffsetSurface)
1400 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisSurface");
1401 return Handle(Geom_OffsetSurface)::DownCast (mySurface)->Offset();
1404 //=======================================================================
1405 //function : IfUVBound <private>
1406 //purpose : locates U,V parameters if U,V =First, Last,
1407 // processes the finding span and returns the
1408 // parameters for LocalDi
1409 //=======================================================================
1411 Standard_Boolean GeomAdaptor_Surface::IfUVBound(const Standard_Real U,
1412 const Standard_Real V,
1413 Standard_Integer& IOutDeb,
1414 Standard_Integer& IOutFin,
1415 Standard_Integer& IOutVDeb,
1416 Standard_Integer& IOutVFin,
1417 const Standard_Integer USide,
1418 const Standard_Integer VSide) const
1420 Standard_Integer Ideb,Ifin;
1421 Handle(Geom_BSplineSurface) myBspl = Handle(Geom_BSplineSurface)::DownCast(mySurface);
1422 Standard_Integer anUFKIndx = myBspl->FirstUKnotIndex(),
1423 anULKIndx = myBspl->LastUKnotIndex(),
1424 aVFKIndx = myBspl->FirstVKnotIndex(), aVLKIndx = myBspl->LastVKnotIndex();
1425 myBspl->LocateU(U, PosTol, Ideb, Ifin, Standard_False);
1426 Standard_Boolean Local = (Ideb == Ifin);
1427 Span(USide,Ideb,Ifin,Ideb,Ifin,anUFKIndx,anULKIndx);
1428 Standard_Integer IVdeb,IVfin;
1429 myBspl->LocateV(V, PosTol, IVdeb, IVfin, Standard_False);
1430 if(IVdeb == IVfin) Local = Standard_True;
1431 Span(VSide,IVdeb,IVfin,IVdeb,IVfin,aVFKIndx,aVLKIndx);
1433 IOutDeb=Ideb; IOutFin=Ifin;
1434 IOutVDeb=IVdeb; IOutVFin=IVfin;
1438 //=======================================================================
1439 //function : Span <private>
1440 //purpose : locates U,V parameters if U=UFirst or U=ULast,
1441 // processes the finding span and returns the
1442 // parameters for LocalDi
1443 //=======================================================================
1445 void GeomAdaptor_Surface::Span(const Standard_Integer Side,
1446 const Standard_Integer Ideb,
1447 const Standard_Integer Ifin,
1448 Standard_Integer& OutIdeb,
1449 Standard_Integer& OutIfin,
1450 const Standard_Integer theFKIndx,
1451 const Standard_Integer theLKIndx) const
1453 if(Ideb!=Ifin)//not a knot
1455 if(Ideb<theFKIndx) { OutIdeb=theFKIndx; OutIfin=theFKIndx+1; }
1456 else if(Ifin>theLKIndx) { OutIdeb=theLKIndx-1; OutIfin=theLKIndx; }
1457 else if(Ideb>=(theLKIndx-1)) { OutIdeb=theLKIndx-1; OutIfin=theLKIndx; }
1458 else if(Ifin<=theFKIndx+1) { OutIdeb=theFKIndx; OutIfin=theFKIndx+1; }
1459 else if(Ideb>Ifin) { OutIdeb=Ifin-1; OutIfin=Ifin; }
1460 else { OutIdeb=Ideb; OutIfin=Ifin; }
1464 if(Ideb<=theFKIndx){ OutIdeb=theFKIndx; OutIfin=theFKIndx+1;}//first knot
1465 else if(Ifin>=theLKIndx) { OutIdeb=theLKIndx-1;OutIfin=theLKIndx;}//last knot
1468 if(Side==-1){OutIdeb=Ideb-1; OutIfin=Ifin;}
1469 else {OutIdeb=Ideb; OutIfin=Ifin+1;}