Do not display an elevation number when there is non

This commit is contained in:
AdenKoperczak 2025-04-13 10:59:41 -04:00
parent 484c08c455
commit 24f5f0a3e3
No known key found for this signature in database
GPG key ID: 9843017036F62EE7
12 changed files with 166 additions and 145 deletions

View file

@ -615,7 +615,7 @@ common::Level3ProductCategoryMap MapWidget::GetAvailableLevel3Categories()
} }
} }
float MapWidget::GetElevation() const std::optional<float> MapWidget::GetElevation() const
{ {
auto radarProductView = p->context_->radar_product_view(); auto radarProductView = p->context_->radar_product_view();
@ -625,7 +625,7 @@ float MapWidget::GetElevation() const
} }
else else
{ {
return 0.0f; return {};
} }
} }

View file

@ -9,6 +9,7 @@
#include <chrono> #include <chrono>
#include <memory> #include <memory>
#include <optional>
#include <qmaplibre.hpp> #include <qmaplibre.hpp>
@ -41,7 +42,7 @@ public:
[[nodiscard]] common::Level3ProductCategoryMap [[nodiscard]] common::Level3ProductCategoryMap
GetAvailableLevel3Categories(); GetAvailableLevel3Categories();
[[nodiscard]] float GetElevation() const; [[nodiscard]] std::optional<float> GetElevation() const;
[[nodiscard]] std::vector<float> GetElevationCuts() const; [[nodiscard]] std::vector<float> GetElevationCuts() const;
[[nodiscard]] std::vector<std::string> GetLevel3Products(); [[nodiscard]] std::vector<std::string> GetLevel3Products();
[[nodiscard]] std::string GetMapStyle() const; [[nodiscard]] std::string GetMapStyle() const;

View file

@ -428,21 +428,30 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params)
{ {
// Render product name // Render product name
const std::string productName = radarProductView->GetRadarProductName(); const std::string productName = radarProductView->GetRadarProductName();
const float elevation = radarProductView->elevation(); const std::optional<float> elevation = radarProductView->elevation();
if (productName.length() > 0 && !productName.starts_with('?')) 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::SetNextWindowPos(ImVec2 {0.0f, 0.0f});
ImGui::Begin("Product Name", ImGui::Begin("Product Name",
nullptr, nullptr,
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_AlwaysAutoResize); 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(); ImGui::End();
} }
} }

View file

@ -242,7 +242,9 @@ void Level2SettingsWidget::UpdateElevationSelection(float elevation)
void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap)
{ {
float currentElevation = activeMap->GetElevation(); std::optional<float> currentElevationOption = activeMap->GetElevation();
float currentElevation =
currentElevationOption.has_value() ? *currentElevationOption : 0.0f;
std::vector<float> elevationCuts = activeMap->GetElevationCuts(); std::vector<float> elevationCuts = activeMap->GetElevationCuts();
if (p->elevationCuts_ != elevationCuts) if (p->elevationCuts_ != elevationCuts)

View file

@ -271,7 +271,7 @@ uint16_t Level2ProductView::color_table_max() const
} }
} }
float Level2ProductView::elevation() const std::optional<float> Level2ProductView::elevation() const
{ {
return p->elevationCut_; return p->elevationCut_;
} }

View file

@ -8,11 +8,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
namespace scwx namespace scwx::qt::view
{
namespace qt
{
namespace view
{ {
class Level2ProductView : public RadarProductView class Level2ProductView : public RadarProductView
@ -23,38 +19,47 @@ public:
explicit Level2ProductView( explicit Level2ProductView(
common::Level2Product product, common::Level2Product product,
std::shared_ptr<manager::RadarProductManager> radarProductManager); std::shared_ptr<manager::RadarProductManager> radarProductManager);
~Level2ProductView(); ~Level2ProductView() override;
std::shared_ptr<common::ColorTable> color_table() const override; Level2ProductView(const Level2ProductView&) = delete;
const std::vector<boost::gil::rgba8_pixel_t>& Level2ProductView(Level2ProductView&&) = delete;
color_table_lut() const override; Level2ProductView& operator=(const Level2ProductView&) = delete;
std::uint16_t color_table_min() const override; Level2ProductView& operator=(Level2ProductView&&) = delete;
std::uint16_t color_table_max() const override;
float elevation() const override; [[nodiscard]] std::shared_ptr<common::ColorTable>
float range() const override; color_table() const override;
std::chrono::system_clock::time_point sweep_time() const override; [[nodiscard]] const std::vector<boost::gil::rgba8_pixel_t>&
float unit_scale() const override; color_table_lut() const override;
std::string units() const override; [[nodiscard]] std::uint16_t color_table_min() const override;
std::uint16_t vcp() const override; [[nodiscard]] std::uint16_t color_table_max() const override;
const std::vector<float>& vertices() const override; [[nodiscard]] std::optional<float> 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<float>& vertices() const override;
void LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) override; void LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) override;
void SelectElevation(float elevation) override; void SelectElevation(float elevation) override;
void SelectProduct(const std::string& productName) override; void SelectProduct(const std::string& productName) override;
common::RadarProductGroup GetRadarProductGroup() const override; [[nodiscard]] common::RadarProductGroup
std::string GetRadarProductName() const override; GetRadarProductGroup() const override;
std::vector<float> GetElevationCuts() const override; [[nodiscard]] std::string GetRadarProductName() const override;
std::tuple<const void*, std::size_t, std::size_t> [[nodiscard]] std::vector<float> GetElevationCuts() const override;
[[nodiscard]] std::tuple<const void*, std::size_t, std::size_t>
GetMomentData() const override; GetMomentData() const override;
std::tuple<const void*, std::size_t, std::size_t> [[nodiscard]] std::tuple<const void*, std::size_t, std::size_t>
GetCfpMomentData() const override; GetCfpMomentData() const override;
std::optional<std::uint16_t> [[nodiscard]] std::optional<std::uint16_t>
GetBinLevel(const common::Coordinate& coordinate) const override; GetBinLevel(const common::Coordinate& coordinate) const override;
std::optional<wsr88d::DataLevelCode> [[nodiscard]] std::optional<wsr88d::DataLevelCode>
GetDataLevelCode(std::uint16_t level) const override; GetDataLevelCode(std::uint16_t level) const override;
std::optional<float> GetDataValue(std::uint16_t level) const override; [[nodiscard]] std::optional<float>
GetDataValue(std::uint16_t level) const override;
static std::shared_ptr<Level2ProductView> static std::shared_ptr<Level2ProductView>
Create(common::Level2Product product, Create(common::Level2Product product,
@ -75,6 +80,4 @@ private:
std::unique_ptr<Impl> p; std::unique_ptr<Impl> p;
}; };
} // namespace view } // namespace scwx::qt::view
} // namespace qt
} // namespace scwx

View file

@ -67,7 +67,7 @@ public:
float latitude_; float latitude_;
float longitude_; float longitude_;
float elevation_; std::optional<float> elevation_ {};
float range_; float range_;
std::uint16_t vcp_; std::uint16_t vcp_;
@ -92,7 +92,7 @@ boost::asio::thread_pool& Level3RadialView::thread_pool()
return p->threadPool_; return p->threadPool_;
} }
float Level3RadialView::elevation() const std::optional<float> Level3RadialView::elevation() const
{ {
return p->elevation_; return p->elevation_;
} }
@ -312,7 +312,10 @@ void Level3RadialView::ComputeSweep()
p->latitude_ = descriptionBlock->latitude_of_radar(); p->latitude_ = descriptionBlock->latitude_of_radar();
p->longitude_ = descriptionBlock->longitude_of_radar(); p->longitude_ = descriptionBlock->longitude_of_radar();
p->range_ = descriptionBlock->range(); p->range_ = descriptionBlock->range();
p->elevation_ = static_cast<float>(descriptionBlock->elevation().value()); p->elevation_ =
descriptionBlock->has_elevation() ?
static_cast<float>(descriptionBlock->elevation().value()) :
std::optional<float> {};
p->sweepTime_ = p->sweepTime_ =
scwx::util::TimePoint(descriptionBlock->volume_scan_date(), scwx::util::TimePoint(descriptionBlock->volume_scan_date(),
descriptionBlock->volume_scan_start_time() * 1000); descriptionBlock->volume_scan_start_time() * 1000);

View file

@ -6,11 +6,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
namespace scwx namespace scwx::qt::view
{
namespace qt
{
namespace view
{ {
class Level3RadialView : public Level3ProductView class Level3RadialView : public Level3ProductView
@ -21,19 +17,24 @@ public:
explicit Level3RadialView( explicit Level3RadialView(
const std::string& product, const std::string& product,
std::shared_ptr<manager::RadarProductManager> radarProductManager); std::shared_ptr<manager::RadarProductManager> radarProductManager);
~Level3RadialView(); ~Level3RadialView() override;
[[nodiscard]] float elevation() const override; Level3RadialView(const Level3RadialView&) = delete;
[[nodiscard]] float range() const override; Level3RadialView(Level3RadialView&&) = delete;
Level3RadialView& operator=(const Level3RadialView&) = delete;
Level3RadialView& operator=(Level3RadialView&&) = delete;
[[nodiscard]] std::optional<float> elevation() const override;
[[nodiscard]] float range() const override;
[[nodiscard]] std::chrono::system_clock::time_point [[nodiscard]] std::chrono::system_clock::time_point
sweep_time() const override; sweep_time() const override;
[[nodiscard]] std::uint16_t vcp() const override; [[nodiscard]] std::uint16_t vcp() const override;
[[nodiscard]] const std::vector<float>& vertices() const override; [[nodiscard]] const std::vector<float>& vertices() const override;
std::tuple<const void*, std::size_t, std::size_t> [[nodiscard]] std::tuple<const void*, std::size_t, std::size_t>
GetMomentData() const override; GetMomentData() const override;
std::optional<std::uint16_t> [[nodiscard]] std::optional<std::uint16_t>
GetBinLevel(const common::Coordinate& coordinate) const override; GetBinLevel(const common::Coordinate& coordinate) const override;
static std::shared_ptr<Level3RadialView> static std::shared_ptr<Level3RadialView>
@ -51,6 +52,4 @@ private:
std::unique_ptr<Impl> p; std::unique_ptr<Impl> p;
}; };
} // namespace view } // namespace scwx::qt::view
} // namespace qt
} // namespace scwx

View file

@ -85,9 +85,9 @@ std::uint16_t RadarProductView::color_table_max() const
return kDefaultColorTableMax_; return kDefaultColorTableMax_;
} }
float RadarProductView::elevation() const std::optional<float> RadarProductView::elevation() const
{ {
return 0.0f; return {};
} }
std::shared_ptr<manager::RadarProductManager> std::shared_ptr<manager::RadarProductManager>

View file

@ -16,11 +16,7 @@
#include <QObject> #include <QObject>
#include <boost/asio/thread_pool.hpp> #include <boost/asio/thread_pool.hpp>
namespace scwx namespace scwx::qt::view
{
namespace qt
{
namespace view
{ {
class RadarProductViewImpl; class RadarProductViewImpl;
@ -32,20 +28,27 @@ class RadarProductView : public QObject
public: public:
explicit RadarProductView( explicit RadarProductView(
std::shared_ptr<manager::RadarProductManager> radarProductManager); std::shared_ptr<manager::RadarProductManager> radarProductManager);
virtual ~RadarProductView(); ~RadarProductView() override;
virtual std::shared_ptr<common::ColorTable> color_table() const = 0; RadarProductView(const RadarProductView&) = delete;
virtual const std::vector<boost::gil::rgba8_pixel_t>& RadarProductView(RadarProductView&&) = delete;
color_table_lut() const; RadarProductView& operator=(const RadarProductView&) = delete;
virtual std::uint16_t color_table_min() const; RadarProductView& operator=(RadarProductView&&) = delete;
virtual std::uint16_t color_table_max() const;
virtual float elevation() const; [[nodiscard]] virtual std::shared_ptr<common::ColorTable>
virtual float range() const; color_table() const = 0;
virtual std::chrono::system_clock::time_point sweep_time() const; [[nodiscard]] virtual const std::vector<boost::gil::rgba8_pixel_t>&
virtual float unit_scale() const = 0; color_table_lut() const;
virtual std::string units() const = 0; [[nodiscard]] virtual std::uint16_t color_table_min() const;
virtual std::uint16_t vcp() const = 0; [[nodiscard]] virtual std::uint16_t color_table_max() const;
virtual const std::vector<float>& vertices() const = 0; [[nodiscard]] virtual std::optional<float> 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<float>& vertices() const = 0;
[[nodiscard]] std::shared_ptr<manager::RadarProductManager> [[nodiscard]] std::shared_ptr<manager::RadarProductManager>
radar_product_manager() const; radar_product_manager() const;
@ -66,24 +69,26 @@ public:
void SelectTime(std::chrono::system_clock::time_point time); void SelectTime(std::chrono::system_clock::time_point time);
void Update(); void Update();
bool IsInitialized() const; [[nodiscard]] bool IsInitialized() const;
virtual common::RadarProductGroup GetRadarProductGroup() const = 0; [[nodiscard]] virtual common::RadarProductGroup
virtual std::string GetRadarProductName() const = 0; GetRadarProductGroup() const = 0;
virtual std::vector<float> GetElevationCuts() const; [[nodiscard]] virtual std::string GetRadarProductName() const = 0;
virtual std::tuple<const void*, std::size_t, std::size_t> [[nodiscard]] virtual std::vector<float> GetElevationCuts() const;
[[nodiscard]] virtual std::tuple<const void*, std::size_t, std::size_t>
GetMomentData() const = 0; GetMomentData() const = 0;
virtual std::tuple<const void*, std::size_t, std::size_t> [[nodiscard]] virtual std::tuple<const void*, std::size_t, std::size_t>
GetCfpMomentData() const; GetCfpMomentData() const;
virtual std::optional<std::uint16_t> [[nodiscard]] virtual std::optional<std::uint16_t>
GetBinLevel(const common::Coordinate& coordinate) const = 0; GetBinLevel(const common::Coordinate& coordinate) const = 0;
virtual std::optional<wsr88d::DataLevelCode> [[nodiscard]] virtual std::optional<wsr88d::DataLevelCode>
GetDataLevelCode(std::uint16_t level) const = 0; GetDataLevelCode(std::uint16_t level) const = 0;
virtual std::optional<float> GetDataValue(std::uint16_t level) const = 0; [[nodiscard]] virtual std::optional<float>
virtual bool IgnoreUnits() const; GetDataValue(std::uint16_t level) const = 0;
[[nodiscard]] virtual bool IgnoreUnits() const;
virtual std::vector<std::pair<std::string, std::string>> [[nodiscard]] virtual std::vector<std::pair<std::string, std::string>>
GetDescriptionFields() const; GetDescriptionFields() const;
protected: protected:
@ -105,6 +110,4 @@ private:
std::unique_ptr<RadarProductViewImpl> p; std::unique_ptr<RadarProductViewImpl> p;
}; };
} // namespace view } // namespace scwx::qt::view
} // namespace qt
} // namespace scwx

View file

@ -9,11 +9,7 @@
#include <units/angle.h> #include <units/angle.h>
namespace scwx namespace scwx::wsr88d::rpg
{
namespace wsr88d
{
namespace rpg
{ {
class ProductDescriptionBlockImpl; class ProductDescriptionBlockImpl;
@ -22,7 +18,7 @@ class ProductDescriptionBlock : public awips::Message
{ {
public: public:
explicit ProductDescriptionBlock(); explicit ProductDescriptionBlock();
~ProductDescriptionBlock(); ~ProductDescriptionBlock() override;
ProductDescriptionBlock(const ProductDescriptionBlock&) = delete; ProductDescriptionBlock(const ProductDescriptionBlock&) = delete;
ProductDescriptionBlock& operator=(const ProductDescriptionBlock&) = delete; ProductDescriptionBlock& operator=(const ProductDescriptionBlock&) = delete;
@ -30,57 +26,59 @@ public:
ProductDescriptionBlock(ProductDescriptionBlock&&) noexcept; ProductDescriptionBlock(ProductDescriptionBlock&&) noexcept;
ProductDescriptionBlock& operator=(ProductDescriptionBlock&&) noexcept; ProductDescriptionBlock& operator=(ProductDescriptionBlock&&) noexcept;
int16_t block_divider() const; [[nodiscard]] int16_t block_divider() const;
float latitude_of_radar() const; [[nodiscard]] float latitude_of_radar() const;
float longitude_of_radar() const; [[nodiscard]] float longitude_of_radar() const;
int16_t height_of_radar() const; [[nodiscard]] int16_t height_of_radar() const;
int16_t product_code() const; [[nodiscard]] int16_t product_code() const;
uint16_t operational_mode() const; [[nodiscard]] uint16_t operational_mode() const;
uint16_t volume_coverage_pattern() const; [[nodiscard]] uint16_t volume_coverage_pattern() const;
int16_t sequence_number() const; [[nodiscard]] int16_t sequence_number() const;
uint16_t volume_scan_number() const; [[nodiscard]] uint16_t volume_scan_number() const;
uint16_t volume_scan_date() const; [[nodiscard]] uint16_t volume_scan_date() const;
uint32_t volume_scan_start_time() const; [[nodiscard]] uint32_t volume_scan_start_time() const;
uint16_t generation_date_of_product() const; [[nodiscard]] uint16_t generation_date_of_product() const;
uint32_t generation_time_of_product() const; [[nodiscard]] uint32_t generation_time_of_product() const;
uint16_t elevation_number() const; [[nodiscard]] uint16_t elevation_number() const;
uint16_t data_level_threshold(size_t i) const; [[nodiscard]] uint16_t data_level_threshold(size_t i) const;
uint8_t version() const; [[nodiscard]] uint8_t version() const;
uint8_t spot_blank() const; [[nodiscard]] uint8_t spot_blank() const;
uint32_t offset_to_symbology() const; [[nodiscard]] uint32_t offset_to_symbology() const;
uint32_t offset_to_graphic() const; [[nodiscard]] uint32_t offset_to_graphic() const;
uint32_t offset_to_tabular() const; [[nodiscard]] uint32_t offset_to_tabular() const;
float range() const; [[nodiscard]] float range() const;
uint16_t range_raw() const; [[nodiscard]] uint16_t range_raw() const;
float x_resolution() const; [[nodiscard]] float x_resolution() const;
uint16_t x_resolution_raw() const; [[nodiscard]] uint16_t x_resolution_raw() const;
float y_resolution() const; [[nodiscard]] float y_resolution() const;
uint16_t y_resolution_raw() const; [[nodiscard]] uint16_t y_resolution_raw() const;
uint16_t threshold() const; [[nodiscard]] uint16_t threshold() const;
float offset() const; [[nodiscard]] float offset() const;
float scale() const; [[nodiscard]] float scale() const;
uint16_t number_of_levels() const; [[nodiscard]] uint16_t number_of_levels() const;
std::optional<DataLevelCode> data_level_code(std::uint8_t level) const; [[nodiscard]] std::optional<DataLevelCode>
std::optional<float> data_value(std::uint8_t level) const; data_level_code(std::uint8_t level) const;
[[nodiscard]] std::optional<float> data_value(std::uint8_t level) const;
std::uint16_t log_start() const; [[nodiscard]] std::uint16_t log_start() const;
float log_offset() const; [[nodiscard]] float log_offset() const;
float log_scale() const; [[nodiscard]] float log_scale() const;
float gr_scale() const; [[nodiscard]] float gr_scale() const;
std::uint8_t data_mask() const; [[nodiscard]] std::uint8_t data_mask() const;
std::uint8_t topped_mask() const; [[nodiscard]] std::uint8_t topped_mask() const;
units::angle::degrees<double> elevation() const; [[nodiscard]] units::angle::degrees<double> elevation() const;
[[nodiscard]] bool has_elevation() const;
bool IsCompressionEnabled() const; [[nodiscard]] bool IsCompressionEnabled() const;
bool IsDataLevelCoded() const; [[nodiscard]] bool IsDataLevelCoded() const;
size_t data_size() const override; [[nodiscard]] size_t data_size() const override;
bool Parse(std::istream& is) override; bool Parse(std::istream& is) override;
@ -90,6 +88,4 @@ private:
std::unique_ptr<ProductDescriptionBlockImpl> p; std::unique_ptr<ProductDescriptionBlockImpl> p;
}; };
} // namespace rpg } // namespace scwx::wsr88d::rpg
} // namespace wsr88d
} // namespace scwx

View file

@ -724,7 +724,7 @@ units::angle::degrees<double> ProductDescriptionBlock::elevation() const
{ {
double elevation = 0.0; double elevation = 0.0;
if (p->elevationNumber_ > 0) if (has_elevation())
{ {
// Elevation is given in tenths of a degree // Elevation is given in tenths of a degree
// NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers) // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers)
@ -734,6 +734,11 @@ units::angle::degrees<double> ProductDescriptionBlock::elevation() const
return units::angle::degrees<double> {elevation}; return units::angle::degrees<double> {elevation};
} }
bool ProductDescriptionBlock::has_elevation() const
{
return p->elevationNumber_ > 0;
}
bool ProductDescriptionBlock::IsCompressionEnabled() const bool ProductDescriptionBlock::IsCompressionEnabled() const
{ {
bool isCompressed = false; bool isCompressed = false;