From 9a80921d74c17f1940b1de7fed1193ac209b1aca Mon Sep 17 00:00:00 2001 From: theo-vt Date: Tue, 3 Jun 2025 05:16:56 -0400 Subject: [PATCH] Sketcher: Fix scaling down ellipses and arcs of ellipses (#21718) * Reorder ellipse major/minor radius assignment when scaling down * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h index 4cf17fce04..22f3c0ea94 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h @@ -263,15 +263,33 @@ private: } else if (isEllipse(*geo)) { auto* ellipse = static_cast(geo); // NOLINT - ellipse->setMajorRadius(ellipse->getMajorRadius() * scaleFactor); - ellipse->setMinorRadius(ellipse->getMinorRadius() * scaleFactor); + + // OpenCascade throws if we try to set a major radius smaller than + // the minor radius or conversly, so we reorder the operations + // depending on if we scale up or down + if (scaleFactor < 1.0) { + ellipse->setMinorRadius(ellipse->getMinorRadius() * scaleFactor); + ellipse->setMajorRadius(ellipse->getMajorRadius() * scaleFactor); + } + else { + ellipse->setMajorRadius(ellipse->getMajorRadius() * scaleFactor); + ellipse->setMinorRadius(ellipse->getMinorRadius() * scaleFactor); + } ellipse->setCenter( getScaledPoint(ellipse->getCenter(), referencePoint, scaleFactor)); } else if (isArcOfEllipse(*geo)) { auto* arcOfEllipse = static_cast(geo); // NOLINT - arcOfEllipse->setMajorRadius(arcOfEllipse->getMajorRadius() * scaleFactor); - arcOfEllipse->setMinorRadius(arcOfEllipse->getMinorRadius() * scaleFactor); + + // Same reasoning as Part::GeomEllipse + if (scaleFactor < 1.0) { + arcOfEllipse->setMinorRadius(arcOfEllipse->getMinorRadius() * scaleFactor); + arcOfEllipse->setMajorRadius(arcOfEllipse->getMajorRadius() * scaleFactor); + } + else { + arcOfEllipse->setMajorRadius(arcOfEllipse->getMajorRadius() * scaleFactor); + arcOfEllipse->setMinorRadius(arcOfEllipse->getMinorRadius() * scaleFactor); + } arcOfEllipse->setCenter( getScaledPoint(arcOfEllipse->getCenter(), referencePoint, scaleFactor)); }