From dfa1b94c834632bbdada170168cd463efade08fa Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Mon, 12 Feb 2024 11:00:52 +0100 Subject: [PATCH] Sketcher: Line DSH: Harmonize width/length behavior with rectangle. --- src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h | 46 +++++++++++++++----- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h index b47462e8bf..068cd814f6 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h @@ -357,13 +357,37 @@ void DSHLineControllerBase::doEnforceControlParameters(Base::Vector2d& onSketchP case SelectMode::SeekSecond: { if (handler->constructionMethod() == ConstructionMethod::OnePointWidthHeight) { if (onViewParameters[OnViewParameter::Third]->isSet) { - onSketchPos.x = handler->startPoint.x - + onViewParameters[OnViewParameter::Third]->getValue(); + double length = onViewParameters[OnViewParameter::Third]->getValue(); + if (fabs(length) < Precision::Confusion()) { + // Both cannot be 0 + if (onViewParameters[OnViewParameter::Fourth]->isSet) { + double width = onViewParameters[OnViewParameter::Fourth]->getValue(); + if (fabs(width) < Precision::Confusion()) { + unsetOnViewParameter( + onViewParameters[OnViewParameter::Third].get()); + return; + } + } + } + int sign = (onSketchPos.x - handler->startPoint.x) >= 0 ? 1 : -1; + onSketchPos.x = handler->startPoint.x + sign * length; } if (onViewParameters[OnViewParameter::Fourth]->isSet) { - onSketchPos.y = handler->startPoint.y - + onViewParameters[OnViewParameter::Fourth]->getValue(); + double width = onViewParameters[OnViewParameter::Fourth]->getValue(); + if (fabs(width) < Precision::Confusion()) { + // Both cannot be 0 + if (onViewParameters[OnViewParameter::Third]->isSet) { + double length = onViewParameters[OnViewParameter::Third]->getValue(); + if (fabs(length) < Precision::Confusion()) { + unsetOnViewParameter( + onViewParameters[OnViewParameter::Fourth].get()); + return; + } + } + } + int sign = (onSketchPos.y - handler->startPoint.y) >= 0 ? 1 : -1; + onSketchPos.y = handler->startPoint.y + sign * width; } } else if (handler->constructionMethod() == ConstructionMethod::OnePointLengthAngle) { @@ -440,11 +464,11 @@ void DSHLineController::adaptParameters(Base::Vector2d onSketchPos) Base::Vector3d vec = end - start; if (!onViewParameters[OnViewParameter::Third]->isSet) { - setOnViewParameterValue(OnViewParameter::Third, vec.x); + setOnViewParameterValue(OnViewParameter::Third, fabs(vec.x)); } if (!onViewParameters[OnViewParameter::Fourth]->isSet) { - setOnViewParameterValue(OnViewParameter::Fourth, vec.y); + setOnViewParameterValue(OnViewParameter::Fourth, fabs(vec.y)); } bool sameSign = vec.x * vec.y > 0.; @@ -570,12 +594,13 @@ void DSHLineController::addConstraints() firstCurve); } else { + bool reverse = (handler->endPoint.x - handler->startPoint.x) < 0; Gui::cmdAppObjectArgs(obj, "addConstraint(Sketcher.Constraint('DistanceX',%d,%d,%d,%d,%f)) ", firstCurve, - 1, + reverse ? 2 : 1, firstCurve, - 2, + reverse ? 1 : 2, fabs(p3)); } }; @@ -601,12 +626,13 @@ void DSHLineController::addConstraints() firstCurve); } else { + bool reverse = (handler->endPoint.y - handler->startPoint.y) < 0; Gui::cmdAppObjectArgs(obj, "addConstraint(Sketcher.Constraint('DistanceY',%d,%d,%d,%d,%f)) ", firstCurve, - 1, + reverse ? 2 : 1, firstCurve, - 2, + reverse ? 1 : 2, fabs(p4)); } };