Sketcher: Fix wrong diameter reference constraint value when blocked

====================================================================

Fixes:
https://forum.freecadweb.org/viewtopic.php?p=474276#p474276
This commit is contained in:
Abdullah Tahiri
2021-02-06 06:19:49 +01:00
parent 9318c4c1f2
commit 727dc9fa9e
3 changed files with 30 additions and 7 deletions

View File

@@ -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));

View File

@@ -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)

View File

@@ -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);