From 865212fc858216608fca2fcf33804efda5ac4315 Mon Sep 17 00:00:00 2001 From: Paddle Date: Tue, 16 Jan 2024 15:30:59 +0100 Subject: [PATCH] Sketcher Fix radius arc helpers. --- .../Gui/EditModeConstraintCoinManager.cpp | 183 ++++++++++-------- .../Gui/EditModeConstraintCoinManager.h | 7 + 2 files changed, 106 insertions(+), 84 deletions(-) diff --git a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp index 5dc22f984a..3aa0bedcc4 100644 --- a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp @@ -1333,51 +1333,43 @@ Restart: double helperStartAngle = 0.; double helperRange = 0.; - if (Constr->First != GeoEnum::GeoUndef) { - const Part::Geometry* geo = - geolistfacade.getGeometryFromGeoId(Constr->First); + if (Constr->First == GeoEnum::GeoUndef) { + break; + } - if (geo->is()) { - auto* arc = static_cast(geo); - double radius = arc->getRadius(); - double angle = (double)Constr->LabelPosition; - double startAngle, endAngle; - arc->getRange(startAngle, endAngle, /*emulateCCW=*/true); - if (angle == 10) { - angle = (startAngle + endAngle) / 2; - } - if (!(angle > startAngle && angle < endAngle)) { - if (angle < startAngle - && startAngle - angle < angle + 2 * M_PI - endAngle) { - helperStartAngle = angle; - helperRange = startAngle - angle; - } - else { - if (angle < endAngle) { - angle += 2 * M_PI; - } - helperStartAngle = endAngle; - helperRange = angle - endAngle; - } - } - Base::Vector3d center = arc->getCenter(); - pnt1 = center - radius * Base::Vector3d(cos(angle), sin(angle), 0.); - pnt2 = center + radius * Base::Vector3d(cos(angle), sin(angle), 0.); + const Part::Geometry* geo = geolistfacade.getGeometryFromGeoId(Constr->First); + + if (geo->is()) { + auto* arc = static_cast(geo); + double radius = arc->getRadius(); + double angle = (double)Constr->LabelPosition; // between -pi and pi + double startAngle, endAngle; // between 0 and 2*pi + arc->getRange(startAngle, endAngle, /*emulateCCW=*/true); + + if (angle == 10) { + angle = (startAngle + endAngle) / 2; } - else if (geo->is()) { - auto* circle = static_cast(geo); - double radius = circle->getRadius(); - double angle = (double)Constr->LabelPosition; - if (angle == 10) { - angle = 0; - } - Base::Vector3d center = circle->getCenter(); - pnt1 = center - radius * Base::Vector3d(cos(angle), sin(angle), 0.); - pnt2 = center + radius * Base::Vector3d(cos(angle), sin(angle), 0.); - } - else { - break; + + findHelperAngles(helperStartAngle, + helperRange, + angle, + startAngle, + endAngle); + + Base::Vector3d center = arc->getCenter(); + pnt1 = center - radius * Base::Vector3d(cos(angle), sin(angle), 0.); + pnt2 = center + radius * Base::Vector3d(cos(angle), sin(angle), 0.); + } + else if (geo->is()) { + auto* circle = static_cast(geo); + double radius = circle->getRadius(); + double angle = (double)Constr->LabelPosition; + if (angle == 10) { + angle = 0; } + Base::Vector3d center = circle->getCenter(); + pnt1 = center - radius * Base::Vector3d(cos(angle), sin(angle), 0.); + pnt2 = center + radius * Base::Vector3d(cos(angle), sin(angle), 0.); } else { break; @@ -1415,54 +1407,45 @@ Restart: double helperStartAngle = 0.; double helperRange = 0.; - if (Constr->First != GeoEnum::GeoUndef) { - const Part::Geometry* geo = - geolistfacade.getGeometryFromGeoId(Constr->First); + if (Constr->First == GeoEnum::GeoUndef) { + break; + } + const Part::Geometry* geo = geolistfacade.getGeometryFromGeoId(Constr->First); - if (geo->is()) { - auto* arc = static_cast(geo); - double radius = arc->getRadius(); - double angle = (double)Constr->LabelPosition; - double startAngle, endAngle; - arc->getRange(startAngle, endAngle, /*emulateCCW=*/true); - if (angle == 10) { - angle = (startAngle + endAngle) / 2; - } - if (!(angle > startAngle && angle < endAngle)) { - if (angle < startAngle - && startAngle - angle < angle + 2 * M_PI - endAngle) { - helperStartAngle = angle; - helperRange = startAngle - angle; - } - else { - if (angle < endAngle) { - angle += 2 * M_PI; - } - helperStartAngle = endAngle; - helperRange = angle - endAngle; - } - } - pnt1 = arc->getCenter(); - pnt2 = pnt1 + radius * Base::Vector3d(cos(angle), sin(angle), 0.); + if (geo->is()) { + auto* arc = static_cast(geo); + double radius = arc->getRadius(); + double angle = (double)Constr->LabelPosition; // between -pi and pi + double startAngle, endAngle; // between 0 and 2*pi + arc->getRange(startAngle, endAngle, /*emulateCCW=*/true); + + if (angle == 10) { + angle = (startAngle + endAngle) / 2; } - else if (geo->is()) { - auto* circle = static_cast(geo); - auto gf = GeometryFacade::getFacade(geo); - double radius; + findHelperAngles(helperStartAngle, + helperRange, + angle, + startAngle, + endAngle); - radius = circle->getRadius(); + pnt1 = arc->getCenter(); + pnt2 = pnt1 + radius * Base::Vector3d(cos(angle), sin(angle), 0.); + } + else if (geo->is()) { + auto* circle = static_cast(geo); + auto gf = GeometryFacade::getFacade(geo); - double angle = (double)Constr->LabelPosition; - if (angle == 10) { - angle = 0; - } - pnt1 = circle->getCenter(); - pnt2 = pnt1 + radius * Base::Vector3d(cos(angle), sin(angle), 0.); - } - else { - break; + double radius; + + radius = circle->getRadius(); + + double angle = (double)Constr->LabelPosition; + if (angle == 10) { + angle = 0; } + pnt1 = circle->getCenter(); + pnt2 = pnt1 + radius * Base::Vector3d(cos(angle), sin(angle), 0.); } else { break; @@ -1518,6 +1501,38 @@ Restart: } } +void EditModeConstraintCoinManager::findHelperAngles(double& helperStartAngle, + double& helperRange, + double angle, + double startAngle, + double endAngle) +{ + if (angle < 0) { + angle = angle + 2 * M_PI; + } + // endAngle can be more than 2*pi as its startAngle + arcAngle + if (endAngle > 2 * M_PI && angle < endAngle - 2 * M_PI) { + angle = angle + 2 * M_PI; + } + if (!(angle > startAngle && angle < endAngle)) { + if ((angle < startAngle && startAngle - angle < angle + 2 * M_PI - endAngle) + || (angle > endAngle && startAngle + 2 * M_PI - angle < angle - endAngle)) { + if (angle > startAngle) { + angle -= 2 * M_PI; + } + helperStartAngle = angle; + helperRange = startAngle - angle; + } + else { + if (angle < endAngle) { + angle += 2 * M_PI; + } + helperStartAngle = endAngle; + helperRange = angle - endAngle; + } + } +} + Base::Vector3d EditModeConstraintCoinManager::seekConstraintPosition(const Base::Vector3d& origPos, const Base::Vector3d& norm, const Base::Vector3d& dir, diff --git a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h index 657bd6adbb..8db7b6d798 100644 --- a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h @@ -250,6 +250,13 @@ private: /// Essentially a version of sendConstraintIconToCoin, with a blank icon void clearCoinImage(SoImage* soImagePtr); + + /// Find helper angle for radius/diameter constraint + void findHelperAngles(double& helperStartAngle, + double& helperAngle, + double angle, + double startAngle, + double endAngle); //@} private: