From 316d3693a4dc26fc9e32efec0a1b05e2bbece667 Mon Sep 17 00:00:00 2001 From: ifv Date: Fri, 18 Nov 2022 10:13:16 +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 54e114d92f..719e0b02e4 100644 --- a/src/BSplCLib/BSplCLib_2.cxx +++ b/src/BSplCLib/BSplCLib_2.cxx @@ -1234,5 +1234,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 295087f665..514955bd6c 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);