From dd14b42829a1ca2c3cccd9f417d028dacd26664c Mon Sep 17 00:00:00 2001 From: wandererfan Date: Tue, 30 Aug 2022 20:46:08 -0400 Subject: [PATCH] [Sketcher]make cursor coord display unit aware --- src/Mod/Sketcher/Gui/CommandSketcherTools.cpp | 20 +- src/Mod/Sketcher/Gui/DrawSketchHandler.cpp | 11 +- src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h | 40 ++- .../Gui/DrawSketchHandlerArcOfEllipse.h | 30 +- .../Gui/DrawSketchHandlerArcOfHyperbola.h | 40 ++- .../Gui/DrawSketchHandlerArcOfParabola.h | 28 +- .../Sketcher/Gui/DrawSketchHandlerBSpline.h | 10 +- .../Sketcher/Gui/DrawSketchHandlerCircle.h | 20 +- .../Sketcher/Gui/DrawSketchHandlerEllipse.h | 38 +- src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h | 10 +- .../Sketcher/Gui/DrawSketchHandlerLineSet.h | 20 +- .../Sketcher/Gui/DrawSketchHandlerPolygon.h | 10 +- .../Sketcher/Gui/DrawSketchHandlerRectangle.h | 31 +- src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h | 10 +- src/Mod/Sketcher/Gui/EditModeCoinManager.cpp | 12 +- src/Mod/Sketcher/Gui/SketcherSettings.cpp | 4 + .../Sketcher/Gui/SketcherSettingsDisplay.ui | 331 ++++++++++-------- src/Mod/Sketcher/Gui/Utils.cpp | 150 +++++++- src/Mod/Sketcher/Gui/Utils.h | 14 + 19 files changed, 575 insertions(+), 254 deletions(-) diff --git a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp index 151f1f7628..9a76adb563 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp @@ -1125,9 +1125,13 @@ public: endpoint = EditCurve[0] + length * Base::Vector2d(cos(angle),sin(angle)); } - SbString text; - text.sprintf(" (%.1f, %.1fdeg)", length, angle * 180 / M_PI); - setPositionText(endpoint, text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat(angle * 180.0 / M_PI, 1); + text.sprintf(" (%s, %.s°)", lengthString.c_str(), angleString.c_str()); + setPositionText(endpoint, text); + } EditCurve[1] = endpoint; drawEdit(EditCurve); @@ -1674,9 +1678,13 @@ public: endpoint = EditCurve[0] + length * Base::Vector2d(cos(angle),sin(angle)); } - SbString text; - text.sprintf(" (%.1f, %.1fdeg)", length, angle * 180 / M_PI); - setPositionText(endpoint, text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat(angle *180.0 / M_PI, 1); + text.sprintf(" (%s, %s)", lengthString.c_str(), angleString.c_str()); + setPositionText(endpoint, text); + } EditCurve[1] = endpoint; drawEdit(EditCurve); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp index 73279f8d23..da7dda9f92 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp @@ -53,6 +53,7 @@ #include "DrawSketchHandler.h" #include "ViewProviderSketch.h" #include "CommandConstraints.h" +#include "Utils.h" using namespace SketcherGui; using namespace Sketcher; @@ -957,9 +958,13 @@ void DrawSketchHandler::drawDirectionAtCursor(const Base::Vector2d & position, c float length = (position - origin).Length(); float angle = (position - origin).GetAngle(Base::Vector2d(1.f,0.f)); - SbString text; - text.sprintf(" (%.1f,%.1fdeg)", length, angle * 180 / M_PI); - setPositionText(position, text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat(angle * 180.0 / M_PI, 1); + text.sprintf(" (%s, %s)", lengthString.c_str(), angleString.c_str()); + setPositionText(position, text); + } } void DrawSketchHandler::drawEditMarkers(const std::vector &EditMarkers, unsigned int augmentationlevel) diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h index 64653e4222..4090832e01 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h @@ -81,9 +81,13 @@ public: float radius = (onSketchPos - EditCurve[0]).Length(); float angle = atan2f(dy_ , dx_); - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", radius, angle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat(angle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f))) { @@ -106,9 +110,13 @@ public: // Display radius and arc angle float radius = (onSketchPos - EditCurve[0]).Length(); - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", radius, arcAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat(arcAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.0,0.0))) { @@ -283,9 +291,13 @@ public: // Display radius and start angle // This lineAngle will report counter-clockwise from +X, not relatively - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", (float) radius, (float) lineAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat(lineAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f))) { @@ -353,9 +365,13 @@ public: CenterPoint.y + radius*sin(angle)); } - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", (float) radius, (float) arcAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat(arcAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.0,0.0), diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfEllipse.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfEllipse.h index 18330f3c67..b83383543a 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfEllipse.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfEllipse.h @@ -75,9 +75,12 @@ public: // Display radius for user float radius = (onSketchPos - EditCurve[0]).Length(); - SbString text; - text.sprintf(" (%.1fR,%.1fR)", radius,radius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + text.sprintf(" (R%s, R%s)", radiusString.c_str(), radiusString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, onSketchPos - centerPoint, @@ -106,9 +109,13 @@ public: EditCurve[17] = EditCurve[16]; // Display radius for user - SbString text; - text.sprintf(" (%.1fR,%.1fR)", a, b); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + text.sprintf(" (R%s, R%s)", aString.c_str(), bString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.f,0.f))) { @@ -145,9 +152,14 @@ public: // EditCurve[17] = EditCurve[16]; // Display radii and angle for user - SbString text; - text.sprintf(" (%.1fR,%.1fR,%.1fdeg)", a, b, arcAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + std::string angleString = angleToDisplayFormat(arcAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, R%s, %s)", aString.c_str(), bString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr4, onSketchPos, Base::Vector2d(0.f,0.f))) { diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfHyperbola.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfHyperbola.h index 9d313fcd39..77f41f7deb 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfHyperbola.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfHyperbola.h @@ -65,10 +65,12 @@ public: // Display radius for user float radius = (onSketchPos - centerPoint).Length(); - - SbString text; - text.sprintf(" (%.1fR,%.1fR)", radius,radius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + text.sprintf(" (R%s, R%s)", radiusString.c_str(), radiusString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f), @@ -97,15 +99,19 @@ public: } // Display radius for user - SbString text; - text.sprintf(" (%.1fR,%.1fR)", a, b); - setPositionText(onSketchPos, text); - } + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + text.sprintf(" (R%s, R%s)", aString.c_str(), bString.c_str()); + setPositionText(onSketchPos, text); + } - drawEdit(EditCurve); - if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.f,0.f))) { - renderSuggestConstraintsCursor(sugConstr3); - return; + drawEdit(EditCurve); + if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.f,0.f))) { + renderSuggestConstraintsCursor(sugConstr3); + return; + } } } else if (Mode==STATUS_SEEK_Fourth) { @@ -144,9 +150,13 @@ public: } // Display radius for user - SbString text; - text.sprintf(" (%.1fR,%.1fR)", a, b); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + text.sprintf(" (R%s, R%s)", aString.c_str(), bString.c_str()); + setPositionText(onSketchPos, text); + } } else { arcAngle=0.; diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfParabola.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfParabola.h index c400af0097..b7bde44e99 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfParabola.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcOfParabola.h @@ -68,10 +68,12 @@ public: // Display radius for user float radius = (onSketchPos - focusPoint).Length(); - - SbString text; - text.sprintf(" (F%.1f)", radius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + text.sprintf(" (F%s)", radiusString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f))) { @@ -101,9 +103,12 @@ public: } // Display radius for user - SbString text; - text.sprintf(" (F%.1f)", focal); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string focalString = lengthToDisplayFormat(focal, 1); + text.sprintf(" (F%s)", focalString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); @@ -143,9 +148,12 @@ public: EditCurve[i] = Base::Vector2d(axisPoint.x + rx, axisPoint.y + ry); } - SbString text; - text.sprintf(" (F%.1f)", focal); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string focalString = lengthToDisplayFormat(focal, 1); + text.sprintf(" (F%s)", focalString.c_str()); + setPositionText(onSketchPos, text); + } } else { arcAngle=0.; diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h index 30655db9e8..0dfc2ae329 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h @@ -357,9 +357,13 @@ private: float length = (position - BSplinePoles.back()).Length(); float angle = (position - BSplinePoles.back()).GetAngle(Base::Vector2d(1.f,0.f)); - SbString text; - text.sprintf(" (%.1f,%.1fdeg)", length, (angle != -FLOAT_MAX) ? angle * 180 / M_PI : 0); - setPositionText(position, text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat((angle != -FLOAT_MAX) ? angle * 180 / M_PI : 0, 1); + text.sprintf(" (%s, %s)", lengthString.c_str(), angleString.c_str()); + setPositionText(position, text); + } } } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h index 0024dcd7b6..1f542385ca 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h @@ -67,10 +67,12 @@ public: // Display radius for user float radius = (onSketchPos - EditCurve[0]).Length(); - - SbString text; - text.sprintf(" (%.1fR)", radius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + text.sprintf(" (R%s)", radiusString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, onSketchPos - EditCurve[0], @@ -212,9 +214,13 @@ public: // Display radius and start angle // This lineAngle will report counter-clockwise from +X, not relatively - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", (float) radius, (float) lineAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat( lineAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (Mode == STATUS_SEEK_Second) { diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h index 5b322213fe..5f85138fdb 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h @@ -120,9 +120,12 @@ public: // Display radius for user float semiMajorRadius = a * 2; - SbString text; - text.sprintf(" (%.1fR,%.1fR)", semiMajorRadius,semiMajorRadius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string majorString = lengthToDisplayFormat(semiMajorRadius, 1); + text.sprintf(" (R%s, R%s)", majorString.c_str(), majorString); + setPositionText(onSketchPos, text); + } drawEdit(editCurve); // Suggestions for ellipse and curves are disabled because many tangent constraints @@ -137,9 +140,13 @@ public: approximateEllipse(); // Display radius for user - SbString text; - text.sprintf(" (%.1fR,%.1fR)", a, b); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + text.sprintf(" (R%s, R%s)", aString.c_str(), bString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(editCurve); if (seekAutoConstraint(sugConstr3, onSketchPos, Base::Vector2d(0.f,0.f), @@ -161,9 +168,12 @@ public: // Display radius for user float semiMajorRadius = a * 2; - SbString text; - text.sprintf(" (%.1fR,%.1fR)", semiMajorRadius,semiMajorRadius); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string majorString = lengthToDisplayFormat(semiMajorRadius, 1); + text.sprintf(" (R%s, R%s)", majorString.c_str(), majorString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(editCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, onSketchPos - centroid, @@ -176,9 +186,13 @@ public: approximateEllipse(); // Display radius for user - SbString text; - text.sprintf(" (%.1fR,%.1fR)", a, b); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string aString = lengthToDisplayFormat(a, 1); + std::string bString = lengthToDisplayFormat(b, 1); + text.sprintf(" (R%s, R%s)", aString.c_str(), bString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(editCurve); if (seekAutoConstraint(sugConstr3, onSketchPos, onSketchPos - centroid, diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h index 169bc79e3b..d7b9291acd 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h @@ -55,9 +55,13 @@ public: else if (Mode==STATUS_SEEK_Second){ float length = (onSketchPos - EditCurve[0]).Length(); float angle = (onSketchPos - EditCurve[0]).GetAngle(Base::Vector2d(1.f,0.f)); - SbString text; - text.sprintf(" (%.1f,%.1fdeg)", length, angle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat(angle * 180.0 / M_PI, 1); + text.sprintf(" (%s, %s)", lengthString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } EditCurve[1] = onSketchPos; drawEdit(EditCurve); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerLineSet.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerLineSet.h index 4604e75697..ea6759de21 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerLineSet.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerLineSet.h @@ -194,9 +194,13 @@ public: float length = (EditCurve[1] - EditCurve[0]).Length(); float angle = (EditCurve[1] - EditCurve[0]).GetAngle(Base::Vector2d(1.f,0.f)); - SbString text; - text.sprintf(" (%.1f,%.1fdeg)", length, angle * 180 / M_PI); - setPositionText(EditCurve[1], text); + if (showCursorCoords()) { + SbString text; + std::string lengthString = lengthToDisplayFormat(length, 1); + std::string angleString = angleToDisplayFormat(angle * 180.0 / M_PI, 1); + text.sprintf(" (%s, %s)", lengthString.c_str(), angleString.c_str()); + setPositionText(EditCurve[1], text); + } if (TransitionMode == TRANSITION_MODE_Free) { if (seekAutoConstraint(sugConstr2, onSketchPos, onSketchPos - EditCurve[0])) { @@ -272,9 +276,13 @@ public: drawEdit(EditCurve); - SbString text; - text.sprintf(" (%.1fR,%.1fdeg)", std::abs(arcRadius), arcAngle * 180 / M_PI); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(std::abs(arcRadius), 1); + std::string angleString = angleToDisplayFormat(arcAngle * 180.0 / M_PI, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f))) { renderSuggestConstraintsCursor(sugConstr2); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h index 8e66dd0558..ee6fa48f85 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h @@ -81,9 +81,13 @@ public: const float radius = dV.Length(); const float angle = ( 180.0 / M_PI ) * atan2( dV.y, dV.x ); - SbString text; - text.sprintf(" (%.1fR %.1fdeg)", radius, angle ); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string angleString = angleToDisplayFormat(angle, 1); + text.sprintf(" (R%s, %s)", radiusString.c_str(), angleString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f,0.f))) { diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h index 980729db7d..5b869a966a 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h @@ -68,9 +68,13 @@ public: if(constructionMethod == Diagonal) { float dx = onSketchPos.x - EditCurve[0].x; float dy = onSketchPos.y - EditCurve[0].y; - SbString text; - text.sprintf(" (%.1f x %.1f)", dx, dy); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string dxString = lengthToDisplayFormat(dx, 1); + std::string dyString = lengthToDisplayFormat(dy, 1); + text.sprintf(" (%s x %s)", dxString.c_str(), dyString.c_str()); + setPositionText(onSketchPos, text); + } EditCurve[2] = onSketchPos; EditCurve[1] = Base::Vector2d(onSketchPos.x ,EditCurve[0].y); @@ -80,9 +84,13 @@ public: else if (constructionMethod == CenterAndCorner) { float dx = onSketchPos.x - center.x; float dy = onSketchPos.y - center.y; - SbString text; - text.sprintf(" (%.1f x %.1f)", dx, dy); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string dxString = lengthToDisplayFormat(dx, 1); + std::string dyString = lengthToDisplayFormat(dy, 1); + text.sprintf(" (%s x %s)", dxString.c_str(), dyString.c_str()); + setPositionText(onSketchPos, text); + } EditCurve[0] = center - (onSketchPos - center); EditCurve[1] = Base::Vector2d(EditCurve[0].x,onSketchPos.y); @@ -375,9 +383,14 @@ public: // close the curve EditCurve[36] = EditCurve[0]; - SbString text; - text.sprintf(" (%.1fR %.1fX %.1fY)", radius, lengthX, lengthY); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string radiusString = lengthToDisplayFormat(radius, 1); + std::string xString = lengthToDisplayFormat(lengthX, 1); + std::string yString = lengthToDisplayFormat(lengthY, 1); + text.sprintf(" (R%s X%s Y%s)", radiusString.c_str(), xString.c_str(), yString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(0.f, 0.f))) { diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h index b763db6248..9701438372 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h @@ -119,9 +119,13 @@ public: } EditCurve[34] = EditCurve[0]; - SbString text; - text.sprintf(" (%.1fR %.1fL)", r, sqrt(dx * dx + dy * dy)); - setPositionText(onSketchPos, text); + if (showCursorCoords()) { + SbString text; + std::string rString = lengthToDisplayFormat(r, 1); + std::string sqrtString = lengthToDisplayFormat(sqrt(dx * dx + dy * dy), 1); + text.sprintf(" (R%s L%s))", rString.c_str(), sqrtString.c_str()); + setPositionText(onSketchPos, text); + } drawEdit(EditCurve); if (seekAutoConstraint(sugConstr2, onSketchPos, Base::Vector2d(dx, dy), AutoConstraint::VERTEX_NO_TANGENCY)) { diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp index ce44190052..e9be7df80a 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp @@ -98,6 +98,8 @@ #include "EditModeCoinManager.h" +#include "Utils.h" + using namespace SketcherGui; using namespace Sketcher; @@ -492,9 +494,13 @@ void EditModeCoinManager::setPositionText(const Base::Vector2d &Pos, const SbStr void EditModeCoinManager::setPositionText(const Base::Vector2d &Pos) { - SbString text; - text.sprintf(" (%.1f,%.1f)", Pos.x, Pos.y); - setPositionText(Pos,text); + if (showCursorCoords()) { + SbString text; + std::string xString = lengthToDisplayFormat(Pos.x, 1); + std::string yString = lengthToDisplayFormat(Pos.y, 1); + text.sprintf(" (%s, %s)", xString.c_str(), yString.c_str()); + setPositionText(Pos,text); + } } void EditModeCoinManager::resetPositionText() diff --git a/src/Mod/Sketcher/Gui/SketcherSettings.cpp b/src/Mod/Sketcher/Gui/SketcherSettings.cpp index 1a97616c34..f87daf024c 100644 --- a/src/Mod/Sketcher/Gui/SketcherSettings.cpp +++ b/src/Mod/Sketcher/Gui/SketcherSettings.cpp @@ -151,6 +151,8 @@ void SketcherSettingsDisplay::saveSettings() ui->continueMode->onSave(); ui->constraintMode->onSave(); ui->checkBoxHideUnits->onSave(); + ui->checkBoxShowCursorCoords->onSave(); + ui->checkBoxUseSystemDecimals->onSave(); ui->checkBoxShowDimensionalName->onSave(); ui->prefDimensionalStringFormat->onSave(); ui->checkBoxTVHideDependent->onSave(); @@ -175,6 +177,8 @@ void SketcherSettingsDisplay::loadSettings() ui->continueMode->onRestore(); ui->constraintMode->onRestore(); ui->checkBoxHideUnits->onRestore(); + ui->checkBoxShowCursorCoords->onRestore(); + ui->checkBoxUseSystemDecimals->onRestore(); ui->checkBoxShowDimensionalName->onRestore(); ui->prefDimensionalStringFormat->onRestore(); ui->checkBoxTVHideDependent->onRestore(); diff --git a/src/Mod/Sketcher/Gui/SketcherSettingsDisplay.ui b/src/Mod/Sketcher/Gui/SketcherSettingsDisplay.ui index 1dd3f5986e..ba6406e4be 100644 --- a/src/Mod/Sketcher/Gui/SketcherSettingsDisplay.ui +++ b/src/Mod/Sketcher/Gui/SketcherSettingsDisplay.ui @@ -7,7 +7,7 @@ 0 0 500 - 553 + 664 @@ -20,47 +20,6 @@ Sketch editing - - - - - 182 - 0 - - - - Font size - - - EditSketcherFontSize - - - - - - - Font size used for labels and constraints. - - - px - - - 1 - - - 100 - - - 17 - - - EditSketcherFontSize - - - View - - - @@ -108,6 +67,151 @@ + + + + The number of polygons used for geometry approximation. + + + 50 + + + 1000 + + + SegmentsPerGeometry + + + View + + + + + + + If checked, displays the name on dimensional constraints (if exists). + + + Show dimensional constraint name with format + + + ShowDimensionalName + + + Mod/Sketcher + + + + + + + The format of the dimensional constraint string presentation. +Defaults to: %N = %V + +%N - name parameter +%V - dimension value + + + %N = %V + + + %N = %V + + + DimensionalStringFormat + + + Mod/Sketcher + + + + + + + Segments per geometry + + + SegmentsPerGeometry + + + + + + + The current sketcher creation tool will remain active after creation. + + + Geometry creation "Continue Mode" + + + true + + + ContinuousCreationMode + + + Mod/Sketcher + + + + + + + Font size used for labels and constraints. + + + px + + + 1 + + + 100 + + + 17 + + + EditSketcherFontSize + + + View + + + + + + + Base length units will not be displayed in constraints or cursor coordinates. +Supports all unit systems except 'US customary' and 'Building US/Euro'. + + + Hide base length units for supported unit systems + + + HideUnits + + + Mod/Sketcher + + + + + + + + 182 + 0 + + + + Font size + + + EditSketcherFontSize + + + @@ -128,32 +232,41 @@ - - - - Segments per geometry + + + + The current constraint creation tool will remain active after creation. - - SegmentsPerGeometry + + Constraint creation "Continue Mode" + + + true + + + ContinuousConstraintMode + + + Mod/Sketcher - - + + - The number of polygons used for geometry approximation. + Cursor position coordinates will be displayed beside cursor while editing sketch. - - 50 + + Show coodinates beside cursor while editing - - 1000 + + true - SegmentsPerGeometry + ShowCursorCoords - View + Mod/Sketcher @@ -176,94 +289,16 @@ - - + + - The current sketcher creation tool will remain active after creation. + Cursor coordinates will use the system decimals setting instead of the short form. - Geometry creation "Continue Mode" - - - true + Use system decimals setting for cursor coordinates - ContinuousCreationMode - - - Mod/Sketcher - - - - - - - The current constraint creation tool will remain active after creation. - - - Constraint creation "Continue Mode" - - - true - - - ContinuousConstraintMode - - - Mod/Sketcher - - - - - - - Base length units will not be displayed in constraints. -Supports all unit systems except 'US customary' and 'Building US/Euro'. - - - Hide base length units for supported unit systems - - - HideUnits - - - Mod/Sketcher - - - - - - - If checked, displays the name on dimensional constraints (if exists). - - - Show dimensional constraint name with format - - - ShowDimensionalName - - - Mod/Sketcher - - - - - - - %N = %V - - - %N = %V - - - The format of the dimensional constraint string presentation. -Defaults to: %N = %V - -%N - name parameter -%V - dimension value - - - DimensionalStringFormat + UseSystemDecimals Mod/Sketcher @@ -386,7 +421,7 @@ Defaults to: %N = %V When entering edit mode, force orthographic view of camera. -Works only when "Restore camera position after editing" is enabled. +Works only when "Restore camera position after editing" is enabled. Force orthographic camera when entering edit @@ -476,19 +511,14 @@ Then objects are only visible behind the sketch plane. - - Gui::PrefCheckBox - QCheckBox -
Gui/PrefWidgets.h
-
Gui::PrefSpinBox QSpinBox
Gui/PrefWidgets.h
- Gui::PrefDoubleSpinBox - QDoubleSpinBox + Gui::PrefCheckBox + QCheckBox
Gui/PrefWidgets.h
@@ -496,6 +526,11 @@ Then objects are only visible behind the sketch plane. QLineEdit
Gui/PrefWidgets.h
+ + Gui::PrefDoubleSpinBox + QDoubleSpinBox +
Gui/PrefWidgets.h
+
EditSketcherFontSize diff --git a/src/Mod/Sketcher/Gui/Utils.cpp b/src/Mod/Sketcher/Gui/Utils.cpp index 128e6dc0bf..ff72366dea 100644 --- a/src/Mod/Sketcher/Gui/Utils.cpp +++ b/src/Mod/Sketcher/Gui/Utils.cpp @@ -29,8 +29,11 @@ # include #endif +#include #include #include +#include +#include #include #include #include @@ -50,8 +53,6 @@ #include "ViewProviderSketch.h" #include "DrawSketchHandler.h" -#include "ui_InsertDatum.h" -#include "EditDatumDialog.h" #include "Utils.h" using namespace std; @@ -423,3 +424,148 @@ void SketcherGui::ConstraintToAttachment(Sketcher::GeoElementId element, Sketche } } } + + +//convenience functions for cursor display +bool SketcherGui::hideUnits() +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter(). + GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/Sketcher"); + return hGrp->GetBool("HideUnits", false); +} + +bool SketcherGui::showCursorCoords() +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter(). + GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/Sketcher"); + return hGrp->GetBool("ShowCursorCoords", true); //true for testing. set to false for prod. +} + +bool SketcherGui::useSystemDecimals() +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter(). + GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/Sketcher"); + return hGrp->GetBool("UseSystemDecimals", true); +} + +//convert value to display format %0.[digits]f. Units are displayed if +//preference "ShowUnits" is true, or if the unit schema in effect uses +//multiple units (ex. Ft/In). Digits parameter is ignored for multi-unit +//schemata +//TODO:: if the user string is delivered in 1.23e45 format, this might not work +// correctly. +std::string SketcherGui::lengthToDisplayFormat(double value, int digits) +{ + Base::Quantity asQuantity; + asQuantity.setValue(value); + asQuantity.setUnit(Base::Unit::Length); + QString qUserString = asQuantity.getUserString(); + if ( Base::UnitsApi::isMultiUnitLength() || + (!hideUnits() && useSystemDecimals()) ) { + //just return the user string + return Base::Tools::toStdString(qUserString); + } + + //find the unit of measure + double factor = 1.0; + QString qUnitString; + QString qtranslate = Base::UnitsApi::schemaTranslate(asQuantity, factor, qUnitString); + QString unitPart = QString::fromUtf8(" ") + qUnitString; + + //get the numeric part of the user string + QRegularExpression rxNoUnits(QString::fromUtf8("(.*) \\D*$")); // text before space + any non digits at end of string + QRegularExpressionMatch match = rxNoUnits.match(qUserString); + if (!match.hasMatch()) { + //no units in userString? + return Base::Tools::toStdString(qUserString); + } + QString matched = match.captured(1); //matched is the numeric part of user string + int dpPos = matched.indexOf(QLocale().decimalPoint()); + if (dpPos < 0) { + //no decimal separator (ie an integer), return all the digits + if (hideUnits()) { + return Base::Tools::toStdString(matched); + } else { + return Base::Tools::toStdString(matched + unitPart); + } + } + + //real number + if (useSystemDecimals() && + hideUnits() ) { + //return just the numeric part of the user string + return Base::Tools::toStdString(matched); + } + + //real number and not using system decimals + int requiredLength = dpPos + digits + 1; + if (requiredLength > matched.size()) { + //just take the whole thing + requiredLength = matched.size(); + } + QString numericPart = matched.left(requiredLength); + if (hideUnits()) { + return Base::Tools::toStdString(numericPart); + } + return Base::Tools::toStdString(numericPart + unitPart); +} + +//convert value to display format %0.[digits]f. Units are always displayed for +//angles - 123.456° or 12°34'56". Digits parameter is ignored for multi-unit +//schemata. Note small differences between this method and lengthToDisplyFormat +//TODO:: if the user string is delivered in 1.23e45 format, this might not work +// correctly. +std::string SketcherGui::angleToDisplayFormat(double value, int digits) +{ + Base::Quantity asQuantity; + asQuantity.setValue(value); + asQuantity.setUnit(Base::Unit::Angle); + QString qUserString = asQuantity.getUserString(); + if ( Base::UnitsApi::isMultiUnitAngle() ) { + //just return the user string + //Coin SbString doesn't handle utf8 well, so we convert to ascii + QString schemeMinute = QString::fromUtf8("\xE2\x80\xB2"); //prime symbol + QString schemeSecond = QString::fromUtf8("\xE2\x80\xB3"); //double prime symbol + QString escapeMinute = QString::fromLatin1("\'"); //substitute ascii single quote + QString escapeSecond = QString::fromLatin1("\""); //substitute ascii double quote + QString displayString = qUserString.replace(schemeMinute, escapeMinute); + displayString = displayString.replace(schemeSecond, escapeSecond); + return Base::Tools::toStdString(displayString); + } + + //we always use use U+00B0 (°) as the unit of measure for angles in + //single unit schema. Will need a change to support rads or grads. + QString qUnitString = QString::fromUtf8("°"); + + //get the numeric part of the user string + QRegularExpression rxNoUnits(QString::fromUtf8("(.*)\\D*$")); // text before any non digits at end of string + QRegularExpressionMatch match = rxNoUnits.match(qUserString); + if (!match.hasMatch()) { + //no units in userString? + return Base::Tools::toStdString(qUserString); + } + QString matched = match.captured(1); //matched is the numeric part of user string + int dpPos = matched.indexOf(QLocale().decimalPoint()); + if (dpPos < 0) { + //no decimal separator (ie an integer), return all the digits + return Base::Tools::toStdString(matched + qUnitString); + } + + //real number + if (useSystemDecimals() ) { + //return just the numeric part of the user string + degree symbol + return Base::Tools::toStdString(matched + qUnitString); + } + + //real number and not using system decimals + int requiredLength = dpPos + digits + 1; + if (requiredLength > matched.size()) { + //just take the whole thing + requiredLength = matched.size(); + } + QString numericPart = matched.left(requiredLength); + return Base::Tools::toStdString(numericPart + qUnitString); +} diff --git a/src/Mod/Sketcher/Gui/Utils.h b/src/Mod/Sketcher/Gui/Utils.h index 67d731d94d..be518517cd 100644 --- a/src/Mod/Sketcher/Gui/Utils.h +++ b/src/Mod/Sketcher/Gui/Utils.h @@ -24,7 +24,9 @@ #ifndef SKETCHERGUI_Recompute_H #define SKETCHERGUI_Recompute_H +#include #include +#include #include #include "AutoConstraint.h" @@ -34,8 +36,12 @@ namespace App { namespace Gui { class DocumentObject; + class Document; } +namespace Part { + class Geometry; +} namespace Sketcher { enum class PointPos : int; class SketchObject; @@ -123,6 +129,13 @@ void removeRedundantHorizontalVertical(Sketcher::SketchObject* psketch, void ConstraintToAttachment(Sketcher::GeoElementId element, Sketcher::GeoElementId attachment, double distance, App::DocumentObject* obj); +//convenience functions for cursor coodinates +bool hideUnits(); +bool showCursorCoords(); +bool useSystemDecimals(); +std::string lengthToDisplayFormat(double value, int digits); +std::string angleToDisplayFormat(double value, int digits); + } /// converts a 2D vector into a 3D vector in the XY plane @@ -139,5 +152,6 @@ auto toPointerVector(const std::vector> & vector) { return vp; } + #endif // SKETCHERGUI_Recompute_H