Merge pull request #16133 from Ondsel-Development/sk_circle_ovp_bug

Sketcher: Fix autoconstraint issue
This commit is contained in:
Chris Hennes
2024-08-31 13:23:14 -05:00
committed by GitHub
2 changed files with 21 additions and 10 deletions

View File

@@ -565,6 +565,9 @@ protected:
auto currentstate = handler->state();
// ensure that object at point is preselected, so that autoconstraints are generated
handler->preselectAtPoint(lastControlEnforcedPosition);
// We have to redo an update to regenerate the correct autoconstraints after the
// preselectAtPoint.
handler->updateDataAndDrawToPosition(lastControlEnforcedPosition);
doChangeDrawSketchHandlerMode();

View File

@@ -72,6 +72,7 @@ public:
explicit DrawSketchHandlerCircle(ConstructionMethod constrMethod = ConstructionMethod::Center)
: DrawSketchHandlerCircleBase(constrMethod)
, radius(0.0)
, isDiameter(true)
{}
~DrawSketchHandlerCircle() override = default;
@@ -303,6 +304,7 @@ private:
private:
Base::Vector2d centerPoint, firstPoint, secondPoint;
double radius;
bool isDiameter;
};
template<>
@@ -371,6 +373,16 @@ void DSHCircleController::configureToolWidget()
1,
Gui::BitmapFactory().iconFromTheme("Sketcher_Create3PointCircle"));
}
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/Mod/Sketcher/dimensioning");
bool dimensioningDiameter = hGrp->GetBool("DimensioningDiameter", true);
bool dimensioningRadius = hGrp->GetBool("DimensioningRadius", true);
if (dimensioningRadius && !dimensioningDiameter) {
handler->isDiameter = false;
}
}
onViewParameters[OnViewParameter::First]->setLabelType(Gui::SoDatumLabel::DISTANCEX);
@@ -419,7 +431,8 @@ void DSHCircleControllerBase::doEnforceControlParameters(Base::Vector2d& onSketc
if (handler->constructionMethod()
== DrawSketchHandlerCircle::ConstructionMethod::Center) {
if (onViewParameters[OnViewParameter::Third]->isSet) {
double radius = onViewParameters[OnViewParameter::Third]->getValue();
double radius = (handler->isDiameter ? 0.5 : 1)
* onViewParameters[OnViewParameter::Third]->getValue();
if (radius < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Third].get());
return;
@@ -622,20 +635,15 @@ void DSHCircleController::addConstraints()
};
auto constraintradius = [&]() {
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/Mod/Sketcher/dimensioning");
bool dimensioningDiameter = hGrp->GetBool("DimensioningDiameter", true);
bool dimensioningRadius = hGrp->GetBool("DimensioningRadius", true);
if (dimensioningRadius && !dimensioningDiameter) {
if (handler->isDiameter) {
Gui::cmdAppObjectArgs(handler->sketchgui->getObject(),
"addConstraint(Sketcher.Constraint('Radius',%d,%f)) ",
"addConstraint(Sketcher.Constraint('Diameter',%d,%f)) ",
firstCurve,
handler->radius);
handler->radius * 2);
}
else {
Gui::cmdAppObjectArgs(handler->sketchgui->getObject(),
"addConstraint(Sketcher.Constraint('Diameter',%d,%f)) ",
"addConstraint(Sketcher.Constraint('Radius',%d,%f)) ",
firstCurve,
handler->radius);
}