From db99012dc48be64e95a51957ff1bf54d9ae6d9bc Mon Sep 17 00:00:00 2001 From: ifv Date: Fri, 28 Oct 2022 15:24:48 +0300 Subject: [PATCH] 0033179: Modeling Algorithms - Crash in in ShapeFix_Shape with the attached object, when healing for fixing SameParameterFlag BSplCLib_2.cxx - method MergeBSplineKnots is modified in order to have always not empty result. Geom2dConvert.cxx - in static function MultNumandDenom tolerance for comparing knots is decreased. --- src/BSplCLib/BSplCLib_2.cxx | 15 +++++++++++++++ src/Geom2dConvert/Geom2dConvert.cxx | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/BSplCLib/BSplCLib_2.cxx b/src/BSplCLib/BSplCLib_2.cxx index bbdfebef51..22c1b93c38 100644 --- a/src/BSplCLib/BSplCLib_2.cxx +++ b/src/BSplCLib/BSplCLib_2.cxx @@ -1235,5 +1235,20 @@ void BSplCLib::MergeBSplineKnots } NumPoles = index - degree - 1 ; } + else + { + degree = Degree1 + Degree2; + num_knots = 2; + NewKnots = + new TColStd_HArray1OfReal(1, num_knots); + NewKnots->ChangeArray1()(1) = StartValue; + NewKnots->ChangeArray1()(num_knots) = EndValue; + + NewMults = + new TColStd_HArray1OfInteger(1, num_knots); + NewMults->ChangeArray1()(1) = degree + 1; + NewMults->ChangeArray1()(num_knots) = degree + 1; + NumPoles = BSplCLib::NbPoles(degree, Standard_False, NewMults->Array1()); + } } diff --git a/src/Geom2dConvert/Geom2dConvert.cxx b/src/Geom2dConvert/Geom2dConvert.cxx index 05c29d8388..b6af8e0341 100644 --- a/src/Geom2dConvert/Geom2dConvert.cxx +++ b/src/Geom2dConvert/Geom2dConvert.cxx @@ -519,7 +519,6 @@ static Handle(Geom2d_BSplineCurve) MultNumandDenom(const Handle(Geom2d_BSplineCu Handle(TColStd_HArray1OfReal) resKnots; Handle(TColStd_HArray1OfInteger) resMults; Standard_Real start_value,end_value; - Standard_Real tolerance=Precision::Confusion(); Standard_Integer resNbPoles,degree, ii,jj, aStatus; @@ -531,6 +530,7 @@ static Handle(Geom2d_BSplineCurve) MultNumandDenom(const Handle(Geom2d_BSplineCu BS->KnotSequence(BSFlatKnots); start_value = BSKnots(1); end_value = BSKnots(BS->NbKnots()); + Standard_Real tolerance = 10.*Epsilon(Abs(end_value)); a->Knots(aKnots); a->Poles(aPoles);