From 57977bbdaf08a61daec69157d9bf02e470f3480a Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Mon, 1 Dec 2025 17:07:23 +0100 Subject: [PATCH 1/3] TechDraw: Fix MultiValueSchema formatting Multi Value schemas cannot be forced to use Format::FORMATTED. --- src/Mod/TechDraw/App/DimensionFormatter.cpp | 2 +- src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/Mod/TechDraw/App/DimensionFormatter.cpp b/src/Mod/TechDraw/App/DimensionFormatter.cpp index 291c0e3ab8..b9123b2424 100644 --- a/src/Mod/TechDraw/App/DimensionFormatter.cpp +++ b/src/Mod/TechDraw/App/DimensionFormatter.cpp @@ -77,7 +77,7 @@ std::string DimensionFormatter::formatValue(const qreal value, // won't give more than Global_Decimals precision std::string basicString = formatPrefix + asQuantity.getUserString() + formatSuffix; - if (isMultiValueSchema() && partial == Format::UNALTERED) { + if (isMultiValueSchema() || partial == Format::UNALTERED) { return basicString; // Don't even try to use Alt Decimals or hide units } diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index 694b7d661b..a275c821be 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -273,22 +273,15 @@ void QGIViewDimension::updateDim() return; } - QString labelText = - // what about fromStdString? - QString::fromUtf8(dim->getFormattedDimensionValue(Format::FORMATTED).c_str());// pre value [unit] post - if (dim->isMultiValueSchema()) { - labelText = - QString::fromUtf8(dim->getFormattedDimensionValue(Format::UNALTERED).c_str());//don't format multis - } - - QFont font = datumLabel->getFont(); + auto labelText = dim->getFormattedDimensionValue(Format::FORMATTED); + auto font = datumLabel->getFont(); font.setFamily(QString::fromUtf8(vp->Font.getValue())); int fontSize = QGIView::exactFontSize(vp->Font.getValue(), std::max(1.0, vp->Fontsize.getValue())); font.setPixelSize(fontSize); datumLabel->setFont(font); prepareGeometryChange(); - datumLabel->setDimString(labelText); + datumLabel->setDimString(QString::fromStdString(labelText)); datumLabel->setToleranceString(); datumLabel->setFramed(dim->TheoreticalExact.getValue()); From 53b724c40e3d79058d4dc994e3ac37520f99e640 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Mon, 1 Dec 2025 15:18:04 +0100 Subject: [PATCH 2/3] TechDraw: Refactor use of Unit Schema values Quantity's getUserString already returns both factor and unitText. --- src/Mod/TechDraw/App/DimensionFormatter.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Mod/TechDraw/App/DimensionFormatter.cpp b/src/Mod/TechDraw/App/DimensionFormatter.cpp index b9123b2424..4b39a5d585 100644 --- a/src/Mod/TechDraw/App/DimensionFormatter.cpp +++ b/src/Mod/TechDraw/App/DimensionFormatter.cpp @@ -51,7 +51,7 @@ std::string DimensionFormatter::formatValue(const qreal value, const Format partial, const bool isDim) const { - bool distanceMeasure{true}; + bool distanceMeasure{true}; const bool angularMeasure = m_dimension->Type.isValue("Angle") || m_dimension->Type.isValue("Angle3Pt"); const bool areaMeasure = m_dimension->Type.isValue("Area"); @@ -101,7 +101,9 @@ std::string DimensionFormatter::formatValue(const qreal value, formatSpecifier.replace(QStringLiteral("%g"), newSpecifier, Qt::CaseInsensitive); } - std::string unitText = Base::UnitsApi::getUnitText(asQuantity); + double factor{1.0}; + std::string unitText{""}; + asQuantity.getUserString(factor, unitText); std::string super2{"²"}; std::string squareTag{"^2"}; @@ -118,8 +120,7 @@ std::string DimensionFormatter::formatValue(const qreal value, double userVal = asQuantity.getValue(); if (distanceMeasure || areaMeasure) { - const double convertValue = Base::Quantity::parse("1" + unitText).getValue(); - userVal /= convertValue; + userVal /= factor; } // convert ^2 to superscript 2 for display From c0a11089a6e2c27cbaf374c8e37df5d6425dac3f Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Mon, 1 Dec 2025 15:21:18 +0100 Subject: [PATCH 3/3] Revert "[Base]retrieve unit text" This reverts both pointless and broken commit c9fffa67893f. --- src/Base/UnitsApi.cpp | 5 ----- src/Base/UnitsApi.h | 1 - src/Base/UnitsSchema.cpp | 33 --------------------------------- src/Base/UnitsSchema.h | 1 - 4 files changed, 40 deletions(-) diff --git a/src/Base/UnitsApi.cpp b/src/Base/UnitsApi.cpp index 21e912c6de..9dde081c38 100644 --- a/src/Base/UnitsApi.cpp +++ b/src/Base/UnitsApi.cpp @@ -66,11 +66,6 @@ std::string UnitsApi::getBasicLengthUnit() return schemas->currentSchema()->getBasicLengthUnit(); } -std::string UnitsApi::getUnitText(const Quantity& quant) -{ - return schemas->currentSchema()->getUnitText(quant); -} - void UnitsApi::setDecimals(const int prec) { decimals = prec; diff --git a/src/Base/UnitsApi.h b/src/Base/UnitsApi.h index af2c9a9257..077f4d5210 100644 --- a/src/Base/UnitsApi.h +++ b/src/Base/UnitsApi.h @@ -67,7 +67,6 @@ public: static bool isMultiUnitAngle(); static bool isMultiUnitLength(); static std::string getBasicLengthUnit(); - static std::string getUnitText(const Quantity& quant); static std::size_t getDefSchemaNum() { diff --git a/src/Base/UnitsSchema.cpp b/src/Base/UnitsSchema.cpp index 76261749df..decf368f9f 100644 --- a/src/Base/UnitsSchema.cpp +++ b/src/Base/UnitsSchema.cpp @@ -35,8 +35,6 @@ #include "Exception.h" #include "Quantity.h" -#include "Console.h" - using Base::UnitsSchema; using Base::UnitsSchemaSpec; @@ -145,34 +143,3 @@ int UnitsSchema::getNum() const { return static_cast(spec.num); } - - -//! return the unit text for this quantity in this schema. ex 10 mm => "mm" -//! a more general approach than getBasicLengthUnit. -//! TODO: some common code here with translate() -std::string UnitsSchema::getUnitText(const Base::Quantity& quant) const -{ - std::string typeString = quant.getUnit().getTypeString(); // "Area", "Mass", ... - const auto value = quant.getValue(); - - // TODO: some common code here with translate() - if (!spec.translationSpecs.contains(typeString)) { - Base::Console().log("Schema %s has no entry for %s\n", getName().c_str(), typeString.c_str()); - return {}; - } - auto unitSpecs = spec.translationSpecs.at(typeString); - - auto isSuitable = [&](const UnitTranslationSpec& row) { - return row.threshold > value || row.threshold == 0; - }; - - const auto unitSpec = std::ranges::find_if(unitSpecs, isSuitable); - if (unitSpec == unitSpecs.end()) { - throw RuntimeError( - "Suitable threshold not found (2). Schema: " + spec.name - + " value: " + std::to_string(value) - ); - } - - return unitSpec->unitString; -} diff --git a/src/Base/UnitsSchema.h b/src/Base/UnitsSchema.h index 2b42131413..e1583826a0 100644 --- a/src/Base/UnitsSchema.h +++ b/src/Base/UnitsSchema.h @@ -50,7 +50,6 @@ public: [[nodiscard]] std::string getName() const; [[nodiscard]] std::string getDescription() const; [[nodiscard]] int getNum() const; - [[nodiscard]] std::string getUnitText(const Quantity& quant) const; std::string translate(const Quantity& quant) const; std::string translate(const Quantity& quant, double& factor, std::string& unitString) const;