]> OCCT Git - occt.git/commitdiff
0033179: Modeling Algorithms - Crash in in ShapeFix_Shape with the attached object...
authorifv <ifv@opencascade.com>
Fri, 18 Nov 2022 07:13:16 +0000 (10:13 +0300)
committerifv <ifv@opencascade.com>
Fri, 18 Nov 2022 07:13:16 +0000 (10:13 +0300)
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
src/Geom2dConvert/Geom2dConvert.cxx

index 54e114d92f761b4c15a65948626870d24be25478..719e0b02e43e0057da552699b8bc8eaa38799dc4 100644 (file)
@@ -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());
+  }
 }
       
index 295087f665f5d7006238d605cbdabcd015215139..514955bd6c96a185e1b857aaf45c7a2f11660152 100644 (file)
@@ -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);