diff --git a/src/Base/UnitsApi.cpp b/src/Base/UnitsApi.cpp index 9b493ba6ac..14ed7719fa 100644 --- a/src/Base/UnitsApi.cpp +++ b/src/Base/UnitsApi.cpp @@ -66,6 +66,11 @@ 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 db2accbe9e..42a7f4684b 100644 --- a/src/Base/UnitsApi.h +++ b/src/Base/UnitsApi.h @@ -68,6 +68,7 @@ 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 4a1a7a89b3..7eaabf80cd 100644 --- a/src/Base/UnitsSchema.cpp +++ b/src/Base/UnitsSchema.cpp @@ -35,6 +35,8 @@ #include "Exception.h" #include "Quantity.h" +#include "Console.h" + using Base::UnitsSchema; using Base::UnitsSchemaSpec; @@ -143,3 +145,34 @@ 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 42dd340dc5..c823740fff 100644 --- a/src/Base/UnitsSchema.h +++ b/src/Base/UnitsSchema.h @@ -50,6 +50,7 @@ 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;