From ca6f55d712267fefdb0f209c5b86e30abdbf6559 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 1 Sep 2023 08:30:46 -0500 Subject: [PATCH] Placefile image statement --- wxdata/include/scwx/gr/placefile.hpp | 19 +++++++++ wxdata/source/scwx/gr/placefile.cpp | 64 +++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/wxdata/include/scwx/gr/placefile.hpp b/wxdata/include/scwx/gr/placefile.hpp index d092ed3f..81b37daa 100644 --- a/wxdata/include/scwx/gr/placefile.hpp +++ b/wxdata/include/scwx/gr/placefile.hpp @@ -142,6 +142,25 @@ public: std::vector elements_ {}; }; + struct ImageDrawItem : DrawItem + { + ImageDrawItem() { itemType_ = ItemType::Image; } + + std::string imageFile_ {}; + + struct Element + { + double latitude_ {}; + double longitude_ {}; + double x_ {}; + double y_ {}; + double tu_ {}; + double tv_ {}; + }; + + std::vector elements_ {}; + }; + struct PolygonDrawItem : DrawItem { PolygonDrawItem() { itemType_ = ItemType::Polygon; } diff --git a/wxdata/source/scwx/gr/placefile.cpp b/wxdata/source/scwx/gr/placefile.cpp index 27febd8c..5d007647 100644 --- a/wxdata/source/scwx/gr/placefile.cpp +++ b/wxdata/source/scwx/gr/placefile.cpp @@ -570,9 +570,29 @@ void Placefile::Impl::ProcessLine(const std::string& line) // lat, lon, Tu [, Tv ] // ... // End: + std::vector tokenList = + util::ParseTokens(line, {" "}, imageKey_.size()); + currentStatement_ = DrawingStatement::Image; - // TODO + std::shared_ptr di = nullptr; + + if (tokenList.size() >= 1) + { + di = std::make_shared(); + + di->threshold_ = threshold_; + + TrimQuotes(tokenList[0]); + di->imageFile_.swap(tokenList[0]); + + currentDrawItem_ = di; + drawItems_.emplace_back(std::move(di)); + } + else + { + logger_->warn("Image statement malformed: {}", line); + } } else if (boost::istarts_with(line, polygonKey_)) { @@ -664,6 +684,48 @@ void Placefile::Impl::ProcessElement(const std::string& line) logger_->warn("Triangles sub-statement malformed: {}", line); } } + else if (currentStatement_ == DrawingStatement::Image) + { + // Image: image_file + // lat, lon, Tu [, Tv ] + // ... + // End: + std::vector tokenList = + util::ParseTokens(line, {",", ",", ",", ","}); + + ImageDrawItem::Element element; + + if (tokenList.size() >= 3) + { + ParseLocation(tokenList[0], + tokenList[1], + element.latitude_, + element.longitude_, + element.x_, + element.y_); + + element.tu_ = std::stod(tokenList[2]); + } + + if (tokenList.size() >= 4) + { + element.tv_ = std::stod(tokenList[3]); + } + else + { + element.tv_ = element.tu_; + } + + if (tokenList.size() >= 3) + { + std::static_pointer_cast(currentDrawItem_) + ->elements_.emplace_back(std::move(element)); + } + else + { + logger_->warn("Image sub-statement malformed: {}", line); + } + } else if (currentStatement_ == DrawingStatement::Polygon) { // Polygon: