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
23 #define PosTol (Precision::PConfusion()*0.5)
26 #include <Adaptor3d_HCurve.hxx>
27 #include <Adaptor3d_HSurface.hxx>
28 #include <BSplCLib.hxx>
29 #include <BSplSLib_Cache.hxx>
30 #include <Geom_BezierSurface.hxx>
31 #include <Geom_BSplineSurface.hxx>
32 #include <Geom_Circle.hxx>
33 #include <Geom_ConicalSurface.hxx>
34 #include <Geom_Curve.hxx>
35 #include <Geom_CylindricalSurface.hxx>
36 #include <Geom_OffsetSurface.hxx>
37 #include <Geom_Plane.hxx>
38 #include <Geom_RectangularTrimmedSurface.hxx>
39 #include <Geom_SphericalSurface.hxx>
40 #include <Geom_Surface.hxx>
41 #include <Geom_SurfaceOfLinearExtrusion.hxx>
42 #include <Geom_SurfaceOfRevolution.hxx>
43 #include <Geom_ToroidalSurface.hxx>
44 #include <GeomAdaptor_Curve.hxx>
45 #include <GeomAdaptor_HCurve.hxx>
46 #include <GeomAdaptor_HSurface.hxx>
47 #include <GeomAdaptor_Surface.hxx>
49 #include <gp_Circ.hxx>
50 #include <gp_Cone.hxx>
51 #include <gp_Cylinder.hxx>
56 #include <gp_Sphere.hxx>
57 #include <gp_Torus.hxx>
58 #include <gp_Trsf.hxx>
60 #include <Precision.hxx>
61 #include <Standard_ConstructionError.hxx>
62 #include <Standard_DomainError.hxx>
63 #include <Standard_NoSuchObject.hxx>
64 #include <Standard_NullObject.hxx>
65 #include <Standard_OutOfRange.hxx>
66 #include <TColStd_Array1OfInteger.hxx>
67 #include <TColStd_Array1OfReal.hxx>
68 #include <TColStd_HArray1OfInteger.hxx>
70 //#include <GeomConvert_BSplineSurfaceKnotSplitting.hxx>
71 #define myBspl Handle(Geom_BSplineSurface)::DownCast (mySurface)
72 #define myExtSurf Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)
73 #define myRevSurf Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)
74 #define myOffSurf Handle(Geom_OffsetSurface)::DownCast (mySurface)
76 //=======================================================================
77 //function : LocalContinuity
79 //=======================================================================
81 GeomAbs_Shape LocalContinuity(Standard_Integer Degree,
83 TColStd_Array1OfReal& TK,
84 TColStd_Array1OfInteger& TM,
87 Standard_Boolean IsPeriodic)
89 Standard_DomainError_Raise_if( (TK.Length()!=Nb || TM.Length()!=Nb )," ");
90 Standard_Integer Index1 = 0;
91 Standard_Integer Index2 = 0;
92 Standard_Real newFirst, newLast;
93 BSplCLib::LocateParameter(Degree,TK,TM,PFirst,IsPeriodic,1,Nb,Index1,newFirst);
94 BSplCLib::LocateParameter(Degree,TK,TM,PLast, IsPeriodic,1,Nb,Index2,newLast );
95 const Standard_Real EpsKnot = Precision::PConfusion();
96 if (Abs(newFirst-TK(Index1+1))< EpsKnot) Index1++;
97 if (Abs(newLast -TK(Index2 ))< EpsKnot) Index2--;
98 // attention aux courbes peridiques.
99 if ( (IsPeriodic) && (Index1 == Nb) )
104 Standard_Integer i, Multmax = TM(Index1+1);
105 for (i = Index1+1; i<=Index2; i++) {
106 if (TM(i)>Multmax) Multmax=TM(i);
108 Multmax = Degree - Multmax;
109 if (Multmax <= 0) return GeomAbs_C0;
111 case 1: return GeomAbs_C1;
112 case 2: return GeomAbs_C2;
113 case 3: return GeomAbs_C3;
119 //=======================================================================
122 //=======================================================================
124 void GeomAdaptor_Surface::load(const Handle(Geom_Surface)& S,
125 const Standard_Real UFirst,
126 const Standard_Real ULast,
127 const Standard_Real VFirst,
128 const Standard_Real VLast,
129 const Standard_Real TolU,
130 const Standard_Real TolV)
139 if ( mySurface != S) {
142 const Handle(Standard_Type)& TheType = S->DynamicType();
143 if ( TheType == STANDARD_TYPE(Geom_BezierSurface))
144 mySurfaceType = GeomAbs_BezierSurface;
145 else if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
146 Load(Handle(Geom_RectangularTrimmedSurface)::DownCast (S)->BasisSurface(),
147 UFirst,ULast,VFirst,VLast);
149 else if ( TheType == STANDARD_TYPE(Geom_Plane))
150 mySurfaceType = GeomAbs_Plane;
151 else if ( TheType == STANDARD_TYPE(Geom_CylindricalSurface))
152 mySurfaceType = GeomAbs_Cylinder;
153 else if ( TheType == STANDARD_TYPE(Geom_ConicalSurface))
154 mySurfaceType = GeomAbs_Cone;
155 else if ( TheType == STANDARD_TYPE(Geom_SphericalSurface))
156 mySurfaceType = GeomAbs_Sphere;
157 else if ( TheType == STANDARD_TYPE(Geom_ToroidalSurface))
158 mySurfaceType = GeomAbs_Torus;
159 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution))
160 mySurfaceType = GeomAbs_SurfaceOfRevolution;
161 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion))
162 mySurfaceType = GeomAbs_SurfaceOfExtrusion;
163 else if ( TheType == STANDARD_TYPE(Geom_BSplineSurface)) {
164 mySurfaceType = GeomAbs_BSplineSurface;
165 myBspl = Handle(Geom_BSplineSurface)::DownCast (mySurface);
166 // Create cache for B-spline
167 mySurfaceCache = new BSplSLib_Cache(
168 myBspl->UDegree(), myBspl->IsUPeriodic(), myBspl->UKnotSequence(),
169 myBspl->VDegree(), myBspl->IsVPeriodic(), myBspl->VKnotSequence(),
170 myBspl->Poles(), myBspl->Weights());
172 else if ( TheType == STANDARD_TYPE(Geom_OffsetSurface))
173 mySurfaceType = GeomAbs_OffsetSurface;
175 mySurfaceType = GeomAbs_OtherSurface;
180 // -- Global methods - Apply to the whole Surface.
184 //=======================================================================
185 //function : UContinuity
187 //=======================================================================
189 GeomAbs_Shape GeomAdaptor_Surface::UContinuity() const
191 switch (mySurfaceType)
193 case GeomAbs_BSplineSurface:
195 const Standard_Integer N = myBspl->NbUKnots();
196 TColStd_Array1OfReal TK(1,N);
197 TColStd_Array1OfInteger TM(1,N);
199 myBspl->UMultiplicities(TM);
200 return LocalContinuity(myBspl->UDegree(), myBspl->NbUKnots(), TK, TM,
201 myUFirst, myULast, IsUPeriodic());
203 case GeomAbs_OffsetSurface:
205 switch(BasisSurface()->UContinuity())
208 case GeomAbs_C3 : return GeomAbs_CN;
210 case GeomAbs_C2 : return GeomAbs_C1;
212 case GeomAbs_C1 : return GeomAbs_C0;
213 case GeomAbs_C0 : break;
215 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UContinuity");
218 case GeomAbs_SurfaceOfExtrusion:
221 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
222 return GC.Continuity();
224 case GeomAbs_OtherSurface:
225 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UContinuity");
227 case GeomAbs_Cylinder:
231 case GeomAbs_BezierSurface:
232 case GeomAbs_SurfaceOfRevolution: break;
237 //=======================================================================
238 //function : VContinuity
240 //=======================================================================
242 GeomAbs_Shape GeomAdaptor_Surface::VContinuity() const
244 switch (mySurfaceType)
246 case GeomAbs_BSplineSurface:
248 const Standard_Integer N = myBspl->NbVKnots();
249 TColStd_Array1OfReal TK(1,N);
250 TColStd_Array1OfInteger TM(1,N);
252 myBspl->VMultiplicities(TM);
253 return LocalContinuity(myBspl->VDegree(), myBspl->NbVKnots(), TK, TM,
254 myVFirst, myVLast, IsVPeriodic());
256 case GeomAbs_OffsetSurface:
258 switch(BasisSurface()->VContinuity())
261 case GeomAbs_C3 : return GeomAbs_CN;
263 case GeomAbs_C2 : return GeomAbs_C1;
265 case GeomAbs_C1 : return GeomAbs_C0;
266 case GeomAbs_C0 : break;
268 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VContinuity");
271 case GeomAbs_SurfaceOfRevolution:
274 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myVFirst,myVLast);
275 return GC.Continuity();
277 case GeomAbs_OtherSurface:
278 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VContinuity");
280 case GeomAbs_Cylinder:
284 case GeomAbs_BezierSurface:
285 case GeomAbs_SurfaceOfExtrusion: break;
290 //=======================================================================
291 //function : NbUIntervals
293 //=======================================================================
295 Standard_Integer GeomAdaptor_Surface::NbUIntervals(const GeomAbs_Shape S) const
297 switch (mySurfaceType)
299 case GeomAbs_BSplineSurface:
301 GeomAdaptor_Curve myBasisCurve
302 (myBspl->VIso(myBspl->VKnot(myBspl->FirstVKnotIndex())),myUFirst,myULast);
303 return myBasisCurve.NbIntervals(S);
305 case GeomAbs_SurfaceOfExtrusion:
307 GeomAdaptor_Curve myBasisCurve
308 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
309 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
310 return myBasisCurve.NbIntervals(S);
313 case GeomAbs_OffsetSurface:
315 GeomAbs_Shape BaseS = GeomAbs_CN;
319 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::NbUIntervals");
320 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
321 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
322 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
324 case GeomAbs_CN: break;
326 GeomAdaptor_Surface Sur(Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface());
327 return Sur.NbUIntervals(BaseS);
330 case GeomAbs_Cylinder:
334 case GeomAbs_BezierSurface:
335 case GeomAbs_OtherSurface:
336 case GeomAbs_SurfaceOfRevolution: break;
341 //=======================================================================
342 //function : NbVIntervals
344 //=======================================================================
346 Standard_Integer GeomAdaptor_Surface::NbVIntervals(const GeomAbs_Shape S) const
348 switch (mySurfaceType)
350 case GeomAbs_BSplineSurface:
352 GeomAdaptor_Curve myBasisCurve
353 (myBspl->UIso(myBspl->UKnot(myBspl->FirstUKnotIndex())),myVFirst,myVLast);
354 return myBasisCurve.NbIntervals(S);
356 case GeomAbs_SurfaceOfRevolution:
358 GeomAdaptor_Curve myBasisCurve
359 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myVFirst,myVLast);
360 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
361 return myBasisCurve.NbIntervals(S);
364 case GeomAbs_OffsetSurface:
366 GeomAbs_Shape BaseS = GeomAbs_CN;
370 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::NbVIntervals");
371 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
372 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
373 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
375 case GeomAbs_CN: break;
377 GeomAdaptor_Surface Sur(Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface());
378 return Sur.NbVIntervals(BaseS);
381 case GeomAbs_Cylinder:
385 case GeomAbs_BezierSurface:
386 case GeomAbs_OtherSurface:
387 case GeomAbs_SurfaceOfExtrusion: break;
392 //=======================================================================
393 //function : UIntervals
395 //=======================================================================
397 void GeomAdaptor_Surface::UIntervals(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
399 Standard_Integer myNbUIntervals = 1;
401 switch (mySurfaceType)
403 case GeomAbs_BSplineSurface:
405 GeomAdaptor_Curve myBasisCurve
406 (myBspl->VIso(myBspl->VKnot(myBspl->FirstVKnotIndex())),myUFirst,myULast);
407 myNbUIntervals = myBasisCurve.NbIntervals(S);
408 myBasisCurve.Intervals(T,S);
411 case GeomAbs_SurfaceOfExtrusion:
413 GeomAdaptor_Curve myBasisCurve
414 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
415 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
417 myNbUIntervals = myBasisCurve.NbIntervals(S);
418 myBasisCurve.Intervals(T,S);
422 case GeomAbs_OffsetSurface:
424 GeomAbs_Shape BaseS = GeomAbs_CN;
428 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::UIntervals");
429 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
430 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
431 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
433 case GeomAbs_CN: break;
435 GeomAdaptor_Surface Sur(Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface());
436 myNbUIntervals = Sur.NbUIntervals(BaseS);
437 Sur.UIntervals(T, BaseS);
440 case GeomAbs_Cylinder:
444 case GeomAbs_BezierSurface:
445 case GeomAbs_OtherSurface:
446 case GeomAbs_SurfaceOfRevolution: break;
449 T(T.Lower()) = myUFirst;
450 T(T.Lower() + myNbUIntervals) = myULast;
453 //=======================================================================
454 //function : VIntervals
456 //=======================================================================
458 void GeomAdaptor_Surface::VIntervals(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
460 Standard_Integer myNbVIntervals = 1;
462 switch (mySurfaceType)
464 case GeomAbs_BSplineSurface:
466 GeomAdaptor_Curve myBasisCurve
467 (myBspl->UIso(myBspl->UKnot(myBspl->FirstUKnotIndex())),myVFirst,myVLast);
468 myNbVIntervals = myBasisCurve.NbIntervals(S);
469 myBasisCurve.Intervals(T,S);
472 case GeomAbs_SurfaceOfRevolution:
474 GeomAdaptor_Curve myBasisCurve
475 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myVFirst,myVLast);
476 if (myBasisCurve.GetType() == GeomAbs_BSplineCurve)
478 myNbVIntervals = myBasisCurve.NbIntervals(S);
479 myBasisCurve.Intervals(T,S);
483 case GeomAbs_OffsetSurface:
485 GeomAbs_Shape BaseS = GeomAbs_CN;
489 case GeomAbs_G2: Standard_DomainError::Raise("GeomAdaptor_Curve::VIntervals");
490 case GeomAbs_C0: BaseS = GeomAbs_C1; break;
491 case GeomAbs_C1: BaseS = GeomAbs_C2; break;
492 case GeomAbs_C2: BaseS = GeomAbs_C3; break;
494 case GeomAbs_CN: break;
496 GeomAdaptor_Surface Sur(Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface());
497 myNbVIntervals = Sur.NbVIntervals(BaseS);
498 Sur.VIntervals(T, BaseS);
501 case GeomAbs_Cylinder:
505 case GeomAbs_BezierSurface:
506 case GeomAbs_OtherSurface:
507 case GeomAbs_SurfaceOfExtrusion: break;
510 T(T.Lower()) = myVFirst;
511 T(T.Lower() + myNbVIntervals) = myVLast;
514 //=======================================================================
517 //=======================================================================
519 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::UTrim(const Standard_Real First,
520 const Standard_Real Last ,
521 const Standard_Real Tol ) const
523 return Handle(GeomAdaptor_HSurface)
524 (new GeomAdaptor_HSurface(mySurface,First,Last,myVFirst,myVLast,Tol,myTolV));
527 //=======================================================================
530 //=======================================================================
532 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::VTrim(const Standard_Real First,
533 const Standard_Real Last ,
534 const Standard_Real Tol ) const
536 return Handle(GeomAdaptor_HSurface)
537 (new GeomAdaptor_HSurface(mySurface,myUFirst,myULast,First,Last,myTolU,Tol));
540 //=======================================================================
541 //function : IsUClosed
543 //=======================================================================
545 Standard_Boolean GeomAdaptor_Surface::IsUClosed() const
547 if (!mySurface->IsUClosed())
548 return Standard_False;
550 Standard_Real U1,U2,V1,V2;
551 mySurface->Bounds(U1,U2,V1,V2);
552 if (mySurface->IsUPeriodic())
553 return (Abs(Abs(U1-U2)-Abs(myUFirst-myULast))<Precision::PConfusion());
555 return ( Abs(U1-myUFirst)<Precision::PConfusion()
556 && Abs(U2-myULast )<Precision::PConfusion() );
559 //=======================================================================
560 //function : IsVClosed
562 //=======================================================================
564 Standard_Boolean GeomAdaptor_Surface::IsVClosed() const
566 if (!mySurface->IsVClosed())
567 return Standard_False;
569 Standard_Real U1,U2,V1,V2;
570 mySurface->Bounds(U1,U2,V1,V2);
571 if (mySurface->IsVPeriodic())
572 return (Abs(Abs(V1-V2)-Abs(myVFirst-myVLast))<Precision::PConfusion());
574 return ( Abs(V1-myVFirst)<Precision::PConfusion()
575 && Abs(V2-myVLast )<Precision::PConfusion() );
578 //=======================================================================
579 //function : IsUPeriodic
581 //=======================================================================
583 Standard_Boolean GeomAdaptor_Surface::IsUPeriodic() const
585 return (mySurface->IsUPeriodic());
588 //=======================================================================
591 //=======================================================================
593 Standard_Real GeomAdaptor_Surface::UPeriod() const
595 Standard_NoSuchObject_Raise_if(!IsUPeriodic()," ");
596 return mySurface->UPeriod();
599 //=======================================================================
600 //function : IsVPeriodic
602 //=======================================================================
604 Standard_Boolean GeomAdaptor_Surface::IsVPeriodic() const
606 return (mySurface->IsVPeriodic());
609 //=======================================================================
612 //=======================================================================
614 Standard_Real GeomAdaptor_Surface::VPeriod() const
616 Standard_NoSuchObject_Raise_if(!IsVPeriodic()," ");
617 return mySurface->VPeriod();
620 //=======================================================================
621 //function : RebuildCache
623 //=======================================================================
624 void GeomAdaptor_Surface::RebuildCache(const Standard_Real theU,
625 const Standard_Real theV) const
627 mySurfaceCache->BuildCache(theU, theV,
628 myBspl->UDegree(), myBspl->IsUPeriodic(), myBspl->UKnotSequence(),
629 myBspl->VDegree(), myBspl->IsVPeriodic(), myBspl->VKnotSequence(),
630 myBspl->Poles(), myBspl->Weights());
633 //=======================================================================
636 //=======================================================================
638 gp_Pnt GeomAdaptor_Surface::Value(const Standard_Real U,
639 const Standard_Real V) const
641 if (mySurfaceType == GeomAbs_BSplineSurface && !mySurfaceCache.IsNull())
643 if (!mySurfaceCache->IsCacheValid(U, V))
646 mySurfaceCache->D0(U, V, P);
650 return mySurface->Value(U,V);
653 //=======================================================================
656 //=======================================================================
658 void GeomAdaptor_Surface::D0(const Standard_Real U,
659 const Standard_Real V, gp_Pnt& P) const
661 if (mySurfaceType == GeomAbs_BSplineSurface && !mySurfaceCache.IsNull())
663 if (!mySurfaceCache->IsCacheValid(U, V))
665 mySurfaceCache->D0(U, V, P);
669 mySurface->D0(U,V,P);
673 //=======================================================================
676 //=======================================================================
678 void GeomAdaptor_Surface::D1(const Standard_Real U,
679 const Standard_Real V,
684 Standard_Integer Ideb, Ifin, IVdeb, IVfin, USide=0, VSide=0;
685 Standard_Real u = U, v = V;
686 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
687 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
688 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
689 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
691 switch(mySurfaceType) {
692 case GeomAbs_BSplineSurface:
693 if ((USide != 0 || VSide != 0) &&
694 IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
695 myBspl->LocalD1(u, v, Ideb, Ifin, IVdeb, IVfin, P, D1U, D1V);
696 else if (!mySurfaceCache.IsNull())
698 if (!mySurfaceCache->IsCacheValid(U, V))
700 mySurfaceCache->D1(U, V, P, D1U, D1V);
703 myBspl->D1(u, v, P, D1U, D1V);
706 case GeomAbs_SurfaceOfExtrusion:
708 myExtSurf->D1(u, v, P, D1U, D1V);
710 myExtSurf->LocalD1(u, v, USide, P, D1U, D1V);
713 case GeomAbs_SurfaceOfRevolution:
715 myRevSurf->D1(u, v, P, D1U, D1V);
717 myRevSurf->LocalD1(u, v, VSide, P, D1U, D1V);
720 case GeomAbs_OffsetSurface:
721 if (USide==0 && VSide==0)
722 myOffSurf->D1(u, v, P, D1U, D1V);
724 myOffSurf->LocalD1(u, v, USide, VSide, P, D1U, D1V);
727 mySurface->D1(u, v, P, D1U, D1V);
731 //=======================================================================
734 //=======================================================================
736 void GeomAdaptor_Surface::D2(const Standard_Real U,
737 const Standard_Real V,
745 Standard_Integer Ideb, Ifin, IVdeb, IVfin, USide=0, VSide=0;
746 Standard_Real u = U, v = V;
747 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
748 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
749 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
750 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
752 switch(mySurfaceType) {
753 case GeomAbs_BSplineSurface:
754 if((USide != 0 || VSide != 0) &&
755 IfUVBound(u, v, Ideb, Ifin, IVdeb, IVfin, USide, VSide))
756 myBspl->LocalD2(u, v, Ideb, Ifin, IVdeb, IVfin, P, D1U, D1V, D2U, D2V, D2UV);
757 else if (!mySurfaceCache.IsNull())
759 if (!mySurfaceCache->IsCacheValid(U, V))
761 mySurfaceCache->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
763 else myBspl->D2(u,v,P,D1U,D1V,D2U,D2V,D2UV);
766 case GeomAbs_SurfaceOfExtrusion :
768 if(USide==0) myExtSurf->D2(u,v,P,D1U,D1V,D2U,D2V,D2UV);
769 else myExtSurf->LocalD2(u,v,USide,P,D1U,D1V,D2U,D2V,D2UV);
772 case GeomAbs_SurfaceOfRevolution :
774 if(VSide==0) myRevSurf->D2 (u, v, P,D1U,D1V,D2U,D2V,D2UV );
775 else myRevSurf->LocalD2 (u, v, VSide, P,D1U,D1V,D2U,D2V,D2UV );
778 case GeomAbs_OffsetSurface :
780 if((USide==0)&&(VSide==0)) myOffSurf->D2 (u, v,P,D1U,D1V,D2U,D2V,D2UV );
781 else myOffSurf->LocalD2 (u, v, USide, VSide ,P,D1U,D1V,D2U,D2V,D2UV );
784 default : { mySurface->D2(u,v,P,D1U,D1V,D2U,D2V,D2UV);
790 //=======================================================================
793 //=======================================================================
795 void GeomAdaptor_Surface::D3(const Standard_Real U, const Standard_Real V,
796 gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V,
797 gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV,
798 gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV,
801 Standard_Integer Ideb,Ifin,IVdeb,IVfin,USide=0,VSide=0;
802 Standard_Real u = U, v = V;
803 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
804 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
805 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
806 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
808 switch(mySurfaceType) {
809 case GeomAbs_BSplineSurface:
811 if((USide==0)&&(VSide==0))
812 myBspl->D3(u,v,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
814 if(IfUVBound(u,v,Ideb,Ifin,IVdeb,IVfin,USide,VSide))
815 myBspl-> LocalD3 (u, v, Ideb, Ifin,IVdeb ,IVfin ,
816 P ,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
818 myBspl->D3(u,v,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
822 case GeomAbs_SurfaceOfExtrusion :
824 if(USide==0) myExtSurf->D3(u,v,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
825 else myExtSurf->LocalD3(u,v,USide,P,D1U,D1V,D2U,D2V,D2UV,
826 D3U,D3V,D3UUV,D3UVV);
829 case GeomAbs_SurfaceOfRevolution :
831 if(VSide==0) myRevSurf->D3 (u, v, P ,D1U,D1V,D2U,D2V,D2UV,
832 D3U,D3V,D3UUV,D3UVV);
833 else myRevSurf->LocalD3 (u, v, VSide, P,D1U,D1V,D2U,D2V,D2UV,
834 D3U,D3V,D3UUV,D3UVV );
837 case GeomAbs_OffsetSurface :
839 if((USide==0)&&(VSide==0)) myOffSurf->D3 (u, v,P ,D1U,D1V,D2U,D2V,D2UV,
840 D3U,D3V,D3UUV,D3UVV);
841 else myOffSurf->LocalD3 (u, v, USide, VSide ,P ,D1U,D1V,D2U,D2V,D2UV,
842 D3U,D3V,D3UUV,D3UVV);
845 default : { mySurface->D3(u,v,P,D1U,D1V,D2U,D2V,D2UV,D3U,D3V,D3UUV,D3UVV);
850 //=======================================================================
853 //=======================================================================
855 gp_Vec GeomAdaptor_Surface::DN(const Standard_Real U,
856 const Standard_Real V,
857 const Standard_Integer Nu,
858 const Standard_Integer Nv) const
860 Standard_Integer Ideb,Ifin,IVdeb,IVfin,USide=0,VSide=0;
861 Standard_Real u = U, v = V;
862 if (Abs(U-myUFirst) <= myTolU) {USide= 1; u = myUFirst;}
863 else if (Abs(U-myULast) <= myTolU) {USide= -1; u = myULast;}
864 if (Abs(V-myVFirst) <= myTolV) {VSide= 1; v = myVFirst;}
865 else if (Abs(V-myVLast) <= myTolV) {VSide= -1; v = myVLast;}
867 switch(mySurfaceType)
869 case GeomAbs_BSplineSurface:
871 if((USide==0)&&(VSide==0)) return myBspl->DN(u,v,Nu,Nv);
873 if(IfUVBound(u,v,Ideb,Ifin,IVdeb,IVfin,USide,VSide))
874 return myBspl->LocalDN (u, v, Ideb, Ifin,IVdeb ,IVfin ,Nu,Nv );
876 return myBspl->DN(u,v,Nu,Nv);
879 case GeomAbs_SurfaceOfExtrusion:
881 if(USide==0) return myExtSurf-> DN (u, v,Nu,Nv );
882 else return myExtSurf->LocalDN (u, v, USide,Nu,Nv );
884 case GeomAbs_SurfaceOfRevolution:
886 if(VSide==0) return myRevSurf->DN (u, v, Nu, Nv );
887 else return myRevSurf->LocalDN (u, v,VSide, Nu, Nv );
889 case GeomAbs_OffsetSurface:
891 if((USide==0)&&(VSide==0)) return myOffSurf->DN (u, v, Nu, Nv );
892 else return myOffSurf->LocalDN (u, v, USide, VSide, Nu, Nv );
895 case GeomAbs_Cylinder:
899 case GeomAbs_BezierSurface:
900 case GeomAbs_OtherSurface:
905 return mySurface->DN(u,v, Nu, Nv);
909 //=======================================================================
910 //function : UResolution
912 //=======================================================================
914 Standard_Real GeomAdaptor_Surface::UResolution(const Standard_Real R3d) const
916 Standard_Real Res = 0.;
918 switch (mySurfaceType)
920 case GeomAbs_SurfaceOfExtrusion:
922 GeomAdaptor_Curve myBasisCurve
923 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
924 return myBasisCurve.Resolution(R3d);
928 Handle(Geom_ToroidalSurface) S (Handle(Geom_ToroidalSurface)::DownCast (mySurface));
929 const Standard_Real R = S->MajorRadius() + S->MinorRadius();
930 if(R>Precision::Confusion())
936 Handle(Geom_SphericalSurface) S (Handle(Geom_SphericalSurface)::DownCast (mySurface));
937 const Standard_Real R = S->Radius();
938 if(R>Precision::Confusion())
942 case GeomAbs_Cylinder:
944 Handle(Geom_CylindricalSurface) S (Handle(Geom_CylindricalSurface)::DownCast (mySurface));
945 const Standard_Real R = S->Radius();
946 if(R>Precision::Confusion())
952 if (myVLast - myVFirst > 1.e10) {
953 // Pas vraiment borne => resolution inconnue
954 return Precision::Parametric(R3d);
956 Handle(Geom_ConicalSurface) S (Handle(Geom_ConicalSurface)::DownCast (mySurface));
957 Handle(Geom_Curve) C = S->VIso(myVLast);
958 const Standard_Real Rayon1 = Handle(Geom_Circle)::DownCast (C)->Radius();
959 C = S->VIso(myVFirst);
960 const Standard_Real Rayon2 = Handle(Geom_Circle)::DownCast (C)->Radius();
961 const Standard_Real R = (Rayon1 > Rayon2)? Rayon1 : Rayon2;
962 return (R>Precision::Confusion()? (R3d / R) : 0.);
968 case GeomAbs_BezierSurface:
970 Standard_Real Ures,Vres;
971 Handle(Geom_BezierSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
974 case GeomAbs_BSplineSurface:
976 Standard_Real Ures,Vres;
977 Handle(Geom_BSplineSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
980 case GeomAbs_OffsetSurface:
982 Handle(Geom_Surface) base = Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface();
983 GeomAdaptor_Surface gabase(base,myUFirst,myULast,myVFirst,myVLast);
984 return gabase.UResolution(R3d);
986 default: return Precision::Parametric(R3d);
995 //=======================================================================
996 //function : VResolution
998 //=======================================================================
1000 Standard_Real GeomAdaptor_Surface::VResolution(const Standard_Real R3d) const
1002 Standard_Real Res = 0.;
1004 switch (mySurfaceType)
1006 case GeomAbs_SurfaceOfRevolution:
1008 GeomAdaptor_Curve myBasisCurve
1009 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1010 return myBasisCurve.Resolution(R3d);
1014 Handle(Geom_ToroidalSurface) S (Handle(Geom_ToroidalSurface)::DownCast (mySurface));
1015 const Standard_Real R = S->MinorRadius();
1016 if(R>Precision::Confusion())
1020 case GeomAbs_Sphere:
1022 Handle(Geom_SphericalSurface) S (Handle(Geom_SphericalSurface)::DownCast (mySurface));
1023 const Standard_Real R = S->Radius();
1024 if(R>Precision::Confusion())
1028 case GeomAbs_SurfaceOfExtrusion:
1029 case GeomAbs_Cylinder:
1035 case GeomAbs_BezierSurface:
1037 Standard_Real Ures,Vres;
1038 Handle(Geom_BezierSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1041 case GeomAbs_BSplineSurface:
1043 Standard_Real Ures,Vres;
1044 Handle(Geom_BSplineSurface)::DownCast (mySurface)->Resolution(R3d,Ures,Vres);
1047 case GeomAbs_OffsetSurface:
1049 Handle(Geom_Surface) base = Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface();
1050 GeomAdaptor_Surface gabase(base,myUFirst,myULast,myVFirst,myVLast);
1051 return gabase.VResolution(R3d);
1053 default: return Precision::Parametric(R3d);
1057 return 2.*ASin(Res);
1062 //=======================================================================
1065 //=======================================================================
1067 gp_Pln GeomAdaptor_Surface::Plane() const
1069 if (mySurfaceType != GeomAbs_Plane)
1070 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Plane");
1071 return Handle(Geom_Plane)::DownCast (mySurface)->Pln();
1074 //=======================================================================
1075 //function : Cylinder
1077 //=======================================================================
1079 gp_Cylinder GeomAdaptor_Surface::Cylinder() const
1081 if (mySurfaceType != GeomAbs_Cylinder)
1082 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Cylinder");
1083 return Handle(Geom_CylindricalSurface)::DownCast (mySurface)->Cylinder();
1086 //=======================================================================
1089 //=======================================================================
1091 gp_Cone GeomAdaptor_Surface::Cone() const
1093 if (mySurfaceType != GeomAbs_Cone)
1094 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Cone");
1095 return Handle(Geom_ConicalSurface)::DownCast (mySurface)->Cone();
1098 //=======================================================================
1101 //=======================================================================
1103 gp_Sphere GeomAdaptor_Surface::Sphere() const
1105 if (mySurfaceType != GeomAbs_Sphere)
1106 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Sphere");
1107 return Handle(Geom_SphericalSurface)::DownCast (mySurface)->Sphere();
1110 //=======================================================================
1113 //=======================================================================
1115 gp_Torus GeomAdaptor_Surface::Torus() const
1117 if (mySurfaceType != GeomAbs_Torus)
1118 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Torus");
1119 return Handle(Geom_ToroidalSurface)::DownCast (mySurface)->Torus();
1122 //=======================================================================
1123 //function : UDegree
1125 //=======================================================================
1127 Standard_Integer GeomAdaptor_Surface::UDegree() const
1129 if (mySurfaceType == GeomAbs_BSplineSurface)
1130 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->UDegree();
1131 if ( mySurfaceType == GeomAbs_BezierSurface)
1132 return Handle(Geom_BezierSurface)::DownCast (mySurface)->UDegree();
1133 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1135 GeomAdaptor_Curve myBasisCurve
1136 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1137 return myBasisCurve.Degree();
1139 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::UDegree");
1143 //=======================================================================
1144 //function : NbUPoles
1146 //=======================================================================
1148 Standard_Integer GeomAdaptor_Surface::NbUPoles() const
1150 if (mySurfaceType == GeomAbs_BSplineSurface)
1151 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbUPoles();
1152 if ( mySurfaceType == GeomAbs_BezierSurface)
1153 return Handle(Geom_BezierSurface)::DownCast (mySurface)->NbUPoles();
1154 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1156 GeomAdaptor_Curve myBasisCurve
1157 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1158 return myBasisCurve.NbPoles();
1160 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbUPoles");
1164 //=======================================================================
1165 //function : VDegree
1167 //=======================================================================
1169 Standard_Integer GeomAdaptor_Surface::VDegree() const
1171 if (mySurfaceType == GeomAbs_BSplineSurface)
1172 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->VDegree();
1173 if ( mySurfaceType == GeomAbs_BezierSurface)
1174 return Handle(Geom_BezierSurface)::DownCast (mySurface)->VDegree();
1175 if ( mySurfaceType == GeomAbs_SurfaceOfRevolution)
1177 GeomAdaptor_Curve myBasisCurve
1178 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1179 return myBasisCurve.Degree();
1181 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::VDegree");
1185 //=======================================================================
1186 //function : NbVPoles
1188 //=======================================================================
1190 Standard_Integer GeomAdaptor_Surface::NbVPoles() const
1192 if (mySurfaceType == GeomAbs_BSplineSurface)
1193 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbVPoles();
1194 if ( mySurfaceType == GeomAbs_BezierSurface)
1195 return Handle(Geom_BezierSurface)::DownCast (mySurface)->NbVPoles();
1196 if ( mySurfaceType == GeomAbs_SurfaceOfRevolution)
1198 GeomAdaptor_Curve myBasisCurve
1199 (Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1200 return myBasisCurve.NbPoles();
1202 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbVPoles");
1206 //=======================================================================
1207 //function : NbUKnots
1209 //=======================================================================
1211 Standard_Integer GeomAdaptor_Surface::NbUKnots() const
1213 if (mySurfaceType == GeomAbs_BSplineSurface)
1214 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbUKnots();
1215 if ( mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1217 GeomAdaptor_Curve myBasisCurve
1218 (Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve(),myUFirst,myULast);
1219 return myBasisCurve.NbKnots();
1221 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbUKnots");
1225 //=======================================================================
1226 //function : NbVKnots
1228 //=======================================================================
1230 Standard_Integer GeomAdaptor_Surface::NbVKnots() const
1232 if (mySurfaceType == GeomAbs_BSplineSurface)
1233 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->NbVKnots();
1234 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::NbVKnots");
1237 //=======================================================================
1238 //function : IsURational
1240 //=======================================================================
1242 Standard_Boolean GeomAdaptor_Surface::IsURational() const
1244 if (mySurfaceType == GeomAbs_BSplineSurface)
1245 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->IsURational();
1246 if (mySurfaceType == GeomAbs_BezierSurface)
1247 return Handle(Geom_BezierSurface)::DownCast (mySurface)->IsURational();
1248 return Standard_False;
1251 //=======================================================================
1252 //function : IsVRational
1254 //=======================================================================
1256 Standard_Boolean GeomAdaptor_Surface::IsVRational() const
1258 if (mySurfaceType == GeomAbs_BSplineSurface)
1259 return Handle(Geom_BSplineSurface)::DownCast (mySurface)->IsVRational();
1260 if (mySurfaceType == GeomAbs_BezierSurface)
1261 return Handle(Geom_BezierSurface)::DownCast (mySurface)->IsVRational();
1262 return Standard_False;
1265 //=======================================================================
1268 //=======================================================================
1270 Handle(Geom_BezierSurface) GeomAdaptor_Surface::Bezier() const
1272 if (mySurfaceType != GeomAbs_BezierSurface)
1273 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Bezier");
1274 return Handle(Geom_BezierSurface)::DownCast (mySurface);
1277 //=======================================================================
1278 //function : BSpline
1280 //=======================================================================
1282 Handle(Geom_BSplineSurface) GeomAdaptor_Surface::BSpline() const
1284 if (mySurfaceType != GeomAbs_BSplineSurface)
1285 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BSpline");
1286 return Handle(Geom_BSplineSurface)::DownCast (mySurface);
1289 //=======================================================================
1290 //function : AxeOfRevolution
1292 //=======================================================================
1294 gp_Ax1 GeomAdaptor_Surface::AxeOfRevolution() const
1296 if (mySurfaceType != GeomAbs_SurfaceOfRevolution)
1297 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::AxeOfRevolution");
1298 return Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->Axis();
1301 //=======================================================================
1302 //function : Direction
1304 //=======================================================================
1306 gp_Dir GeomAdaptor_Surface::Direction() const
1308 if (mySurfaceType != GeomAbs_SurfaceOfExtrusion)
1309 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::Direction");
1310 return Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->Direction();
1313 //=======================================================================
1314 //function : BasisCurve
1316 //=======================================================================
1318 Handle(Adaptor3d_HCurve) GeomAdaptor_Surface::BasisCurve() const
1320 Handle(Geom_Curve) C;
1321 if (mySurfaceType == GeomAbs_SurfaceOfExtrusion)
1322 C = Handle(Geom_SurfaceOfLinearExtrusion)::DownCast (mySurface)->BasisCurve();
1323 else if (mySurfaceType == GeomAbs_SurfaceOfRevolution)
1324 C = Handle(Geom_SurfaceOfRevolution)::DownCast (mySurface)->BasisCurve();
1326 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisCurve");
1327 return Handle(GeomAdaptor_HCurve)(new GeomAdaptor_HCurve(C));
1330 //=======================================================================
1331 //function : BasisSurface
1333 //=======================================================================
1335 Handle(Adaptor3d_HSurface) GeomAdaptor_Surface::BasisSurface() const
1337 if (mySurfaceType != GeomAbs_OffsetSurface)
1338 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisSurface");
1339 return new GeomAdaptor_HSurface
1340 (Handle(Geom_OffsetSurface)::DownCast (mySurface)->BasisSurface(),
1341 myUFirst,myULast,myVFirst,myVLast);
1344 //=======================================================================
1345 //function : OffsetValue
1347 //=======================================================================
1349 Standard_Real GeomAdaptor_Surface::OffsetValue() const
1351 if (mySurfaceType != GeomAbs_OffsetSurface)
1352 Standard_NoSuchObject::Raise("GeomAdaptor_Surface::BasisSurface");
1353 return Handle(Geom_OffsetSurface)::DownCast (mySurface)->Offset();
1356 //=======================================================================
1357 //function : IfUVBound <private>
1358 //purpose : locates U,V parameters if U,V =First, Last,
1359 // processes the finding span and returns the
1360 // parameters for LocalDi
1361 //=======================================================================
1363 Standard_Boolean GeomAdaptor_Surface::IfUVBound(const Standard_Real U,
1364 const Standard_Real V,
1365 Standard_Integer& IOutDeb,
1366 Standard_Integer& IOutFin,
1367 Standard_Integer& IOutVDeb,
1368 Standard_Integer& IOutVFin,
1369 const Standard_Integer USide,
1370 const Standard_Integer VSide) const
1372 Standard_Integer Ideb,Ifin;
1373 Standard_Integer anUFKIndx = myBspl->FirstUKnotIndex(),
1374 anULKIndx = myBspl->LastUKnotIndex(),
1375 aVFKIndx = myBspl->FirstVKnotIndex(), aVLKIndx = myBspl->LastVKnotIndex();
1376 myBspl->LocateU(U, PosTol, Ideb, Ifin, Standard_False);
1377 Standard_Boolean Local = (Ideb == Ifin);
1378 Span(USide,Ideb,Ifin,Ideb,Ifin,anUFKIndx,anULKIndx);
1379 Standard_Integer IVdeb,IVfin;
1380 myBspl->LocateV(V, PosTol, IVdeb, IVfin, Standard_False);
1381 if(IVdeb == IVfin) Local = Standard_True;
1382 Span(VSide,IVdeb,IVfin,IVdeb,IVfin,aVFKIndx,aVLKIndx);
1384 IOutDeb=Ideb; IOutFin=Ifin;
1385 IOutVDeb=IVdeb; IOutVFin=IVfin;
1389 //=======================================================================
1390 //function : Span <private>
1391 //purpose : locates U,V parameters if U=UFirst or U=ULast,
1392 // processes the finding span and returns the
1393 // parameters for LocalDi
1394 //=======================================================================
1396 void GeomAdaptor_Surface::Span(const Standard_Integer Side,
1397 const Standard_Integer Ideb,
1398 const Standard_Integer Ifin,
1399 Standard_Integer& OutIdeb,
1400 Standard_Integer& OutIfin,
1401 const Standard_Integer theFKIndx,
1402 const Standard_Integer theLKIndx) const
1404 if(Ideb!=Ifin)//not a knot
1406 if(Ideb<theFKIndx) { OutIdeb=theFKIndx; OutIfin=theFKIndx+1; }
1407 else if(Ifin>theLKIndx) { OutIdeb=theLKIndx-1; OutIfin=theLKIndx; }
1408 else if(Ideb>=(theLKIndx-1)) { OutIdeb=theLKIndx-1; OutIfin=theLKIndx; }
1409 else if(Ifin<=theFKIndx+1) { OutIdeb=theFKIndx; OutIfin=theFKIndx+1; }
1410 else if(Ideb>Ifin) { OutIdeb=Ifin-1; OutIfin=Ifin; }
1411 else { OutIdeb=Ideb; OutIfin=Ifin; }
1415 if(Ideb<=theFKIndx){ OutIdeb=theFKIndx; OutIfin=theFKIndx+1;}//first knot
1416 else if(Ifin>=theLKIndx) { OutIdeb=theLKIndx-1;OutIfin=theLKIndx;}//last knot
1419 if(Side==-1){OutIdeb=Ideb-1; OutIfin=Ifin;}
1420 else {OutIdeb=Ideb; OutIfin=Ifin+1;}