Sketch: [skip ci] handle possible crashes when decreasing degree of a spline

This commit is contained in:
wmayer
2020-10-23 11:26:15 +02:00
parent d532f8ef33
commit 9b806f4ac9
3 changed files with 23 additions and 12 deletions

View File

@@ -5219,7 +5219,11 @@ bool SketchObject::decreaseBSplineDegree(int GeoId, int degreedecrement /*= 1*/)
try {
int cdegree = bspline->getDegree();
bool ok = bspline->approximate(Precision::Confusion(), 20, cdegree-degreedecrement, 0);
// degree must be >= 1
int maxdegree = cdegree - degreedecrement;
if (maxdegree == 0)
return false;
bool ok = bspline->approximate(Precision::Confusion(), 20, maxdegree, 0);
if (!ok)
return false;
}
@@ -5228,6 +5232,9 @@ bool SketchObject::decreaseBSplineDegree(int GeoId, int degreedecrement /*= 1*/)
return false;
}
// FIXME: Avoid to delete the whole geometry but only delete invalid constraints
// and unused construction geometries
#if 0
const std::vector< Part::Geometry * > &vals = getInternalGeometry();
std::vector< Part::Geometry * > newVals(vals);
@@ -5236,6 +5243,11 @@ bool SketchObject::decreaseBSplineDegree(int GeoId, int degreedecrement /*= 1*/)
// AcceptGeometry called from onChanged
Geometry.setValues(newVals);
#else
delGeometry(GeoId);
int newId = addGeometry(bspline.release());
exposeInternalGeometry(newId);
#endif
return true;
}