From 22ed4c36fc1000988c6ed7a501896b898f37c71c Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 3 May 2025 10:13:54 -0400 Subject: [PATCH 1/6] Add radar altitude data form config json file into code --- scwx-qt/source/scwx/qt/config/radar_site.cpp | 8 +++++ scwx-qt/source/scwx/qt/config/radar_site.hpp | 34 +++++++++----------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/scwx-qt/source/scwx/qt/config/radar_site.cpp b/scwx-qt/source/scwx/qt/config/radar_site.cpp index 5e49847a..5c1dba2e 100644 --- a/scwx-qt/source/scwx/qt/config/radar_site.cpp +++ b/scwx-qt/source/scwx/qt/config/radar_site.cpp @@ -51,6 +51,7 @@ public: std::string state_ {}; std::string place_ {}; std::string tzName_ {}; + double altitude_ {0.0}; const scwx::util::time_zone* timeZone_ {nullptr}; }; @@ -142,6 +143,11 @@ const scwx::util::time_zone* RadarSite::time_zone() const return p->timeZone_; } +units::length::feet RadarSite::altitude() const +{ + return units::length::feet(p->altitude_); +} + std::shared_ptr RadarSite::Get(const std::string& id) { std::shared_lock lock(siteMutex_); @@ -268,6 +274,8 @@ size_t RadarSite::ReadConfig(const std::string& path) site->p->state_ = boost::json::value_to(o.at("state")); site->p->place_ = boost::json::value_to(o.at("place")); site->p->tzName_ = boost::json::value_to(o.at("tz")); + site->p->altitude_ = + boost::json::value_to(o.at("elevation")); try { diff --git a/scwx-qt/source/scwx/qt/config/radar_site.hpp b/scwx-qt/source/scwx/qt/config/radar_site.hpp index 16f6e710..cf622d7a 100644 --- a/scwx-qt/source/scwx/qt/config/radar_site.hpp +++ b/scwx-qt/source/scwx/qt/config/radar_site.hpp @@ -6,12 +6,9 @@ #include #include #include +#include -namespace scwx -{ -namespace qt -{ -namespace config +namespace scwx::qt::config { class RadarSiteImpl; @@ -28,18 +25,19 @@ public: RadarSite(RadarSite&&) noexcept; RadarSite& operator=(RadarSite&&) noexcept; - std::string type() const; - std::string type_name() const; - std::string id() const; - double latitude() const; - double longitude() const; - std::string country() const; - std::string state() const; - std::string place() const; - std::string location_name() const; - std::string tz_name() const; + [[nodiscard]] std::string type() const; + [[nodiscard]] std::string type_name() const; + [[nodiscard]] std::string id() const; + [[nodiscard]] double latitude() const; + [[nodiscard]] double longitude() const; + [[nodiscard]] std::string country() const; + [[nodiscard]] std::string state() const; + [[nodiscard]] std::string place() const; + [[nodiscard]] std::string location_name() const; + [[nodiscard]] std::string tz_name() const; + [[nodiscard]] units::length::feet altitude() const; - const scwx::util::time_zone* time_zone() const; + [[nodiscard]] const scwx::util::time_zone* time_zone() const; static std::shared_ptr Get(const std::string& id); static std::vector> GetAll(); @@ -67,6 +65,4 @@ private: std::string GetRadarIdFromSiteId(const std::string& siteId); -} // namespace config -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::config From b84c36c91ab49ec69a9fc28cc165b78fb73a77e3 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 3 May 2025 10:14:53 -0400 Subject: [PATCH 2/6] Add GetRadarBeamAltititude into geographic lib --- .../source/scwx/qt/util/geographic_lib.cpp | 20 +++++++++++++++++++ .../source/scwx/qt/util/geographic_lib.hpp | 15 ++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/scwx-qt/source/scwx/qt/util/geographic_lib.cpp b/scwx-qt/source/scwx/qt/util/geographic_lib.cpp index bfaf408f..8181f34c 100644 --- a/scwx-qt/source/scwx/qt/util/geographic_lib.cpp +++ b/scwx-qt/source/scwx/qt/util/geographic_lib.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -289,6 +290,25 @@ bool AreaInRangeOfPoint(const std::vector& area, return GetDistanceAreaPoint(area, point) <= distance; } +units::length::meters +GetRadarBeamAltititude(units::length::meters range, + units::angle::degrees elevation, + units::length::meters height) +{ + static const units::length::meters earthRadius {6367444 * 4/3}; + + height += earthRadius; + + const double elevationRadians = + units::angle::radians(elevation).value(); + const auto altitudeSquared = + (range * range + height * height + + 2 * range * height * std::sin(elevationRadians)); + + return units::length::meters(std::sqrt(altitudeSquared.value())) - + earthRadius; +} + } // namespace GeographicLib } // namespace util } // namespace qt diff --git a/scwx-qt/source/scwx/qt/util/geographic_lib.hpp b/scwx-qt/source/scwx/qt/util/geographic_lib.hpp index 5038d9a9..1d6cc38e 100644 --- a/scwx-qt/source/scwx/qt/util/geographic_lib.hpp +++ b/scwx-qt/source/scwx/qt/util/geographic_lib.hpp @@ -121,6 +121,21 @@ bool AreaInRangeOfPoint(const std::vector& area, const common::Coordinate& point, const units::length::meters distance); +/** + * Get the altitude of the radar beam at a given distance, elevation and height + * + * @param [in] range The range to the radar site + * @param [in] elevation The elevation of the radar site + * @param [in] height The height of the radar site + * + * @return The altitude of the radar at that range + */ +units::length::meters +GetRadarBeamAltititude(units::length::meters range, + units::angle::degrees elevation, + units::length::meters height); + + } // namespace GeographicLib } // namespace util } // namespace qt From d21a11963fdbf03d4921ee55f191952373517b71 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 3 May 2025 10:15:28 -0400 Subject: [PATCH 3/6] Add current radar site to map context --- scwx-qt/source/scwx/qt/map/map_context.cpp | 11 +++++++++++ scwx-qt/source/scwx/qt/map/map_context.hpp | 22 +++++++++++----------- scwx-qt/source/scwx/qt/map/map_widget.cpp | 3 +++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_context.cpp b/scwx-qt/source/scwx/qt/map/map_context.cpp index 46c2b6fa..a0c1e74a 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.cpp +++ b/scwx-qt/source/scwx/qt/map/map_context.cpp @@ -27,6 +27,7 @@ public: common::RadarProductGroup::Unknown}; std::string radarProduct_ {"???"}; int16_t radarProductCode_ {0}; + std::shared_ptr radarSite_ {nullptr}; MapProvider mapProvider_ {MapProvider::Unknown}; std::string mapCopyrights_ {}; @@ -106,6 +107,11 @@ std::string MapContext::radar_product() const return p->radarProduct_; } +std::shared_ptr MapContext::radar_site() const +{ + return p->radarSite_; +} + int16_t MapContext::radar_product_code() const { return p->radarProductCode_; @@ -174,6 +180,11 @@ void MapContext::set_radar_product_code(int16_t radarProductCode) p->radarProductCode_ = radarProductCode; } +void MapContext::set_radar_site(const std::shared_ptr& site) +{ + p->radarSite_ = site; +} + void MapContext::set_widget(QWidget* widget) { p->widget_ = widget; diff --git a/scwx-qt/source/scwx/qt/map/map_context.hpp b/scwx-qt/source/scwx/qt/map/map_context.hpp index 680f9ddd..39a5c1be 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.hpp +++ b/scwx-qt/source/scwx/qt/map/map_context.hpp @@ -4,13 +4,12 @@ #include #include #include +#include #include #include -namespace scwx -{ -namespace qt +namespace scwx::qt { namespace view { @@ -30,7 +29,7 @@ class MapContext : public gl::GlContext public: explicit MapContext( std::shared_ptr radarProductView = nullptr); - ~MapContext(); + ~MapContext() override; MapContext(const MapContext&) = delete; MapContext& operator=(const MapContext&) = delete; @@ -48,11 +47,12 @@ public: [[nodiscard]] std::shared_ptr overlay_product_view() const; [[nodiscard]] std::shared_ptr - radar_product_view() const; - [[nodiscard]] common::RadarProductGroup radar_product_group() const; - [[nodiscard]] std::string radar_product() const; - [[nodiscard]] int16_t radar_product_code() const; - [[nodiscard]] QWidget* widget() const; + radar_product_view() const; + [[nodiscard]] common::RadarProductGroup radar_product_group() const; + [[nodiscard]] std::string radar_product() const; + [[nodiscard]] int16_t radar_product_code() const; + [[nodiscard]] std::shared_ptr radar_site() const; + [[nodiscard]] QWidget* widget() const; void set_map(const std::shared_ptr& map); void set_map_copyrights(const std::string& copyrights); @@ -67,6 +67,7 @@ public: void set_radar_product_group(common::RadarProductGroup radarProductGroup); void set_radar_product(const std::string& radarProduct); void set_radar_product_code(int16_t radarProductCode); + void set_radar_site(const std::shared_ptr& site); void set_widget(QWidget* widget); private: @@ -76,5 +77,4 @@ private: }; } // namespace map -} // namespace qt -} // namespace scwx +} // namespace scwx::qt diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index abf5d484..f9b898c1 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -2008,6 +2008,9 @@ void MapWidgetImpl::SelectNearestRadarSite(double latitude, void MapWidgetImpl::SetRadarSite(const std::string& radarSite, bool checkProductAvailability) { + // Set the radar site in the context + context_->set_radar_site(config::RadarSite::Get(radarSite)); + // Check if radar site has changed if (radarProductManager_ == nullptr || radarSite != radarProductManager_->radar_site()->id()) From 33f92bcda574fbb0a5646bcea333f6ec5e5393a1 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 3 May 2025 10:16:20 -0400 Subject: [PATCH 4/6] Add radar line and radar distance/altitude tooltip --- .../scwx/qt/map/radar_product_layer.cpp | 80 +++++++++++++++++-- .../source/scwx/qt/map/radar_site_layer.cpp | 71 +++++++++++++++- 2 files changed, 141 insertions(+), 10 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp index 8d243973..f305f4f7 100644 --- a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp @@ -1,6 +1,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -353,11 +356,66 @@ bool RadarProductLayer::RunMousePicking( std::shared_ptr radarProductView = context()->radar_product_view(); - if (radarProductView == nullptr) + if (context()->radar_site() == nullptr) { return itemPicked; } + // Get distance and altitude of point + const double radarLatitude = context()->radar_site()->latitude(); + const double radarLongitude = context()->radar_site()->longitude(); + + const auto distanceMeters = util::GeographicLib::GetDistance( + mouseGeoCoords.latitude_, + mouseGeoCoords.longitude_, + radarLatitude, + radarLongitude); + + const std::string distanceUnitName = + settings::UnitSettings::Instance().distance_units().GetValue(); + const types::DistanceUnits distanceUnits = + types::GetDistanceUnitsFromName(distanceUnitName); + const double distanceScale = types::GetDistanceUnitsScale(distanceUnits); + const std::string distanceAbbrev = + types::GetDistanceUnitsAbbreviation(distanceUnits); + + const double distance = distanceMeters.value() * + scwx::common::kKilometersPerMeter * distanceScale; + std::string distanceHeightStr = + fmt::format("{:.2f} {}", distance, distanceAbbrev); + + if (radarProductView == nullptr) + { + util::tooltip::Show(distanceHeightStr, mouseGlobalPos); + itemPicked = true; + return itemPicked; + } + + std::optional elevation = radarProductView->elevation(); + if (elevation.has_value()) + { + const auto altitudeMeters = + util::GeographicLib::GetRadarBeamAltititude( + distanceMeters, + units::angle::degrees(*elevation), + context()->radar_site()->altitude()); + + const std::string heightUnitName = + settings::UnitSettings::Instance().echo_tops_units().GetValue(); + const types::EchoTopsUnits heightUnits = + types::GetEchoTopsUnitsFromName(heightUnitName); + const double heightScale = types::GetEchoTopsUnitsScale(heightUnits); + const std::string heightAbbrev = + types::GetEchoTopsUnitsAbbreviation(heightUnits); + + const double altitude = altitudeMeters.value() * + scwx::common::kKilometersPerMeter * + heightScale; + + distanceHeightStr = fmt::format( + "{}\n{:.2f} {}", distanceHeightStr, altitude, heightAbbrev); + } + std::optional binLevel = radarProductView->GetBinLevel(mouseGeoCoords); @@ -383,12 +441,13 @@ bool RadarProductLayer::RunMousePicking( if (codeName != codeShortName && !codeShortName.empty()) { // There is a unique long and short name for the code - hoverText = fmt::format("{}: {}", codeShortName, codeName); + hoverText = fmt::format( + "{}: {}\n{}", codeShortName, codeName, distanceHeightStr); } else { // Otherwise, only use the long name (always present) - hoverText = codeName; + hoverText = fmt::format("{}\n{}", codeName, distanceHeightStr); } // Show the tooltip @@ -439,17 +498,20 @@ bool RadarProductLayer::RunMousePicking( { // Don't display a units value that wasn't intended to be // displayed - hoverText = fmt::format("{}{}", f, suffix); + hoverText = + fmt::format("{}{}\n{}", f, suffix, distanceHeightStr); } else if (std::isalpha(static_cast(units.at(0)))) { // dBZ, Kts, etc. - hoverText = fmt::format("{} {}{}", f, units, suffix); + hoverText = fmt::format( + "{} {}{}\n{}", f, units, suffix, distanceHeightStr); } else { // %, etc. - hoverText = fmt::format("{}{}{}", f, units, suffix); + hoverText = fmt::format( + "{}{}{}\n{}", f, units, suffix, distanceHeightStr); } // Show the tooltip @@ -458,6 +520,12 @@ bool RadarProductLayer::RunMousePicking( itemPicked = true; } } + else + { + // Always show tooltip for distance and altitude + util::tooltip::Show(distanceHeightStr, mouseGlobalPos); + itemPicked = true; + } } return itemPicked; diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp index 65b53f14..67c0ed0e 100644 --- a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -10,6 +11,8 @@ #include #include +#include + namespace scwx { namespace qt @@ -23,11 +26,32 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); class RadarSiteLayer::Impl { public: - explicit Impl(RadarSiteLayer* self) : self_ {self} {} + explicit Impl(RadarSiteLayer* self, std::shared_ptr& context) : + self_ {self}, + geoLines_ {std::make_shared(context)} + { + geoLines_->StartLines(); + radarSiteLines_[0] = geoLines_->AddLine(); + radarSiteLines_[1] = geoLines_->AddLine(); + geoLines_->FinishLines(); + + static const boost::gil::rgba32f_pixel_t color0 {0.0f, 0.0f, 0.0f, 1.0f}; + static const boost::gil::rgba32f_pixel_t color1 {1.0f, 1.0f, 1.0f, 1.0f}; + static const float width = 1; + geoLines_->SetLineModulate(radarSiteLines_[0], color0); + geoLines_->SetLineWidth(radarSiteLines_[0], width + 2); + + geoLines_->SetLineModulate(radarSiteLines_[1], color1); + geoLines_->SetLineWidth(radarSiteLines_[1], width); + + self_->AddDrawItem(geoLines_); + geoLines_->set_thresholded(false); + } ~Impl() = default; void RenderRadarSite(const QMapLibre::CustomLayerRenderParameters& params, std::shared_ptr& radarSite); + void RenderRadarLine(); RadarSiteLayer* self_; @@ -41,10 +65,13 @@ public: float halfHeight_ {}; std::string hoverText_ {}; + + std::shared_ptr geoLines_; + std::array, 2> radarSiteLines_; }; RadarSiteLayer::RadarSiteLayer(std::shared_ptr context) : - DrawLayer(context, "RadarSiteLayer"), p(std::make_unique(this)) + DrawLayer(context, "RadarSiteLayer"), p(std::make_unique(this, context)) { } @@ -56,7 +83,7 @@ void RadarSiteLayer::Initialize() p->radarSites_ = config::RadarSite::GetAll(); - ImGuiInitialize(); + DrawLayer::Initialize(); } void RadarSiteLayer::Render( @@ -96,8 +123,12 @@ void RadarSiteLayer::Render( } ImGui::PopStyleVar(); - ImGuiFrameEnd(); + p->RenderRadarLine(); + + DrawLayer::RenderWithoutImGui(params); + + ImGuiFrameEnd(); SCWX_GL_CHECK_ERROR(); } @@ -163,6 +194,38 @@ void RadarSiteLayer::Impl::RenderRadarSite( } } +void RadarSiteLayer::Impl::RenderRadarLine() +{ + // TODO check if state is updated. + if ((QGuiApplication::keyboardModifiers() & + Qt::KeyboardModifier::ShiftModifier) && + self_->context()->radar_site() != nullptr) + { + const auto& mouseCoord = self_->context()->mouse_coordinate(); + const double radarLatitude = self_->context()->radar_site()->latitude(); + const double radarLongitude = self_->context()->radar_site()->longitude(); + + geoLines_->SetLineLocation(radarSiteLines_[0], + static_cast(mouseCoord.latitude_), + static_cast(mouseCoord.longitude_), + static_cast(radarLatitude), + static_cast(radarLongitude)); + geoLines_->SetLineVisible(radarSiteLines_[0], true); + + geoLines_->SetLineLocation(radarSiteLines_[1], + static_cast(mouseCoord.latitude_), + static_cast(mouseCoord.longitude_), + static_cast(radarLatitude), + static_cast(radarLongitude)); + geoLines_->SetLineVisible(radarSiteLines_[1], true); + } + else + { + geoLines_->SetLineVisible(radarSiteLines_[0], false); + geoLines_->SetLineVisible(radarSiteLines_[1], false); + } +} + void RadarSiteLayer::Deinitialize() { logger_->debug("Deinitialize()"); From ef197bf57889c3c485f9dcc7bde9a75af9efbfff Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 3 May 2025 10:24:02 -0400 Subject: [PATCH 5/6] Clang format/tidy fixes for radar_site_line --- scwx-qt/source/scwx/qt/map/radar_product_layer.cpp | 10 +++++----- scwx-qt/source/scwx/qt/map/radar_site_layer.cpp | 8 ++++---- scwx-qt/source/scwx/qt/util/geographic_lib.cpp | 2 +- scwx-qt/source/scwx/qt/util/geographic_lib.hpp | 1 - 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp index f305f4f7..0d2b7125 100644 --- a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp @@ -365,11 +365,11 @@ bool RadarProductLayer::RunMousePicking( const double radarLatitude = context()->radar_site()->latitude(); const double radarLongitude = context()->radar_site()->longitude(); - const auto distanceMeters = util::GeographicLib::GetDistance( - mouseGeoCoords.latitude_, - mouseGeoCoords.longitude_, - radarLatitude, - radarLongitude); + const auto distanceMeters = + util::GeographicLib::GetDistance(mouseGeoCoords.latitude_, + mouseGeoCoords.longitude_, + radarLatitude, + radarLongitude); const std::string distanceUnitName = settings::UnitSettings::Instance().distance_units().GetValue(); diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp index 67c0ed0e..3e2f3da8 100644 --- a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp @@ -27,8 +27,7 @@ class RadarSiteLayer::Impl { public: explicit Impl(RadarSiteLayer* self, std::shared_ptr& context) : - self_ {self}, - geoLines_ {std::make_shared(context)} + self_ {self}, geoLines_ {std::make_shared(context)} { geoLines_->StartLines(); radarSiteLines_[0] = geoLines_->AddLine(); @@ -37,7 +36,7 @@ public: static const boost::gil::rgba32f_pixel_t color0 {0.0f, 0.0f, 0.0f, 1.0f}; static const boost::gil::rgba32f_pixel_t color1 {1.0f, 1.0f, 1.0f, 1.0f}; - static const float width = 1; + static const float width = 1; geoLines_->SetLineModulate(radarSiteLines_[0], color0); geoLines_->SetLineWidth(radarSiteLines_[0], width + 2); @@ -71,7 +70,8 @@ public: }; RadarSiteLayer::RadarSiteLayer(std::shared_ptr context) : - DrawLayer(context, "RadarSiteLayer"), p(std::make_unique(this, context)) + DrawLayer(context, "RadarSiteLayer"), + p(std::make_unique(this, context)) { } diff --git a/scwx-qt/source/scwx/qt/util/geographic_lib.cpp b/scwx-qt/source/scwx/qt/util/geographic_lib.cpp index 8181f34c..1e5fa5e7 100644 --- a/scwx-qt/source/scwx/qt/util/geographic_lib.cpp +++ b/scwx-qt/source/scwx/qt/util/geographic_lib.cpp @@ -295,7 +295,7 @@ GetRadarBeamAltititude(units::length::meters range, units::angle::degrees elevation, units::length::meters height) { - static const units::length::meters earthRadius {6367444 * 4/3}; + static const units::length::meters earthRadius {6367444 * 4 / 3}; height += earthRadius; diff --git a/scwx-qt/source/scwx/qt/util/geographic_lib.hpp b/scwx-qt/source/scwx/qt/util/geographic_lib.hpp index 1d6cc38e..d34f2aeb 100644 --- a/scwx-qt/source/scwx/qt/util/geographic_lib.hpp +++ b/scwx-qt/source/scwx/qt/util/geographic_lib.hpp @@ -135,7 +135,6 @@ GetRadarBeamAltititude(units::length::meters range, units::angle::degrees elevation, units::length::meters height); - } // namespace GeographicLib } // namespace util } // namespace qt From 4f58827c96b23e3666282b3f97911ddc108aad8e Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 4 May 2025 10:36:00 -0400 Subject: [PATCH 6/6] Move initialization for radar site lines to correct location --- .../source/scwx/qt/map/radar_site_layer.cpp | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp index 3e2f3da8..6a9f6d1a 100644 --- a/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_site_layer.cpp @@ -29,22 +29,6 @@ public: explicit Impl(RadarSiteLayer* self, std::shared_ptr& context) : self_ {self}, geoLines_ {std::make_shared(context)} { - geoLines_->StartLines(); - radarSiteLines_[0] = geoLines_->AddLine(); - radarSiteLines_[1] = geoLines_->AddLine(); - geoLines_->FinishLines(); - - static const boost::gil::rgba32f_pixel_t color0 {0.0f, 0.0f, 0.0f, 1.0f}; - static const boost::gil::rgba32f_pixel_t color1 {1.0f, 1.0f, 1.0f, 1.0f}; - static const float width = 1; - geoLines_->SetLineModulate(radarSiteLines_[0], color0); - geoLines_->SetLineWidth(radarSiteLines_[0], width + 2); - - geoLines_->SetLineModulate(radarSiteLines_[1], color1); - geoLines_->SetLineWidth(radarSiteLines_[1], width); - - self_->AddDrawItem(geoLines_); - geoLines_->set_thresholded(false); } ~Impl() = default; @@ -66,7 +50,8 @@ public: std::string hoverText_ {}; std::shared_ptr geoLines_; - std::array, 2> radarSiteLines_; + std::array, 2> radarSiteLines_ { + nullptr, nullptr}; }; RadarSiteLayer::RadarSiteLayer(std::shared_ptr context) : @@ -83,6 +68,23 @@ void RadarSiteLayer::Initialize() p->radarSites_ = config::RadarSite::GetAll(); + p->geoLines_->StartLines(); + p->radarSiteLines_[0] = p->geoLines_->AddLine(); + p->radarSiteLines_[1] = p->geoLines_->AddLine(); + p->geoLines_->FinishLines(); + + static const boost::gil::rgba32f_pixel_t color0 {0.0f, 0.0f, 0.0f, 1.0f}; + static const boost::gil::rgba32f_pixel_t color1 {1.0f, 1.0f, 1.0f, 1.0f}; + static const float width = 1; + p->geoLines_->SetLineModulate(p->radarSiteLines_[0], color0); + p->geoLines_->SetLineWidth(p->radarSiteLines_[0], width + 2); + + p->geoLines_->SetLineModulate(p->radarSiteLines_[1], color1); + p->geoLines_->SetLineWidth(p->radarSiteLines_[1], width); + + AddDrawItem(p->geoLines_); + p->geoLines_->set_thresholded(false); + DrawLayer::Initialize(); } @@ -196,7 +198,6 @@ void RadarSiteLayer::Impl::RenderRadarSite( void RadarSiteLayer::Impl::RenderRadarLine() { - // TODO check if state is updated. if ((QGuiApplication::keyboardModifiers() & Qt::KeyboardModifier::ShiftModifier) && self_->context()->radar_site() != nullptr)