Sketcher: Rectangle DSH Fixes #12297

This commit is contained in:
PaddleStroke
2024-03-27 14:03:37 +01:00
committed by Yorik van Havre
parent c42b1f1654
commit 0fcaf5ccae

View File

@@ -2172,53 +2172,62 @@ void DSHRectangleController::adaptParameters(Base::Vector2d onSketchPos)
onViewParameters[OnViewParameter::Sixth]->setPoints(start, end);
}
}
else {
else if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
onViewParameters[OnViewParameter::Third]->setPoints(toVector3d(handler->corner4),
toVector3d(handler->corner3));
bool threePoints = handler->constructionMethod() == ConstructionMethod::ThreePoints;
bool notReversed = threePoints && !handler->cornersReversed;
bool reversed = handler->cornersReversed;
if (!onViewParameters[OnViewParameter::Fifth]->isSet) {
setOnViewParameterValue(OnViewParameter::Fifth,
notReversed ? handler->width : handler->length);
reversed ? handler->length : handler->width);
}
Base::Vector3d start = toVector3d(handler->corner1);
onViewParameters[OnViewParameter::Fifth]->setLabelAutoDistanceReverse(!notReversed);
onViewParameters[OnViewParameter::Fifth]->setLabelAutoDistanceReverse(reversed);
onViewParameters[OnViewParameter::Fifth]->setPoints(
start,
toVector3d(notReversed ? handler->corner4 : handler->corner2));
toVector3d(reversed ? handler->corner2 : handler->corner4));
if (!onViewParameters[OnViewParameter::Sixth]->isSet) {
if (threePoints) {
double val = Base::toDegrees(handler->angle123);
setOnViewParameterValue(OnViewParameter::Sixth, val, Base::Unit::Angle);
}
else {
double val = Base::toDegrees(handler->angle412);
setOnViewParameterValue(OnViewParameter::Sixth, val, Base::Unit::Angle);
}
double val = Base::toDegrees(handler->angle123);
setOnViewParameterValue(OnViewParameter::Sixth, val, Base::Unit::Angle);
}
if (threePoints) {
onViewParameters[OnViewParameter::Sixth]->setPoints(
toVector3d(notReversed ? handler->corner2 : handler->corner4),
Base::Vector3d());
double startAngle = notReversed ? (handler->corner3 - handler->corner2).Angle()
: (handler->corner1 - handler->corner4).Angle();
onViewParameters[OnViewParameter::Sixth]->setLabelStartAngle(startAngle);
onViewParameters[OnViewParameter::Sixth]->setLabelRange(handler->angle123);
onViewParameters[OnViewParameter::Sixth]->setPoints(
toVector3d(reversed ? handler->corner4 : handler->corner2),
Base::Vector3d());
double startAngle = reversed ? (handler->corner1 - handler->corner4).Angle()
: (handler->corner3 - handler->corner2).Angle();
onViewParameters[OnViewParameter::Sixth]->setLabelStartAngle(startAngle);
onViewParameters[OnViewParameter::Sixth]->setLabelRange(handler->angle123);
}
else {
bool reversed = handler->cornersReversed;
if (!onViewParameters[OnViewParameter::Fifth]->isSet) {
setOnViewParameterValue(OnViewParameter::Fifth,
reversed ? handler->width : handler->length);
}
else {
onViewParameters[OnViewParameter::Sixth]->setPoints(
toVector3d(handler->corner1),
Base::Vector3d());
double startAngle = (handler->corner2 - handler->corner1).Angle();
onViewParameters[OnViewParameter::Sixth]->setLabelStartAngle(startAngle);
onViewParameters[OnViewParameter::Sixth]->setLabelRange(handler->angle412);
Base::Vector3d start = toVector3d(handler->corner1);
onViewParameters[OnViewParameter::Fifth]->setLabelAutoDistanceReverse(true);
onViewParameters[OnViewParameter::Fifth]->setPoints(
start,
toVector3d(reversed ? handler->corner4 : handler->corner2));
if (!onViewParameters[OnViewParameter::Sixth]->isSet) {
double val = Base::toDegrees(handler->angle412);
setOnViewParameterValue(OnViewParameter::Sixth, val, Base::Unit::Angle);
}
onViewParameters[OnViewParameter::Sixth]->setPoints(toVector3d(handler->corner1),
Base::Vector3d());
double startAngle = (handler->corner2 - handler->corner1).Angle();
onViewParameters[OnViewParameter::Sixth]->setLabelStartAngle(startAngle);
onViewParameters[OnViewParameter::Sixth]->setLabelRange(handler->angle412);
}
} break;
@@ -2371,6 +2380,10 @@ void DSHRectangleController::addConstraints()
App::DocumentObject* obj = handler->sketchgui->getObject();
int firstCurve = handler->firstCurve;
bool reverse = handler->cornersReversed;
if (handler->constructionMethod() == ConstructionMethod::CenterAnd3Points) {
reverse = !reverse;
}
auto x0 = onViewParameters[OnViewParameter::First]->getValue();
auto y0 = onViewParameters[OnViewParameter::Second]->getValue();
@@ -2386,12 +2399,19 @@ void DSHRectangleController::addConstraints()
auto radiusSet = onViewParameters[OnViewParameter::Fifth]->isSet;
auto thicknessSet = onViewParameters[OnViewParameter::Sixth]->isSet;
auto corner1x = onViewParameters[OnViewParameter::Third]->getValue();
auto corner1y = onViewParameters[OnViewParameter::Fourth]->getValue();
auto angle = Base::toRadians(onViewParameters[OnViewParameter::Fourth]->getValue());
auto innerAngle = Base::toRadians(onViewParameters[OnViewParameter::Sixth]->getValue());
auto corner1xSet = onViewParameters[OnViewParameter::Third]->isSet;
auto corner1ySet = onViewParameters[OnViewParameter::Fourth]->isSet;
auto angleSet = onViewParameters[OnViewParameter::Fourth]->isSet;
auto innerAngleSet = onViewParameters[OnViewParameter::Sixth]->isSet;
if (handler->constructionMethod() == ConstructionMethod::CenterAnd3Points) {
lengthSet = false;
}
if (handler->constructionMethod() == ConstructionMethod::ThreePoints
|| handler->constructionMethod() == ConstructionMethod::CenterAnd3Points) {
width = onViewParameters[OnViewParameter::Fifth]->getValue();
@@ -2431,7 +2451,7 @@ void DSHRectangleController::addConstraints()
};
auto constraintlength = [&]() {
int curveId = handler->cornersReversed ? firstCurve : firstCurve + 1;
int curveId = reverse ? firstCurve : firstCurve + 1;
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Distance',%d,%d,%d,%d,%f)) ",
@@ -2443,7 +2463,7 @@ void DSHRectangleController::addConstraints()
};
auto constraintwidth = [&]() {
int curveId = handler->cornersReversed ? firstCurve + 1 : firstCurve;
int curveId = reverse ? firstCurve + 1 : firstCurve;
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Distance',%d,%d,%d,%d,%f)) ",
@@ -2494,7 +2514,7 @@ void DSHRectangleController::addConstraints()
}
if (lengthSet) {
int curveId = handler->cornersReversed ? firstCurve : firstCurve + 1;
int curveId = reverse ? firstCurve : firstCurve + 1;
auto startpointinfo = handler->getPointInfo(GeoElementId(curveId, PointPos::start));
auto endpointinfo = handler->getPointInfo(GeoElementId(curveId + 2, PointPos::end));
@@ -2509,7 +2529,7 @@ void DSHRectangleController::addConstraints()
}
if (widthSet) {
int curveId = handler->cornersReversed ? firstCurve + 1 : firstCurve;
int curveId = reverse ? firstCurve + 1 : firstCurve;
auto startpointinfo = handler->getPointInfo(GeoElementId(curveId, PointPos::start));
auto endpointinfo = handler->getPointInfo(GeoElementId(curveId + 2, PointPos::end));
@@ -2525,9 +2545,7 @@ void DSHRectangleController::addConstraints()
// NOTE: As of today, there are no autoconstraints on the radius or on the frame thickness,
// therefore, they are necessarily constrainable were applicable.
if (handler->constructionMethod() == ConstructionMethod::ThreePoints
|| handler->constructionMethod() == ConstructionMethod::CenterAnd3Points) {
if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
if (angleSet) {
if (fabs(angle - M_PI) < Precision::Confusion()
|| fabs(angle + M_PI) < Precision::Confusion()
@@ -2551,28 +2569,41 @@ void DSHRectangleController::addConstraints()
}
}
if (innerAngleSet) {
if (fabs(innerAngle - M_PI / 2)
> Precision::Confusion()) { // if 90? then perpendicular already created.
if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
Gui::cmdAppObjectArgs(
obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%d,%d,%f)) ",
firstCurve + 1,
1,
firstCurve,
2,
innerAngle);
}
else {
Gui::cmdAppObjectArgs(
obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%d,%d,%f)) ",
firstCurve,
1,
firstCurve + 3,
2,
innerAngle);
}
if (fabs(innerAngle - M_PI / 2) > Precision::Confusion()) {
// if 90? then perpendicular already created.
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%d,%d,%f)) ",
firstCurve + 1,
1,
firstCurve,
2,
innerAngle);
}
}
}
else if (handler->constructionMethod() == ConstructionMethod::CenterAnd3Points) {
if (corner1xSet) {
ConstraintToAttachment(GeoElementId(firstCurve, PointPos::start),
GeoElementId::VAxis,
corner1x,
obj);
}
if (corner1ySet) {
ConstraintToAttachment(GeoElementId(firstCurve, PointPos::start),
GeoElementId::HAxis,
corner1y,
obj);
}
if (innerAngleSet) {
if (fabs(innerAngle - M_PI / 2) > Precision::Confusion()) {
// if 90? then perpendicular already created.
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%d,%d,%f)) ",
firstCurve,
1,
firstCurve + 3,
2,
innerAngle);
}
}
}