BSplCLib::LocateParameter(myBSplineCurve->Degree(),TK,TM,myLast,
myBSplineCurve->IsPeriodic(),
1,Nb,Index2,newLast);
-
+ // Protection against myFirst = UFirst - eps, which located as ULast - eps
+ if (myBSplineCurve->IsPeriodic() && (newLast - newFirst) < Precision::PConfusion())
+ {
+ if (Abs(newLast - myBSplineCurve->FirstParameter()) < Precision::PConfusion())
+ newLast += myBSplineCurve->Period();
+ else
+ newFirst -= myBSplineCurve->Period();
+ }
// On decale eventuellement les indices
// On utilise une "petite" tolerance, la resolution ne doit
// servir que pour les tres longue courbes....(PRO9248)
1,Nb,Index2,newLast);
FirstParam = newFirst;
LastParam = newLast;
+ // Protection against myFirst = UFirst - eps, which located as ULast - eps
+ if (myBSplineCurve->IsPeriodic() && (LastParam - FirstParam) < Precision::PConfusion())
+ {
+ if (Abs(LastParam - myBSplineCurve->FirstParameter()) < Precision::PConfusion())
+ LastParam += myBSplineCurve->Period();
+ else
+ FirstParam -= myBSplineCurve->Period();
+ }
// On decale eventuellement les indices
// On utilise une "petite" tolerance, la resolution ne doit
// servir que pour les tres longue courbes....(PRO9248)
Standard_Real Eps = Min(Resolution(Precision::Confusion()),
Precision::PConfusion());
- if ( Abs(newFirst-TK(Index1+1))< Eps) Index1++;
- if ( newLast-TK(Index2)> Eps) Index2++;
+ if ( Abs(FirstParam-TK(Index1+1))< Eps) Index1++;
+ if ( LastParam-TK(Index2)> Eps) Index2++;
- Inter( 1) = Index1;
myNbIntervals = 1;
+
+ TColStd_Array1OfInteger aFinalIntervals(1, Inter.Upper());
+ aFinalIntervals(1) = Index1;
for ( Standard_Integer i=1; i<=NbInt; i++) {
if (Inter(i) > Index1 && Inter(i)<Index2 ) {
myNbIntervals++;
- Inter(myNbIntervals) = Inter(i);
+ aFinalIntervals(myNbIntervals) = Inter(i);
}
}
- Inter(myNbIntervals+1) = Index2;
+ aFinalIntervals(myNbIntervals + 1) = Index2;
for (Standard_Integer I=1;I<=myNbIntervals+1;I++) {
- T(I) = TK(Inter(I));
+ T(I) = TK(aFinalIntervals(I));
}
}
break;
(myBSplineSurface->VIso(myBSplineSurface->VKnot(myBSplineSurface->FirstVKnotIndex())),myUFirst,myULast);
myNbUIntervals = myBasisCurve.NbIntervals(S);
myBasisCurve.Intervals(T,S);
- break;
+ return;
}
case GeomAbs_SurfaceOfExtrusion:
{
{
myNbUIntervals = myBasisCurve.NbIntervals(S);
myBasisCurve.Intervals(T,S);
+ return;
}
break;
}
GeomAdaptor_Surface Sur(myOffSurf->BasisSurface(), myUFirst, myULast, myVFirst, myVLast);
myNbUIntervals = Sur.NbUIntervals(BaseS);
Sur.UIntervals(T, BaseS);
+ return;
}
case GeomAbs_Plane:
case GeomAbs_Cylinder:
(myBSplineSurface->UIso(myBSplineSurface->UKnot(myBSplineSurface->FirstUKnotIndex())),myVFirst,myVLast);
myNbVIntervals = myBasisCurve.NbIntervals(S);
myBasisCurve.Intervals(T,S);
- break;
+ return;
}
case GeomAbs_SurfaceOfRevolution:
{
{
myNbVIntervals = myBasisCurve.NbIntervals(S);
myBasisCurve.Intervals(T,S);
+ return;
}
break;
}
GeomAdaptor_Surface Sur(myOffSurf->BasisSurface(), myUFirst, myULast, myVFirst, myVLast);
myNbVIntervals = Sur.NbVIntervals(BaseS);
Sur.VIntervals(T, BaseS);
+ return;
}
case GeomAbs_Plane:
case GeomAbs_Cylinder: