From 24f5f0a3e34612f7e53648759c055f5939dbf2a6 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 13 Apr 2025 10:59:41 -0400 Subject: [PATCH] Do not display an elevation number when there is non --- scwx-qt/source/scwx/qt/map/map_widget.cpp | 4 +- scwx-qt/source/scwx/qt/map/map_widget.hpp | 3 +- scwx-qt/source/scwx/qt/map/overlay_layer.cpp | 23 +++-- .../scwx/qt/ui/level2_settings_widget.cpp | 4 +- .../scwx/qt/view/level2_product_view.cpp | 2 +- .../scwx/qt/view/level2_product_view.hpp | 63 ++++++------ .../scwx/qt/view/level3_radial_view.cpp | 9 +- .../scwx/qt/view/level3_radial_view.hpp | 25 +++-- .../scwx/qt/view/radar_product_view.cpp | 4 +- .../scwx/qt/view/radar_product_view.hpp | 69 ++++++------- .../wsr88d/rpg/product_description_block.hpp | 98 +++++++++---------- .../wsr88d/rpg/product_description_block.cpp | 7 +- 12 files changed, 166 insertions(+), 145 deletions(-) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 55813bb4..60c50a98 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -615,7 +615,7 @@ common::Level3ProductCategoryMap MapWidget::GetAvailableLevel3Categories() } } -float MapWidget::GetElevation() const +std::optional MapWidget::GetElevation() const { auto radarProductView = p->context_->radar_product_view(); @@ -625,7 +625,7 @@ float MapWidget::GetElevation() const } else { - return 0.0f; + return {}; } } diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 23d38680..6764629e 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -9,6 +9,7 @@ #include #include +#include #include @@ -41,7 +42,7 @@ public: [[nodiscard]] common::Level3ProductCategoryMap GetAvailableLevel3Categories(); - [[nodiscard]] float GetElevation() const; + [[nodiscard]] std::optional GetElevation() const; [[nodiscard]] std::vector GetElevationCuts() const; [[nodiscard]] std::vector GetLevel3Products(); [[nodiscard]] std::string GetMapStyle() const; diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 7c3c22a9..ba692aae 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -428,21 +428,30 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) { // Render product name const std::string productName = radarProductView->GetRadarProductName(); - const float elevation = radarProductView->elevation(); + const std::optional elevation = radarProductView->elevation(); if (productName.length() > 0 && !productName.starts_with('?')) { - const std::string elevationString = - (QString::number(elevation, 'f', 1) + common::Characters::DEGREE) - .toStdString(); - ImGui::SetNextWindowPos(ImVec2 {0.0f, 0.0f}); ImGui::Begin("Product Name", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize); - ImGui::TextUnformatted( - fmt::format("{} ({})", productName, elevationString).c_str()); + + if (elevation.has_value()) + { + const std::string elevationString = + (QString::number(*elevation, 'f', 1) + + common::Characters::DEGREE) + .toStdString(); + ImGui::TextUnformatted( + fmt::format("{} ({})", productName, elevationString).c_str()); + } + else + { + ImGui::TextUnformatted(productName.c_str()); + } + ImGui::End(); } } diff --git a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp index 85b476c9..0289ee54 100644 --- a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp @@ -242,7 +242,9 @@ void Level2SettingsWidget::UpdateElevationSelection(float elevation) void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) { - float currentElevation = activeMap->GetElevation(); + std::optional currentElevationOption = activeMap->GetElevation(); + float currentElevation = + currentElevationOption.has_value() ? *currentElevationOption : 0.0f; std::vector elevationCuts = activeMap->GetElevationCuts(); if (p->elevationCuts_ != elevationCuts) diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index 4e7181e7..6fcc775c 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -271,7 +271,7 @@ uint16_t Level2ProductView::color_table_max() const } } -float Level2ProductView::elevation() const +std::optional Level2ProductView::elevation() const { return p->elevationCut_; } diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp index db8fc45c..64651bfa 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -8,11 +8,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class Level2ProductView : public RadarProductView @@ -23,38 +19,47 @@ public: explicit Level2ProductView( common::Level2Product product, std::shared_ptr radarProductManager); - ~Level2ProductView(); + ~Level2ProductView() override; - std::shared_ptr color_table() const override; - const std::vector& - color_table_lut() const override; - std::uint16_t color_table_min() const override; - std::uint16_t color_table_max() const override; - float elevation() const override; - float range() const override; - std::chrono::system_clock::time_point sweep_time() const override; - float unit_scale() const override; - std::string units() const override; - std::uint16_t vcp() const override; - const std::vector& vertices() const override; + Level2ProductView(const Level2ProductView&) = delete; + Level2ProductView(Level2ProductView&&) = delete; + Level2ProductView& operator=(const Level2ProductView&) = delete; + Level2ProductView& operator=(Level2ProductView&&) = delete; + + [[nodiscard]] std::shared_ptr + color_table() const override; + [[nodiscard]] const std::vector& + color_table_lut() const override; + [[nodiscard]] std::uint16_t color_table_min() const override; + [[nodiscard]] std::uint16_t color_table_max() const override; + [[nodiscard]] std::optional elevation() const override; + [[nodiscard]] float range() const override; + [[nodiscard]] std::chrono::system_clock::time_point + sweep_time() const override; + [[nodiscard]] float unit_scale() const override; + [[nodiscard]] std::string units() const override; + [[nodiscard]] std::uint16_t vcp() const override; + [[nodiscard]] const std::vector& vertices() const override; void LoadColorTable(std::shared_ptr colorTable) override; void SelectElevation(float elevation) override; void SelectProduct(const std::string& productName) override; - common::RadarProductGroup GetRadarProductGroup() const override; - std::string GetRadarProductName() const override; - std::vector GetElevationCuts() const override; - std::tuple + [[nodiscard]] common::RadarProductGroup + GetRadarProductGroup() const override; + [[nodiscard]] std::string GetRadarProductName() const override; + [[nodiscard]] std::vector GetElevationCuts() const override; + [[nodiscard]] std::tuple GetMomentData() const override; - std::tuple + [[nodiscard]] std::tuple GetCfpMomentData() const override; - std::optional + [[nodiscard]] std::optional GetBinLevel(const common::Coordinate& coordinate) const override; - std::optional - GetDataLevelCode(std::uint16_t level) const override; - std::optional GetDataValue(std::uint16_t level) const override; + [[nodiscard]] std::optional + GetDataLevelCode(std::uint16_t level) const override; + [[nodiscard]] std::optional + GetDataValue(std::uint16_t level) const override; static std::shared_ptr Create(common::Level2Product product, @@ -75,6 +80,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp index 05409e68..c01e0cd4 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -67,7 +67,7 @@ public: float latitude_; float longitude_; - float elevation_; + std::optional elevation_ {}; float range_; std::uint16_t vcp_; @@ -92,7 +92,7 @@ boost::asio::thread_pool& Level3RadialView::thread_pool() return p->threadPool_; } -float Level3RadialView::elevation() const +std::optional Level3RadialView::elevation() const { return p->elevation_; } @@ -312,7 +312,10 @@ void Level3RadialView::ComputeSweep() p->latitude_ = descriptionBlock->latitude_of_radar(); p->longitude_ = descriptionBlock->longitude_of_radar(); p->range_ = descriptionBlock->range(); - p->elevation_ = static_cast(descriptionBlock->elevation().value()); + p->elevation_ = + descriptionBlock->has_elevation() ? + static_cast(descriptionBlock->elevation().value()) : + std::optional {}; p->sweepTime_ = scwx::util::TimePoint(descriptionBlock->volume_scan_date(), descriptionBlock->volume_scan_start_time() * 1000); diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp index 9f6c0a3d..86d550e6 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -6,11 +6,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class Level3RadialView : public Level3ProductView @@ -21,19 +17,24 @@ public: explicit Level3RadialView( const std::string& product, std::shared_ptr radarProductManager); - ~Level3RadialView(); + ~Level3RadialView() override; - [[nodiscard]] float elevation() const override; - [[nodiscard]] float range() const override; + Level3RadialView(const Level3RadialView&) = delete; + Level3RadialView(Level3RadialView&&) = delete; + Level3RadialView& operator=(const Level3RadialView&) = delete; + Level3RadialView& operator=(Level3RadialView&&) = delete; + + [[nodiscard]] std::optional elevation() const override; + [[nodiscard]] float range() const override; [[nodiscard]] std::chrono::system_clock::time_point sweep_time() const override; [[nodiscard]] std::uint16_t vcp() const override; [[nodiscard]] const std::vector& vertices() const override; - std::tuple + [[nodiscard]] std::tuple GetMomentData() const override; - std::optional + [[nodiscard]] std::optional GetBinLevel(const common::Coordinate& coordinate) const override; static std::shared_ptr @@ -51,6 +52,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp index 9c5a84de..dc50383c 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -85,9 +85,9 @@ std::uint16_t RadarProductView::color_table_max() const return kDefaultColorTableMax_; } -float RadarProductView::elevation() const +std::optional RadarProductView::elevation() const { - return 0.0f; + return {}; } std::shared_ptr diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp index 31d47840..2801b74e 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -16,11 +16,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace view +namespace scwx::qt::view { class RadarProductViewImpl; @@ -32,20 +28,27 @@ class RadarProductView : public QObject public: explicit RadarProductView( std::shared_ptr radarProductManager); - virtual ~RadarProductView(); + ~RadarProductView() override; - virtual std::shared_ptr color_table() const = 0; - virtual const std::vector& - color_table_lut() const; - virtual std::uint16_t color_table_min() const; - virtual std::uint16_t color_table_max() const; - virtual float elevation() const; - virtual float range() const; - virtual std::chrono::system_clock::time_point sweep_time() const; - virtual float unit_scale() const = 0; - virtual std::string units() const = 0; - virtual std::uint16_t vcp() const = 0; - virtual const std::vector& vertices() const = 0; + RadarProductView(const RadarProductView&) = delete; + RadarProductView(RadarProductView&&) = delete; + RadarProductView& operator=(const RadarProductView&) = delete; + RadarProductView& operator=(RadarProductView&&) = delete; + + [[nodiscard]] virtual std::shared_ptr + color_table() const = 0; + [[nodiscard]] virtual const std::vector& + color_table_lut() const; + [[nodiscard]] virtual std::uint16_t color_table_min() const; + [[nodiscard]] virtual std::uint16_t color_table_max() const; + [[nodiscard]] virtual std::optional elevation() const; + [[nodiscard]] virtual float range() const; + [[nodiscard]] virtual std::chrono::system_clock::time_point + sweep_time() const; + [[nodiscard]] virtual float unit_scale() const = 0; + [[nodiscard]] virtual std::string units() const = 0; + [[nodiscard]] virtual std::uint16_t vcp() const = 0; + [[nodiscard]] virtual const std::vector& vertices() const = 0; [[nodiscard]] std::shared_ptr radar_product_manager() const; @@ -66,24 +69,26 @@ public: void SelectTime(std::chrono::system_clock::time_point time); void Update(); - bool IsInitialized() const; + [[nodiscard]] bool IsInitialized() const; - virtual common::RadarProductGroup GetRadarProductGroup() const = 0; - virtual std::string GetRadarProductName() const = 0; - virtual std::vector GetElevationCuts() const; - virtual std::tuple + [[nodiscard]] virtual common::RadarProductGroup + GetRadarProductGroup() const = 0; + [[nodiscard]] virtual std::string GetRadarProductName() const = 0; + [[nodiscard]] virtual std::vector GetElevationCuts() const; + [[nodiscard]] virtual std::tuple GetMomentData() const = 0; - virtual std::tuple + [[nodiscard]] virtual std::tuple GetCfpMomentData() const; - virtual std::optional + [[nodiscard]] virtual std::optional GetBinLevel(const common::Coordinate& coordinate) const = 0; - virtual std::optional - GetDataLevelCode(std::uint16_t level) const = 0; - virtual std::optional GetDataValue(std::uint16_t level) const = 0; - virtual bool IgnoreUnits() const; + [[nodiscard]] virtual std::optional + GetDataLevelCode(std::uint16_t level) const = 0; + [[nodiscard]] virtual std::optional + GetDataValue(std::uint16_t level) const = 0; + [[nodiscard]] virtual bool IgnoreUnits() const; - virtual std::vector> + [[nodiscard]] virtual std::vector> GetDescriptionFields() const; protected: @@ -105,6 +110,4 @@ private: std::unique_ptr p; }; -} // namespace view -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::view diff --git a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp index 1182828a..30bdfdf2 100644 --- a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp @@ -9,11 +9,7 @@ #include -namespace scwx -{ -namespace wsr88d -{ -namespace rpg +namespace scwx::wsr88d::rpg { class ProductDescriptionBlockImpl; @@ -22,7 +18,7 @@ class ProductDescriptionBlock : public awips::Message { public: explicit ProductDescriptionBlock(); - ~ProductDescriptionBlock(); + ~ProductDescriptionBlock() override; ProductDescriptionBlock(const ProductDescriptionBlock&) = delete; ProductDescriptionBlock& operator=(const ProductDescriptionBlock&) = delete; @@ -30,57 +26,59 @@ public: ProductDescriptionBlock(ProductDescriptionBlock&&) noexcept; ProductDescriptionBlock& operator=(ProductDescriptionBlock&&) noexcept; - int16_t block_divider() const; - float latitude_of_radar() const; - float longitude_of_radar() const; - int16_t height_of_radar() const; - int16_t product_code() const; - uint16_t operational_mode() const; - uint16_t volume_coverage_pattern() const; - int16_t sequence_number() const; - uint16_t volume_scan_number() const; - uint16_t volume_scan_date() const; - uint32_t volume_scan_start_time() const; - uint16_t generation_date_of_product() const; - uint32_t generation_time_of_product() const; - uint16_t elevation_number() const; - uint16_t data_level_threshold(size_t i) const; - uint8_t version() const; - uint8_t spot_blank() const; - uint32_t offset_to_symbology() const; - uint32_t offset_to_graphic() const; - uint32_t offset_to_tabular() const; + [[nodiscard]] int16_t block_divider() const; + [[nodiscard]] float latitude_of_radar() const; + [[nodiscard]] float longitude_of_radar() const; + [[nodiscard]] int16_t height_of_radar() const; + [[nodiscard]] int16_t product_code() const; + [[nodiscard]] uint16_t operational_mode() const; + [[nodiscard]] uint16_t volume_coverage_pattern() const; + [[nodiscard]] int16_t sequence_number() const; + [[nodiscard]] uint16_t volume_scan_number() const; + [[nodiscard]] uint16_t volume_scan_date() const; + [[nodiscard]] uint32_t volume_scan_start_time() const; + [[nodiscard]] uint16_t generation_date_of_product() const; + [[nodiscard]] uint32_t generation_time_of_product() const; + [[nodiscard]] uint16_t elevation_number() const; + [[nodiscard]] uint16_t data_level_threshold(size_t i) const; + [[nodiscard]] uint8_t version() const; + [[nodiscard]] uint8_t spot_blank() const; + [[nodiscard]] uint32_t offset_to_symbology() const; + [[nodiscard]] uint32_t offset_to_graphic() const; + [[nodiscard]] uint32_t offset_to_tabular() const; - float range() const; - uint16_t range_raw() const; - float x_resolution() const; - uint16_t x_resolution_raw() const; - float y_resolution() const; - uint16_t y_resolution_raw() const; + [[nodiscard]] float range() const; + [[nodiscard]] uint16_t range_raw() const; + [[nodiscard]] float x_resolution() const; + [[nodiscard]] uint16_t x_resolution_raw() const; + [[nodiscard]] float y_resolution() const; + [[nodiscard]] uint16_t y_resolution_raw() const; - uint16_t threshold() const; - float offset() const; - float scale() const; - uint16_t number_of_levels() const; + [[nodiscard]] uint16_t threshold() const; + [[nodiscard]] float offset() const; + [[nodiscard]] float scale() const; + [[nodiscard]] uint16_t number_of_levels() const; - std::optional data_level_code(std::uint8_t level) const; - std::optional data_value(std::uint8_t level) const; + [[nodiscard]] std::optional + data_level_code(std::uint8_t level) const; + [[nodiscard]] std::optional data_value(std::uint8_t level) const; - std::uint16_t log_start() const; - float log_offset() const; - float log_scale() const; + [[nodiscard]] std::uint16_t log_start() const; + [[nodiscard]] float log_offset() const; + [[nodiscard]] float log_scale() const; - float gr_scale() const; + [[nodiscard]] float gr_scale() const; - std::uint8_t data_mask() const; - std::uint8_t topped_mask() const; + [[nodiscard]] std::uint8_t data_mask() const; + [[nodiscard]] std::uint8_t topped_mask() const; - units::angle::degrees elevation() const; + [[nodiscard]] units::angle::degrees elevation() const; + [[nodiscard]] bool has_elevation() const; - bool IsCompressionEnabled() const; - bool IsDataLevelCoded() const; + [[nodiscard]] bool IsCompressionEnabled() const; + [[nodiscard]] bool IsDataLevelCoded() const; - size_t data_size() const override; + [[nodiscard]] size_t data_size() const override; bool Parse(std::istream& is) override; @@ -90,6 +88,4 @@ private: std::unique_ptr p; }; -} // namespace rpg -} // namespace wsr88d -} // namespace scwx +} // namespace scwx::wsr88d::rpg diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 1fc80d04..10fdbe72 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -724,7 +724,7 @@ units::angle::degrees ProductDescriptionBlock::elevation() const { double elevation = 0.0; - if (p->elevationNumber_ > 0) + if (has_elevation()) { // Elevation is given in tenths of a degree // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers) @@ -734,6 +734,11 @@ units::angle::degrees ProductDescriptionBlock::elevation() const return units::angle::degrees {elevation}; } +bool ProductDescriptionBlock::has_elevation() const +{ + return p->elevationNumber_ > 0; +} + bool ProductDescriptionBlock::IsCompressionEnabled() const { bool isCompressed = false;