]> OCCT Git - occt.git/commitdiff
0033179: Modeling Algorithms - Crash in in ShapeFix_Shape with the attached object...
authorifv <ifv@opencascade.com>
Fri, 28 Oct 2022 12:24:48 +0000 (15:24 +0300)
committerifv <ifv@opencascade.com>
Fri, 28 Oct 2022 12:24:48 +0000 (15:24 +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 bbdfebef51f2df6d8a5d4c4216c753c6cc6ac092..22c1b93c380d6e69094b944e75a230b443511317 100644 (file)
@@ -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());
+  }
 }
       
index 05c29d838832c46edc35ae3de76867b5af7b8284..b6af8e03417fbf344e972d7ce4c574518719c1c7 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);