diff --git a/src/blackmisc/aviation/aircraftsituationlist.cpp b/src/blackmisc/aviation/aircraftsituationlist.cpp index 418e94e18..ad6484e42 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.cpp +++ b/src/blackmisc/aviation/aircraftsituationlist.cpp @@ -349,13 +349,16 @@ namespace BlackMisc return c; } - void CAircraftSituationList::addAltitudeOffset(const CLength &offset) + int CAircraftSituationList::addAltitudeOffset(const CLength &offset) { - if (offset.isNull() || this->isEmpty()) { return; } + if (offset.isNull() || this->isEmpty()) { return 0; } + int c = 0; for (CAircraftSituation &s : *this) { s.addAltitudeOffset(offset); + c++; } + return c; } bool CAircraftSituationList::isSortedAdjustedLatestFirstWithoutNullPositions() const diff --git a/src/blackmisc/aviation/aircraftsituationlist.h b/src/blackmisc/aviation/aircraftsituationlist.h index 04407d88b..2a3b41252 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.h +++ b/src/blackmisc/aviation/aircraftsituationlist.h @@ -132,7 +132,7 @@ namespace BlackMisc int setOnGroundDetails(CAircraftSituation::OnGroundDetails details); //! Add an offset to each altitude - void addAltitudeOffset(const PhysicalQuantities::CLength &offset); + int addAltitudeOffset(const PhysicalQuantities::CLength &offset); //! Latest first and no null positions? bool isSortedAdjustedLatestFirstWithoutNullPositions() const; diff --git a/src/blackmisc/aviation/altitude.cpp b/src/blackmisc/aviation/altitude.cpp index 67756d2b2..39501d12d 100644 --- a/src/blackmisc/aviation/altitude.cpp +++ b/src/blackmisc/aviation/altitude.cpp @@ -30,30 +30,32 @@ namespace BlackMisc CAltitude CAltitude::withOffset(const CLength &offset) const { + if (this->isNull()) { return CAltitude(offset, CAltitude::MeanSeaLevel); } CAltitude copy(*this); - if (!offset.isNull() && !offset.isZeroEpsilonConsidered()) { copy += offset; } + if (!offset.isNull() && !offset.isZeroEpsilonConsidered()) + { + copy += offset; + } return copy; } + void CAltitude::addOffset(const CLength &offset) + { + *this = this->withOffset(offset); + } + QString CAltitude::convertToQString(bool i18n) const { if (this->m_datum == FlightLevel) { + static const QString fls("FL%1"); const int fl = qRound(this->CLength::value(CLengthUnit::ft()) / 100.0); - return QString("FL%1").arg(fl); + return fls.arg(fl); } else { - QString s; - if (this->getUnit() == CLengthUnit::m()) - { - s = this->CLength::valueRoundedWithUnit(1, i18n); - } - else - { - s = this->CLength::valueRoundedWithUnit(CLengthUnit::ft(), 0, i18n); - } - return s.append(this->isMeanSeaLevel() ? QStringLiteral(" MSL") : QStringLiteral(" AGL")); + return this->CLength::valueRoundedWithUnit(1, i18n) % + (this->isMeanSeaLevel() ? QStringLiteral(" MSL") : QStringLiteral(" AGL")); } } diff --git a/src/blackmisc/aviation/altitude.h b/src/blackmisc/aviation/altitude.h index f5e9955da..987c9476c 100644 --- a/src/blackmisc/aviation/altitude.h +++ b/src/blackmisc/aviation/altitude.h @@ -105,6 +105,9 @@ namespace BlackMisc //! \remark epsilon 0 (zero) values ignored CAltitude withOffset(const CLength &offset) const; + //! Add offset value + void addOffset(const CLength &offset); + //! AGL Above ground level? bool isAboveGroundLevel() const { return AboveGround == this->m_datum; } diff --git a/src/blackmisc/aviation/callsignobjectlist.cpp b/src/blackmisc/aviation/callsignobjectlist.cpp index 5dadfaaee..b727991ec 100644 --- a/src/blackmisc/aviation/callsignobjectlist.cpp +++ b/src/blackmisc/aviation/callsignobjectlist.cpp @@ -215,6 +215,14 @@ namespace BlackMisc container().sortBy(&OBJ::getCallsign); } + template + CONTAINER ICallsignObjectList::sortedByCallsign() const + { + CONTAINER copy(this->container()); + copy.sortByCallsign(); + return copy; + } + template int ICallsignObjectList::incrementalUpdateOrAdd(const OBJ &objectBeforeChanges, const CPropertyIndexVariantMap &changedValues) { diff --git a/src/blackmisc/aviation/callsignobjectlist.h b/src/blackmisc/aviation/callsignobjectlist.h index dde42d0c3..2f80f4494 100644 --- a/src/blackmisc/aviation/callsignobjectlist.h +++ b/src/blackmisc/aviation/callsignobjectlist.h @@ -104,6 +104,9 @@ namespace BlackMisc //! Sort by callsign void sortByCallsign(); + //! Copy of list sorted by callsign + CONTAINER sortedByCallsign() const; + protected: //! Constructor ICallsignObjectList(); diff --git a/src/blackmisc/geo/elevationplane.cpp b/src/blackmisc/geo/elevationplane.cpp index e667adf18..d7be56d41 100644 --- a/src/blackmisc/geo/elevationplane.cpp +++ b/src/blackmisc/geo/elevationplane.cpp @@ -38,6 +38,13 @@ namespace BlackMisc CCoordinateGeodetic(coordinate), m_radius(radius) { } + void CElevationPlane::addAltitudeOffset(const CLength &offset) + { + if (offset.isNull() || offset.isZeroEpsilonConsidered()) { return; } + const CAltitude newAlt = this->getAltitude().withOffset(offset); + this->setGeodeticHeight(newAlt); + } + const CAltitude &CElevationPlane::getAltitudeIfWithinRadius(const ICoordinateGeodetic &coordinate) const { return (isWithinRange(coordinate)) ? geodeticHeight() : CAltitude::null(); diff --git a/src/blackmisc/geo/elevationplane.h b/src/blackmisc/geo/elevationplane.h index f5ac9d1ba..bfbf9d323 100644 --- a/src/blackmisc/geo/elevationplane.h +++ b/src/blackmisc/geo/elevationplane.h @@ -48,6 +48,9 @@ namespace BlackMisc //! Radius void setRadius(const PhysicalQuantities::CLength &radius) { m_radius = radius; } + //! Add offset to altitude + void addAltitudeOffset(const PhysicalQuantities::CLength &offset); + //! Altitude when within radius, else null const Aviation::CAltitude &getAltitudeIfWithinRadius(const ICoordinateGeodetic &coordinate) const; diff --git a/src/blackmisc/pq/physicalquantity.cpp b/src/blackmisc/pq/physicalquantity.cpp index 0a201347d..0740214f8 100644 --- a/src/blackmisc/pq/physicalquantity.cpp +++ b/src/blackmisc/pq/physicalquantity.cpp @@ -143,6 +143,7 @@ namespace BlackMisc template const PQ &CPhysicalQuantity::makePositive() { + if (this->isNull() || m_value == 0) { return *this->derived(); } if (m_value < 0) { m_value *= -1.0; } return *this->derived(); } @@ -150,6 +151,7 @@ namespace BlackMisc template const PQ &CPhysicalQuantity::makeNegative() { + if (this->isNull() || m_value == 0) { return *this->derived(); } if (m_value > 0) { m_value *= -1.0; } return *this->derived(); } @@ -157,6 +159,7 @@ namespace BlackMisc template PQ CPhysicalQuantity::abs() const { + if (this->isNull() || m_value == 0) { return *this->derived(); } if (m_value >= 0) { return *this->derived(); } PQ copy(*this->derived()); return copy.makePositive();