Sketcher: add ConstraintLineByAngle helper. (#22273)

* Sketcher: add ConstraintLineByAngle helper.

* Update src/Mod/Sketcher/Gui/Utils.cpp

* Update src/Mod/Sketcher/Gui/Utils.cpp

---------

Co-authored-by: Kacper Donat <[email protected]>
This commit is contained in:
PaddleStroke
2025-07-14 19:44:32 +00:00
committed by GitHub
co-authored by Kacper Donat
parent dc2f2374b6
commit 562d646082
4 changed files with 58 additions and 42 deletions
+1 -22
View File
@@ -673,28 +673,7 @@ void DSHLineController::addConstraints()
};
auto constraintp4angle = [&]() {
using std::numbers::pi;
double angle = Base::toRadians(p4);
if (fabs(angle - pi) < Precision::Confusion() || fabs(angle + pi) < Precision::Confusion()
|| fabs(angle) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Horizontal',%d)) ",
firstCurve);
}
else if (fabs(angle - pi / 2) < Precision::Confusion()
|| fabs(angle + pi / 2) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Vertical',%d)) ",
firstCurve);
}
else {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%f)) ",
Sketcher::GeoEnum::HAxis,
firstCurve,
angle);
}
ConstraintLineByAngle(firstCurve, Base::toRadians(p4), obj);
};
auto constraintp4y = [&]() {
@@ -2607,26 +2607,7 @@ void DSHRectangleController::addConstraints()
if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
if (angleSet) {
if (fabs(angle - pi) < Precision::Confusion()
|| fabs(angle + pi) < Precision::Confusion()
|| fabs(angle) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Horizontal',%d)) ",
firstCurve);
}
else if (fabs(angle - pi / 2) < Precision::Confusion()
|| fabs(angle + pi / 2) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Vertical',%d)) ",
firstCurve);
}
else {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%f)) ",
Sketcher::GeoEnum::HAxis,
firstCurve,
angle);
}
ConstraintLineByAngle(firstCurve, angle, obj);
}
if (innerAngleSet) {
if (fabs(innerAngle - pi / 2) > Precision::Confusion()) {
+53
View File
@@ -668,6 +668,59 @@ void SketcherGui::ConstraintToAttachment(Sketcher::GeoElementId element,
}
}
void SketcherGui::ConstraintLineByAngle(int geoId, double angle, App::DocumentObject* obj)
{
using std::numbers::pi;
double angleModPi = std::fmod(angle, pi);
double angleModHalfPi = std::fmod(angle, pi / 2);
if (fabs(angleModPi - pi) < Precision::Confusion()
|| fabs(angleModPi + pi) < Precision::Confusion()
|| fabs(angleModPi) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj, "addConstraint(Sketcher.Constraint('Horizontal',%d)) ", geoId);
}
else if (fabs(angleModHalfPi - pi / 2) < Precision::Confusion()
|| fabs(angleModHalfPi + pi / 2) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj, "addConstraint(Sketcher.Constraint('Vertical',%d)) ", geoId);
}
else {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%f)) ",
Sketcher::GeoEnum::HAxis,
geoId,
angle);
}
}
void SketcherGui::Constraint2LinesByAngle(int geoId1,
int geoId2,
double angle,
App::DocumentObject* obj)
{
using std::numbers::pi;
double angleModPi = std::fmod(angle, pi);
double angleModHalfPi = std::fmod(angle, pi / 2);
if (fabs(angleModPi) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Parallel',%d,%d)) ",
geoId1,
geoId2);
}
else if (fabs(angleModHalfPi) < Precision::Confusion()) {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Perpendicular',%d,%d)) ",
geoId1,
geoId2);
}
else {
Gui::cmdAppObjectArgs(obj,
"addConstraint(Sketcher.Constraint('Angle',%d,%d,%f)) ",
geoId1,
geoId2,
angle);
}
}
// convenience functions for cursor display
bool SketcherGui::hideUnits()
+3
View File
@@ -199,6 +199,9 @@ void ConstraintToAttachment(Sketcher::GeoElementId element,
double distance,
App::DocumentObject* obj);
void ConstraintLineByAngle(int geoId, double angle, App::DocumentObject* obj);
void Constraint2LinesByAngle(int geoId1, int geoId2, double angle, App::DocumentObject* obj);
// convenience functions for cursor coordinates
bool hideUnits();
bool showCursorCoords();