diff --git a/src/blackmisc/aviation/altitude.cpp b/src/blackmisc/aviation/altitude.cpp index 48505819c..4455f6072 100644 --- a/src/blackmisc/aviation/altitude.cpp +++ b/src/blackmisc/aviation/altitude.cpp @@ -11,6 +11,9 @@ #include "blackmisc/pq/constants.h" #include "blackmisc/pq/pqstring.h" #include "blackmisc/math/mathutils.h" +#include "blackmisc/fileutils.h" +#include "blackmisc/directoryutils.h" +#include "blackmisc/stringutils.h" #include "blackmisc/comparefunctions.h" #include "blackmisc/iconlist.h" #include "blackmisc/icons.h" @@ -27,6 +30,28 @@ namespace BlackMisc { namespace Aviation { + namespace Private + { + QVector initMetricValues() + { + QVector v; + const QString f = CFileUtils::appendFilePaths(CDirectoryUtils::shareMiscDirectory(), "Metric Altitudes.csv"); + const QString ma = CFileUtils::readFileToString(f); + const QStringList values = splitLines(ma); + for (const QString &value : values) + { + const QStringList alts = value.split(";"); + int v1 = -1, v2 = -1, v3 = -1; + if (alts.size() >= 1) { v1 = alts[0].toInt(); } + if (alts.size() >= 2) { v2 = alts[1].toInt(); } + if (alts.size() >= 3) { v3 = alts[2].toInt(); } + const CAltitude::MetricTuple m(v1, v2, v3); + v.push_back(m); + } + return v; + } + } + void CAltitude::registerMetadata() { Mixin::MetaType::registerMetadata(); @@ -34,6 +59,12 @@ namespace BlackMisc qRegisterMetaType(); } + const QVector &CAltitude::metricTuples() + { + static const QVector v = Private::initMetricValues(); + return v; + } + CAltitude::CAltitude(const QString &altitudeAsString, CPqString::SeparatorMode mode) : CLength(0, CLengthUnit::m()), m_datum(MeanSeaLevel) { this->parseFromString(altitudeAsString, mode); @@ -388,6 +419,26 @@ namespace BlackMisc return a; } + int CAltitude::findMetricAltitude(int feet) + { + // m/ft/FL + for (const MetricTuple &m : metricTuples()) + { + if (std::get<1>(m) == feet) return std::get<0>(m); + } + return -1; + } + + int CAltitude::findAltitudeForMetricAltitude(int metric) + { + // m/ft/FL + for (const MetricTuple &m : metricTuples()) + { + if (std::get<0>(m) == metric) return std::get<1>(m); + } + return -1; + } + const CAltitude &CAltitude::null() { static const CAltitude null(0, CAltitude::MeanSeaLevel, CLengthUnit::nullUnit()); diff --git a/src/blackmisc/aviation/altitude.h b/src/blackmisc/aviation/altitude.h index 2c3f1c27f..f97b4be67 100644 --- a/src/blackmisc/aviation/altitude.h +++ b/src/blackmisc/aviation/altitude.h @@ -30,6 +30,8 @@ #include #include #include +#include +#include namespace BlackMisc { @@ -57,6 +59,9 @@ namespace BlackMisc //! Base type using base_type = PhysicalQuantities::CLength; + //! Metric tuple + using MetricTuple = std::tuple; + BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_STRING(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_DBUS(CAltitude) @@ -196,6 +201,11 @@ namespace BlackMisc //! \remark https://en.wikipedia.org/wiki/Flight_level CAltitude roundedToNearest100ft(bool roundDown) const; + //! Search the corresponding feet <-> metric / metric <-> feet @{ + static int findMetricAltitude(int feet); + static int findAltitudeForMetricAltitude(int metric); + //! @} + //! Null altitude (MSL) static const CAltitude &null(); @@ -213,6 +223,9 @@ namespace BlackMisc ReferenceDatum m_datum; //!< MSL or AGL? AltitudeType m_altitudeType = TrueAltitude; //!< type + //! The metric tuples m/ft/FL + static const QVector &metricTuples(); + BLACK_METACLASS( CAltitude, BLACK_METAMEMBER(datum),