diff --git a/src/Extrema/Extrema_ExtCS.cxx b/src/Extrema/Extrema_ExtCS.cxx index 538fa647e0..56f315724a 100644 --- a/src/Extrema/Extrema_ExtCS.cxx +++ b/src/Extrema/Extrema_ExtCS.cxx @@ -45,27 +45,27 @@ Extrema_ExtCS::Extrema_ExtCS() } Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C, - const Adaptor3d_Surface& S, - const Standard_Real TolC, - const Standard_Real TolS) + const Adaptor3d_Surface& S, + const Standard_Real TolC, + const Standard_Real TolS) { Initialize(S, S.FirstUParameter(), S.LastUParameter(), - S.FirstVParameter(), S.LastVParameter(), - TolC, TolS); + S.FirstVParameter(), S.LastVParameter(), + TolC, TolS); Perform(C, C.FirstParameter(), C.LastParameter()); } Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C, - const Adaptor3d_Surface& S, - const Standard_Real UCinf, - const Standard_Real UCsup, - const Standard_Real Uinf, - const Standard_Real Usup, - const Standard_Real Vinf, - const Standard_Real Vsup, - const Standard_Real TolC, - const Standard_Real TolS) + const Adaptor3d_Surface& S, + const Standard_Real UCinf, + const Standard_Real UCsup, + const Standard_Real Uinf, + const Standard_Real Usup, + const Standard_Real Vinf, + const Standard_Real Vsup, + const Standard_Real TolC, + const Standard_Real TolS) { Initialize(S, Uinf, Usup, Vinf, Vsup, TolC, TolS); @@ -74,12 +74,12 @@ Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C, void Extrema_ExtCS::Initialize(const Adaptor3d_Surface& S, - const Standard_Real Uinf, - const Standard_Real Usup, - const Standard_Real Vinf, - const Standard_Real Vsup, - const Standard_Real TolC, - const Standard_Real TolS) + const Standard_Real Uinf, + const Standard_Real Usup, + const Standard_Real Vinf, + const Standard_Real Vsup, + const Standard_Real TolC, + const Standard_Real TolS) { myS = (Adaptor3d_SurfacePtr)&S; myIsPar = Standard_False; @@ -92,10 +92,10 @@ void Extrema_ExtCS::Initialize(const Adaptor3d_Surface& S, myStype = myS->GetType(); } - + void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, - const Standard_Real Uinf, - const Standard_Real Usup) + const Standard_Real Uinf, + const Standard_Real Usup) { myucinf = Uinf; myucsup = Usup; @@ -112,17 +112,17 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, case GeomAbs_Line: { - + switch(myStype) { case GeomAbs_Sphere: - myExtElCS.Perform(C.Line(), myS->Sphere()); - break; + myExtElCS.Perform(C.Line(), myS->Sphere()); + break; case GeomAbs_Cylinder: - myExtElCS.Perform(C.Line(), myS->Cylinder()); - break; + myExtElCS.Perform(C.Line(), myS->Cylinder()); + break; case GeomAbs_Plane: - myExtElCS.Perform(C.Line(), myS->Plane()); - if (myExtElCS.IsParallel()) break; + myExtElCS.Perform(C.Line(), myS->Plane()); + if (myExtElCS.IsParallel()) break; case GeomAbs_Torus: case GeomAbs_Cone: @@ -132,99 +132,99 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, case GeomAbs_SurfaceOfExtrusion: case GeomAbs_OffsetSurface: case GeomAbs_OtherSurface: - { - Standard_Real cfirst = myucinf, clast = myucsup; - Standard_Real ufirst = myS->FirstUParameter(), ulast = myS->LastUParameter(), - vfirst = myS->FirstVParameter(), vlast = myS->LastVParameter(); + { + Standard_Real cfirst = myucinf, clast = myucsup; + Standard_Real ufirst = myS->FirstUParameter(), ulast = myS->LastUParameter(), + vfirst = myS->FirstVParameter(), vlast = myS->LastVParameter(); - if(Precision::IsInfinite(Abs(cfirst)) || Precision::IsInfinite(Abs(clast))) { + if(Precision::IsInfinite(Abs(cfirst)) || Precision::IsInfinite(Abs(clast))) { - Bnd_Box aSurfBox; + Bnd_Box aSurfBox; BndLib_AddSurface::Add(*myS, ufirst, ulast, vfirst, vlast, Precision::Confusion(), aSurfBox); - Standard_Real xmin, ymin, zmin, xmax, ymax, zmax; - aSurfBox.Get(xmin, ymin, zmin, xmax, ymax, zmax); - Standard_Real tmin = Precision::Infinite(), tmax = -tmin; - gp_Lin aLin = C.Line(); - - - if(!( Precision::IsInfinite(Abs(xmin)) || Precision::IsInfinite(Abs(xmax)) || - Precision::IsInfinite(Abs(ymin)) || Precision::IsInfinite(Abs(ymax)) || - Precision::IsInfinite(Abs(zmin)) || Precision::IsInfinite(Abs(zmax))) ) { - - Extrema_ExtPElC anExt; - Extrema_POnCurv aPntOnLin; - Standard_Real aParOnLin; - Standard_Real lim = Precision::Infinite(); - gp_Pnt aLimPntArray[8]; - - aLimPntArray[0].SetCoord(xmin, ymin, zmin); - aLimPntArray[1].SetCoord(xmax, ymin, zmin); - aLimPntArray[2].SetCoord(xmin, ymax, zmin); - aLimPntArray[3].SetCoord(xmax, ymax, zmin); - aLimPntArray[4].SetCoord(xmin, ymin, zmax); - aLimPntArray[5].SetCoord(xmax, ymin, zmax); - aLimPntArray[6].SetCoord(xmin, ymax, zmax); - aLimPntArray[7].SetCoord(xmax, ymax, zmax); - - for(i = 0; i <= 7; i++) { - anExt.Perform(aLimPntArray[i], aLin, Precision::Confusion(), -lim, lim); - aPntOnLin = anExt.Point(1); - aParOnLin = aPntOnLin.Parameter(); - tmin = Min(aParOnLin, tmin); - tmax = Max(aParOnLin, tmax); - } - - } - else { - tmin = -1.e+50; - tmax = 1.e+50; - } + Standard_Real xmin, ymin, zmin, xmax, ymax, zmax; + aSurfBox.Get(xmin, ymin, zmin, xmax, ymax, zmax); + Standard_Real tmin = Precision::Infinite(), tmax = -tmin; + gp_Lin aLin = C.Line(); - cfirst = Max(cfirst, tmin); - clast = Min(clast, tmax); + if(!( Precision::IsInfinite(Abs(xmin)) || Precision::IsInfinite(Abs(xmax)) || + Precision::IsInfinite(Abs(ymin)) || Precision::IsInfinite(Abs(ymax)) || + Precision::IsInfinite(Abs(zmin)) || Precision::IsInfinite(Abs(zmax))) ) { - } + Extrema_ExtPElC anExt; + Extrema_POnCurv aPntOnLin; + Standard_Real aParOnLin; + Standard_Real lim = Precision::Infinite(); + gp_Pnt aLimPntArray[8]; + + aLimPntArray[0].SetCoord(xmin, ymin, zmin); + aLimPntArray[1].SetCoord(xmax, ymin, zmin); + aLimPntArray[2].SetCoord(xmin, ymax, zmin); + aLimPntArray[3].SetCoord(xmax, ymax, zmin); + aLimPntArray[4].SetCoord(xmin, ymin, zmax); + aLimPntArray[5].SetCoord(xmax, ymin, zmax); + aLimPntArray[6].SetCoord(xmin, ymax, zmax); + aLimPntArray[7].SetCoord(xmax, ymax, zmax); + + for(i = 0; i <= 7; i++) { + anExt.Perform(aLimPntArray[i], aLin, Precision::Confusion(), -lim, lim); + aPntOnLin = anExt.Point(1); + aParOnLin = aPntOnLin.Parameter(); + tmin = Min(aParOnLin, tmin); + tmax = Max(aParOnLin, tmax); + } + + } + else { + tmin = -1.e+50; + tmax = 1.e+50; + } - - Extrema_GenExtCS Ext(C, *myS, NbT, NbU, NbV, cfirst, clast, ufirst, ulast, - vfirst, vlast, mytolC, mytolS); + cfirst = Max(cfirst, tmin); + clast = Min(clast, tmax); - myDone = Ext.IsDone(); - if (myDone) { - Standard_Integer NbExt = Ext.NbExt(); - Standard_Real T,U,V; - Extrema_POnCurv PC; - Extrema_POnSurf PS; - for (i = 1; i <= NbExt; i++) { - PC = Ext.PointOnCurve(i); - PS = Ext.PointOnSurface(i); - T = PC.Parameter(); - PS.Parameter(U, V); + } + + + + Extrema_GenExtCS Ext(C, *myS, NbT, NbU, NbV, cfirst, clast, ufirst, ulast, + vfirst, vlast, mytolC, mytolS); + + myDone = Ext.IsDone(); + if (myDone) { + Standard_Integer NbExt = Ext.NbExt(); + Standard_Real T,U,V; + Extrema_POnCurv PC; + Extrema_POnSurf PS; + for (i = 1; i <= NbExt; i++) { + PC = Ext.PointOnCurve(i); + PS = Ext.PointOnSurface(i); + T = PC.Parameter(); + PS.Parameter(U, V); AddSolution(C, T, U, V, PC.Value(), PS.Value(), Ext.SquareDistance(i)); - } - } - return; - - } + } + } + return; + + } } break; } -// Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 Begin + // Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 Begin case GeomAbs_Circle: { if(myStype == GeomAbs_Cylinder) { - myExtElCS.Perform(C.Circle(), myS->Cylinder()); - break; + myExtElCS.Perform(C.Circle(), myS->Cylinder()); + break; } } case GeomAbs_Hyperbola: { if(myCtype == GeomAbs_Hyperbola && myStype == GeomAbs_Plane) { -// Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 End - myExtElCS.Perform(C.Hyperbola(), myS->Plane()); - break; + // Modified by skv - Thu Jul 7 12:29:34 2005 OCC9134 End + myExtElCS.Perform(C.Hyperbola(), myS->Plane()); + break; } } default: @@ -232,30 +232,30 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, Extrema_GenExtCS Ext; Ext.Initialize(*myS, NbU, NbV, mytolS); if(myCtype == GeomAbs_Hyperbola) { - Standard_Real tmin = Max(-20., C.FirstParameter()); - Standard_Real tmax = Min(20., C.LastParameter()); - Ext.Perform(C, NbT, tmin, tmax, mytolC); // to avoid overflow + Standard_Real tmin = Max(-20., C.FirstParameter()); + Standard_Real tmax = Min(20., C.LastParameter()); + Ext.Perform(C, NbT, tmin, tmax, mytolC); // to avoid overflow } else { - if(myCtype == GeomAbs_Circle && NbT < 13) { - NbT = 13; - } - Ext.Perform(C, NbT, mytolC); + if(myCtype == GeomAbs_Circle && NbT < 13) { + NbT = 13; + } + Ext.Perform(C, NbT, mytolC); } - + myDone = Ext.IsDone(); if (myDone) { - Standard_Integer NbExt = Ext.NbExt(); - Standard_Real T,U,V; - Extrema_POnCurv PC; - Extrema_POnSurf PS; - for (i = 1; i <= NbExt; i++) { - PC = Ext.PointOnCurve(i); - PS = Ext.PointOnSurface(i); - T = PC.Parameter(); - PS.Parameter(U, V); + Standard_Integer NbExt = Ext.NbExt(); + Standard_Real T,U,V; + Extrema_POnCurv PC; + Extrema_POnSurf PS; + for (i = 1; i <= NbExt; i++) { + PC = Ext.PointOnCurve(i); + PS = Ext.PointOnSurface(i); + T = PC.Parameter(); + PS.Parameter(U, V); AddSolution(C, T, U, V, PC.Value(), PS.Value(), Ext.SquareDistance(i)); - } + } //Add sharp points Standard_Integer SolNumber = mySqDist.Length(); @@ -286,7 +286,7 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, { ProjPS.Point(jmin).Parameter(U,V); AddSolution(C, T, U, V, - aPnt, ProjPS.Point(jmin).Value(), MinSqDist); + aPnt, ProjPS.Point(jmin).Value(), MinSqDist); } } //Cut sharp solutions to keep only minimum and maximum @@ -306,7 +306,7 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, Extrema_POnCurv MaxPC = myPOnC(imax); Extrema_POnSurf MinPS = myPOnS(imin); Extrema_POnSurf MaxPS = myPOnS(imax); - + mySqDist.Remove(SolNumber + 1, mySqDist.Length()); myPOnC.Remove(SolNumber + 1, myPOnC.Length()); myPOnS.Remove(SolNumber + 1, myPOnS.Length()); @@ -323,7 +323,7 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, } break; } - + myDone = myExtElCS.IsDone(); if (myDone) { myIsPar = myExtElCS.IsParallel(); @@ -334,16 +334,16 @@ void Extrema_ExtCS::Perform(const Adaptor3d_Curve& C, Standard_Integer NbExt = myExtElCS.NbExt(); Standard_Real U, V; for (i = 1; i <= NbExt; i++) { - Extrema_POnCurv PC; - Extrema_POnSurf PS; - myExtElCS.Points(i, PC, PS); - Standard_Real Ucurve = PC.Parameter(); - PS.Parameter(U, V); + Extrema_POnCurv PC; + Extrema_POnSurf PS; + myExtElCS.Points(i, PC, PS); + Standard_Real Ucurve = PC.Parameter(); + PS.Parameter(U, V); AddSolution(C, Ucurve, U, V, PC.Value(), PS.Value(), myExtElCS.SquareDistance(i)); } } } - + } @@ -376,8 +376,8 @@ Standard_Integer Extrema_ExtCS::NbExt() const void Extrema_ExtCS::Points(const Standard_Integer N, - Extrema_POnCurv& P1, - Extrema_POnSurf& P2) const + Extrema_POnCurv& P1, + Extrema_POnSurf& P2) const { if(!myDone) StdFail_NotDone::Raise(); P1 = myPOnC.Value(N); @@ -385,17 +385,17 @@ void Extrema_ExtCS::Points(const Standard_Integer N, } Standard_Boolean Extrema_ExtCS::AddSolution(const Adaptor3d_Curve& theCurve, - const Standard_Real aT, - const Standard_Real aU, - const Standard_Real aV, - const gp_Pnt& PointOnCurve, - const gp_Pnt& PointOnSurf, - const Standard_Real SquareDist) + const Standard_Real aT, + const Standard_Real aU, + const Standard_Real aV, + const gp_Pnt& PointOnCurve, + const gp_Pnt& PointOnSurf, + const Standard_Real SquareDist) { Standard_Boolean Added = Standard_False; Standard_Real T = aT, U = aU, V = aV; - + if (theCurve.IsPeriodic()) T = ElCLib::InPeriod(T, myucinf, myucinf + theCurve.Period()); if (myS->IsUPeriodic()) @@ -406,8 +406,8 @@ Standard_Boolean Extrema_ExtCS::AddSolution(const Adaptor3d_Curve& theCurve, Extrema_POnCurv aPC; Extrema_POnSurf aPS; if ((myucinf-T) <= mytolC && (T-myucsup) <= mytolC && - (myuinf-U) <= mytolS && (U-myusup) <= mytolS && - (myvinf-V) <= mytolS && (V-myvsup) <= mytolS) + (myuinf-U) <= mytolS && (U-myusup) <= mytolS && + (myvinf-V) <= mytolS && (V-myvsup) <= mytolS) { Standard_Boolean IsNewSolution = Standard_True; for (Standard_Integer j = 1; j <= mySqDist.Length(); j++) @@ -418,8 +418,8 @@ Standard_Boolean Extrema_ExtCS::AddSolution(const Adaptor3d_Curve& theCurve, Standard_Real Uj, Vj; aPS.Parameter(Uj, Vj); if (Abs(T - Tj) <= mytolC && - Abs(U - Uj) <= mytolS && - Abs(V - Vj) <= mytolS) + Abs(U - Uj) <= mytolS && + Abs(V - Vj) <= mytolS) { IsNewSolution = Standard_False; break; diff --git a/src/Extrema/Extrema_GenExtCS.cxx b/src/Extrema/Extrema_GenExtCS.cxx index d69784ab11..bff4cad83b 100644 --- a/src/Extrema/Extrema_GenExtCS.cxx +++ b/src/Extrema/Extrema_GenExtCS.cxx @@ -44,13 +44,13 @@ Extrema_GenExtCS::Extrema_GenExtCS() //purpose : //======================================================================= - Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C, - const Adaptor3d_Surface& S, - const Standard_Integer NbT, - const Standard_Integer NbU, - const Standard_Integer NbV, - const Standard_Real Tol1, - const Standard_Real Tol2) +Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C, + const Adaptor3d_Surface& S, + const Standard_Integer NbT, + const Standard_Integer NbU, + const Standard_Integer NbV, + const Standard_Real Tol1, + const Standard_Real Tol2) { Initialize(S, NbU, NbV, Tol2); Perform(C, NbT, Tol1); @@ -61,19 +61,19 @@ Extrema_GenExtCS::Extrema_GenExtCS() //purpose : //======================================================================= - Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C, - const Adaptor3d_Surface& S, - const Standard_Integer NbT, - const Standard_Integer NbU, - const Standard_Integer NbV, - const Standard_Real tmin, - const Standard_Real tsup, - const Standard_Real Umin, - const Standard_Real Usup, - const Standard_Real Vmin, - const Standard_Real Vsup, - const Standard_Real Tol1, - const Standard_Real Tol2) +Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C, + const Adaptor3d_Surface& S, + const Standard_Integer NbT, + const Standard_Integer NbU, + const Standard_Integer NbV, + const Standard_Real tmin, + const Standard_Real tsup, + const Standard_Real Umin, + const Standard_Real Usup, + const Standard_Real Vmin, + const Standard_Real Vsup, + const Standard_Real Tol1, + const Standard_Real Tol2) { Initialize(S, NbU, NbV, Umin,Usup,Vmin,Vsup,Tol2); Perform(C, NbT, tmin, tsup, Tol1); @@ -85,9 +85,9 @@ Extrema_GenExtCS::Extrema_GenExtCS() //======================================================================= void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S, - const Standard_Integer NbU, - const Standard_Integer NbV, - const Standard_Real Tol2) + const Standard_Integer NbU, + const Standard_Integer NbV, + const Standard_Real Tol2) { myumin = S.FirstUParameter(); myusup = S.LastUParameter(); @@ -102,13 +102,13 @@ void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S, //======================================================================= void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S, - const Standard_Integer NbU, - const Standard_Integer NbV, - const Standard_Real Umin, - const Standard_Real Usup, - const Standard_Real Vmin, - const Standard_Real Vsup, - const Standard_Real Tol2) + const Standard_Integer NbU, + const Standard_Integer NbV, + const Standard_Real Umin, + const Standard_Real Usup, + const Standard_Real Vmin, + const Standard_Real Vsup, + const Standard_Real Tol2) { myS = (Adaptor3d_SurfacePtr)&S; myusample = NbU; @@ -126,8 +126,8 @@ void Extrema_GenExtCS::Initialize(const Adaptor3d_Surface& S, //======================================================================= void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, - const Standard_Integer NbT, - const Standard_Real Tol1) + const Standard_Integer NbT, + const Standard_Real Tol1) { mytmin = C.FirstParameter(); mytsup = C.LastParameter(); @@ -140,10 +140,10 @@ void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, //======================================================================= void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, - const Standard_Integer NbT, - const Standard_Real tmin, - const Standard_Real tsup, - const Standard_Real Tol1) + const Standard_Integer NbT, + const Standard_Real tmin, + const Standard_Real tsup, + const Standard_Real Tol1) { myDone = Standard_False; myF.Initialize(C,*myS); @@ -189,7 +189,7 @@ void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, Standard_Real dfUFirst = aCurve->FirstParameter(); // Create iso line of U=U0 GeomAdaptor_Curve anAx(new Geom_Line(aCurve->Value(dfUFirst), aDir), - trimvmin, trimvsup); + trimvmin, trimvsup); Extrema_ExtCC aLocator(C, anAx); if (aLocator.IsDone() && aLocator.NbExt()>0) { @@ -198,28 +198,28 @@ void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, Extrema_POnCurv aP1, aP2; for (iExt=1; iExt<=aLocator.NbExt(); iExt++) { - aLocator.Points (iExt, aP1, aP2); - // Parameter on curve - UV(1) = aP1.Parameter(); - // To find parameters on surf, try ExtPS - Extrema_ExtPS aPreciser (aP1.Value(), *myS, mytol2, mytol2); - if (aPreciser.IsDone()) - { - // Managed to find extremas between point and surface - Standard_Integer iPExt; - for (iPExt=1; iPExt<=aPreciser.NbExt(); iPExt++) - { - aPreciser.Point(iPExt).Parameter(UV(2),UV(3)); - math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup); - } - } - else - { - // Failed... try the point on iso line - UV(2) = dfUFirst; - UV(3) = aP2.Parameter(); - math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup); - } + aLocator.Points (iExt, aP1, aP2); + // Parameter on curve + UV(1) = aP1.Parameter(); + // To find parameters on surf, try ExtPS + Extrema_ExtPS aPreciser (aP1.Value(), *myS, mytol2, mytol2); + if (aPreciser.IsDone()) + { + // Managed to find extremas between point and surface + Standard_Integer iPExt; + for (iPExt=1; iPExt<=aPreciser.NbExt(); iPExt++) + { + aPreciser.Point(iPExt).Parameter(UV(2),UV(3)); + math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup); + } + } + else + { + // Failed... try the point on iso line + UV(2) = dfUFirst; + UV(3) = aP2.Parameter(); + math_FunctionSetRoot S1 (myF,UV,Tol,UVinf,UVsup); + } } // for (iExt=1; iExt<=aLocator.NbExt(); iExt++) } // if (aLocator.IsDone() && aLocator.NbExt()>0) } // if (myS.Type() == GeomAbs_ExtrusionSurface) @@ -228,10 +228,63 @@ void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, Standard_Real aCUAdd = (mytsup - mytmin) / mytsample; Standard_Real aSUAdd = (myusup - myumin) / myusample; Standard_Real aSVAdd = (myvsup - myvmin) / myvsample; + Standard_Real tres = C.Resolution(1.); + Standard_Real ures = myS->UResolution(1.); + Standard_Real vres = myS->VResolution(1.); + tres = aCUAdd / tres; + ures = aSUAdd / ures; + vres = aSVAdd / vres; + Standard_Real minres = Min(tres, Min(ures, vres)); + Standard_Real factor = 5.; + Standard_Integer maxnbs = 50; + minres *= factor; + if(minres > Epsilon(1.)) + { + if(tres > minres) + { + Standard_Real rsample = mytsample * tres / minres; + if(rsample > maxnbs) + { + mytsample = maxnbs; + } + else + { + mytsample = RealToInt(rsample); + } + aCUAdd = (mytsup - mytmin) / mytsample; + } + if(ures > minres) + { + Standard_Real rsample = myusample * ures / minres; + if(rsample > maxnbs) + { + myusample = maxnbs; + } + else + { + myusample = RealToInt(rsample); + } + aSUAdd = (myusup - myumin) / myusample; + } + if(vres > minres) + { + Standard_Real rsample = myvsample * vres / minres; + if(rsample > maxnbs) + { + myvsample = maxnbs; + } + else + { + myvsample = RealToInt(rsample); + } + aSVAdd = (myvsup - myvmin) / myvsample; + } + } + TColgp_HArray1OfPnt aCPs(1, mytsample); TColgp_HArray2OfPnt aSPs(1, myusample, 1, myvsample); Standard_Integer aRestIterCount = 3; - // The value is calculated by the bug CR23830. + // The value is calculated by the bug CR23830. Standard_Integer aCUDen = 2, aSUDen = 2, aSVDen = 2; Standard_Boolean anAreAvSqsInited = Standard_False; Standard_Real aCUSq = 0, aSUSq = 0, aSVSq = 0; diff --git a/tests/bugs/modalg_5/bug24190 b/tests/bugs/modalg_5/bug24190 index e47d9aa709..f4762e7d74 100755 --- a/tests/bugs/modalg_5/bug24190 +++ b/tests/bugs/modalg_5/bug24190 @@ -6,6 +6,8 @@ puts "" # Exception raised during topological operation. ####################################################################### +cpulimit 1500 + restore [locate_data_file bug24190_itz.brep] b bopcheck b diff --git a/tests/bugs/modalg_5/bug24751_1 b/tests/bugs/modalg_5/bug24751_1 index dc61c4b726..520c30961f 100644 --- a/tests/bugs/modalg_5/bug24751_1 +++ b/tests/bugs/modalg_5/bug24751_1 @@ -16,7 +16,7 @@ if { [regexp {Debug mode} [dversion]] } { } } else { if { [regexp {Windows} [dversion]] } { - set max_time 50 + set max_time 65 } else { set max_time 80 } diff --git a/tests/bugs/modalg_5/bug24751_3 b/tests/bugs/modalg_5/bug24751_3 index 5aadfba284..79b615c566 100644 --- a/tests/bugs/modalg_5/bug24751_3 +++ b/tests/bugs/modalg_5/bug24751_3 @@ -18,7 +18,7 @@ if { [regexp {Debug mode} [dversion]] } { if { [regexp {Windows} [dversion]] } { set max_time 100 } else { - set max_time 140 + set max_time 160 } } diff --git a/tests/bugs/modalg_5/bug24751_4 b/tests/bugs/modalg_5/bug24751_4 index ac967a7654..0b7f770e87 100644 --- a/tests/bugs/modalg_5/bug24751_4 +++ b/tests/bugs/modalg_5/bug24751_4 @@ -16,7 +16,7 @@ if { [regexp {Debug mode} [dversion]] } { } } else { if { [regexp {Windows} [dversion]] } { - set max_time 100 + set max_time 110 } else { set max_time 150 } diff --git a/tests/bugs/moddata_3/bug24896 b/tests/bugs/moddata_3/bug24896 new file mode 100644 index 0000000000..3eff3c020c --- /dev/null +++ b/tests/bugs/moddata_3/bug24896 @@ -0,0 +1,58 @@ +puts "================" +puts "OCC24896" +puts "================" +puts "" +####################################################################### +# BRepExtrema is giving wrong intersection point between curve and planar face +####################################################################### + +restore [locate_data_file bug24896_face_8.brep] f8 +restore [locate_data_file bug24896_compound_line_8.brep] c8 + +distmini d f8 c8 + +# 1 +regexp {([-0-9.+eE]+)$} [dump d_val] full dist +regexp { +Vertex +: +Min +[-0-9.+eE]+ +Max +([-0-9.+eE]+)} [ maxtolerance d ] full toler +set good_dist 0 +if { [expr abs( ${dist} - ${good_dist} )] > ${toler} } { + puts "Faulty : the distanse is ${dist}. It is bad value" +} + +# 2 +# Point 3D : 66.6, -11.8556887483839, 0.3 + +regexp { +Point 3D : +([-0-9.+eE]+), +([-0-9.+eE]+), +([-0-9.+eE]+)} [ dump d ] full x1 y1 z1 +set good_x1 66.6 +set good_y1 -11.8556887483839 +set good_z1 0.3 +if { [expr abs( ${x1} - ${good_x1} )] > ${toler} } { + puts "Faulty : the x coordinate of the point is ${x1}. It is bad value" +} +if { [expr abs( ${y1} - ${good_y1} )] > ${toler} } { + puts "Faulty : the y coordinate of the point is ${y1}. It is bad value" +} +if { [expr abs( ${z1} - ${good_z1} )] > ${toler} } { + puts "Faulty : the z coordinate of the point is ${z1}. It is bad value" +} + +# 3 +# Point 3D : 66.6, 11.8556887323157, 0.3 + +regexp { +Point 3D : +([-0-9.+eE]+), +([-0-9.+eE]+), +([-0-9.+eE]+)} [ dump d2 ] full x2 y2 z2 +set good_x2 66.6 +set good_y2 11.8556887323157 +set good_z2 0.3 +if { [expr abs( ${x2} - ${good_x2} )] > ${toler} } { + puts "Faulty : the x coordinate of the point is ${x2}. It is bad value" +} +if { [expr abs( ${y2} - ${good_y2} )] > ${toler} } { + puts "Faulty : the y coordinate of the point is ${y2}. It is bad value" +} +if { [expr abs( ${z2} - ${good_z2} )] > ${toler} } { + puts "Faulty : the z coordinate of the point is ${z2}. It is bad value" +} + +smallview +fit +set only_screen_axo 1