From 727dc9fa9e22e13bd585ece9fba0860fa3d321e1 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sat, 6 Feb 2021 06:19:49 +0100 Subject: [PATCH] Sketcher: Fix wrong diameter reference constraint value when blocked ==================================================================== Fixes: https://forum.freecadweb.org/viewtopic.php?p=474276#p474276 --- src/Mod/Sketcher/App/Sketch.cpp | 25 ++++++++++++++++++++++++- src/Mod/Sketcher/App/planegcs/GCS.cpp | 8 ++++---- src/Mod/Sketcher/App/planegcs/GCS.h | 4 ++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp index 0095764747..4a1cf68b3d 100644 --- a/src/Mod/Sketcher/App/Sketch.cpp +++ b/src/Mod/Sketcher/App/Sketch.cpp @@ -3506,7 +3506,30 @@ bool Sketch::updateNonDrivingConstraints() } else if((*it).constr->Type==Diameter && (*it).constr->First>=0 ) { - (*it).constr->setValue(2.0**((*it).value)); + // two cases, the geometry parameter is fixed or it is not + // NOTE: This is different from being blocked, as new block constraint may fix + // the parameter or not depending on whether other driving constraints are present + int geoId = (*it).constr->First; + + geoId = checkGeoId( geoId ); + + double * rad = nullptr; + + if (Geoms[geoId].type == Circle) { + GCS::Circle &c = Circles[Geoms[geoId].index]; + rad = c.rad; + } + else if (Geoms[geoId].type == Arc) { + GCS::Arc &a = Arcs[Geoms[geoId].index]; + rad = a.rad; + } + + auto pos = std::find(FixParameters.begin(), FixParameters.end(), rad); + + if (pos != FixParameters.end()) + (*it).constr->setValue(*((*it).value)); + else + (*it).constr->setValue(2.0**((*it).value)); } else { (*it).constr->setValue(*((*it).value)); diff --git a/src/Mod/Sketcher/App/planegcs/GCS.cpp b/src/Mod/Sketcher/App/planegcs/GCS.cpp index 01e0f26ffd..68bc17d22a 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/planegcs/GCS.cpp @@ -1035,14 +1035,14 @@ int System::addConstraintArcRadius(Arc &a, double *radius, int tagId, bool drivi return addConstraintEqual(a.rad, radius, tagId, driving); } -int System::addConstraintCircleDiameter(Circle &c, double *radius, int tagId, bool driving) +int System::addConstraintCircleDiameter(Circle &c, double *diameter, int tagId, bool driving) { - return addConstraintProportional(c.rad, radius, 0.5, tagId, driving); + return addConstraintProportional(c.rad, diameter, 0.5, tagId, driving); } -int System::addConstraintArcDiameter(Arc &a, double *radius, int tagId, bool driving) +int System::addConstraintArcDiameter(Arc &a, double *diameter, int tagId, bool driving) { - return addConstraintProportional(a.rad, radius, 0.5, tagId, driving); + return addConstraintProportional(a.rad, diameter, 0.5, tagId, driving); } int System::addConstraintEqualLength(Line &l1, Line &l2, int tagId, bool driving) diff --git a/src/Mod/Sketcher/App/planegcs/GCS.h b/src/Mod/Sketcher/App/planegcs/GCS.h index ee606a5095..865bd238c0 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.h +++ b/src/Mod/Sketcher/App/planegcs/GCS.h @@ -295,8 +295,8 @@ namespace GCS int addConstraintCircleRadius(Circle &c, double *radius, int tagId=0, bool driving = true); int addConstraintArcRadius(Arc &a, double *radius, int tagId=0, bool driving = true); - int addConstraintCircleDiameter(Circle &c, double *radius, int tagId=0, bool driving = true); - int addConstraintArcDiameter(Arc &a, double *radius, int tagId=0, bool driving = true); + int addConstraintCircleDiameter(Circle &c, double *diameter, int tagId=0, bool driving = true); + int addConstraintArcDiameter(Arc &a, double *diameter, int tagId=0, bool driving = true); int addConstraintEqualLength(Line &l1, Line &l2, int tagId=0, bool driving = true); int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0, bool driving = true); int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0, bool driving = true);