diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index bc754d3a75..3949e3473f 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -1700,13 +1700,14 @@ void ViewProviderSketch::moveConstraint(int constNum, const Base::Vector2d& toPo p1 = getSolvedSketch().getPoint(Constr->First, Constr->FirstPos); const Part::Geometry *geo1 = GeoList::getGeometryFromGeoId (geomlist, Constr->First); const Part::Geometry *geo2 = GeoList::getGeometryFromGeoId (geomlist, Constr->Second); + if (isLineSegment(*geo2)) { - if (isCircle(*geo1) || isArcOfCircle(*geo1)){ + if (isCircleOrArc(*geo1)){ std::swap(geo1, geo2); // see below } else { // point to line distance - auto lineSeg = static_cast(geo2); + auto lineSeg = static_cast(geo2); //NOLINT Base::Vector3d l2p1 = lineSeg->getStartPoint(); Base::Vector3d l2p2 = lineSeg->getEndPoint(); // calculate the projection of p1 onto line2 @@ -1714,44 +1715,25 @@ void ViewProviderSketch::moveConstraint(int constNum, const Base::Vector2d& toPo p2 += p1; } } - if (isCircle(*geo2) || isArcOfCircle(*geo2)) { + + if (isCircleOrArc(*geo2)) { if (Constr->FirstPos != Sketcher::PointPos::none){ // circular to point distance - Base::Vector3d ct; - double rad = 0.0; - if (isCircle(*geo2)){ - auto circleSeg2 = static_cast(geo2); - ct = circleSeg2->getCenter(); - rad = circleSeg2->getRadius(); - } - else { - auto circleSeg2 = static_cast(geo2); - ct = circleSeg2->getCenter(); - rad = circleSeg2->getRadius(); - } + auto [rad, ct] = getRadiusCenterCircleArc(geo2); + Base::Vector3d v = p1 - ct; v = v.Normalize(); p2 = ct + rad * v; } - else if (isCircle(*geo1) || isArcOfCircle(*geo1)) { // circular to circular distance + else if (isCircleOrArc(*geo1)) { // circular to circular distance GetCirclesMinimalDistance(geo1, geo2, p1, p2); } else if (isLineSegment(*geo1)){ // circular to line distance - auto lineSeg = static_cast(geo1); + auto lineSeg = static_cast(geo1); //NOLINT Base::Vector3d l2p1 = lineSeg->getStartPoint(); Base::Vector3d l2p2 = lineSeg->getEndPoint(); - Base::Vector3d ct; - double rad; - if (isCircle(*geo2)){ - auto circleSeg = static_cast(geo2); - ct = circleSeg->getCenter(); - rad = circleSeg->getRadius(); - } - else { - auto circleSeg = static_cast(geo2); - ct = circleSeg->getCenter(); - rad = circleSeg->getRadius(); - } + auto [rad, ct] = getRadiusCenterCircleArc(geo2); + p1.ProjectToLine(ct - l2p1, l2p2 - l2p1);// project on the line translated to origin Base::Vector3d v = p1; p1 += ct;