mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 03:20:05 +00:00 
			
		
		
		
	Add placefile parsing for Line
This commit is contained in:
		
							parent
							
								
									f0c2f8eec0
								
							
						
					
					
						commit
						1929ee9eef
					
				
					 2 changed files with 85 additions and 1 deletions
				
			
		|  | @ -100,6 +100,26 @@ public: | ||||||
|       std::string               hoverText_ {}; |       std::string               hoverText_ {}; | ||||||
|    }; |    }; | ||||||
| 
 | 
 | ||||||
|  |    struct LineDrawItem : DrawItem | ||||||
|  |    { | ||||||
|  |       LineDrawItem() { itemType_ = ItemType::Line; } | ||||||
|  | 
 | ||||||
|  |       boost::gil::rgba8_pixel_t color_ {}; | ||||||
|  |       double                    width_ {}; | ||||||
|  |       std::int32_t              flags_ {}; | ||||||
|  |       std::string               hoverText_ {}; | ||||||
|  | 
 | ||||||
|  |       struct Element | ||||||
|  |       { | ||||||
|  |          double latitude_ {}; | ||||||
|  |          double longitude_ {}; | ||||||
|  |          double x_ {}; | ||||||
|  |          double y_ {}; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       std::vector<Element> elements_ {}; | ||||||
|  |    }; | ||||||
|  | 
 | ||||||
|    bool IsValid() const; |    bool IsValid() const; | ||||||
| 
 | 
 | ||||||
|    /**
 |    /**
 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ public: | ||||||
|                       double&            longitude, |                       double&            longitude, | ||||||
|                       double&            x, |                       double&            x, | ||||||
|                       double&            y); |                       double&            y); | ||||||
|  |    void ProcessElement(const std::string& line); | ||||||
|    void ProcessLine(const std::string& line); |    void ProcessLine(const std::string& line); | ||||||
| 
 | 
 | ||||||
|    static void ProcessEscapeCharacters(std::string& s); |    static void ProcessEscapeCharacters(std::string& s); | ||||||
|  | @ -62,6 +63,7 @@ public: | ||||||
|    ColorMode                 colorMode_ {ColorMode::RGBA}; |    ColorMode                 colorMode_ {ColorMode::RGBA}; | ||||||
|    std::vector<Object>       objectStack_ {}; |    std::vector<Object>       objectStack_ {}; | ||||||
|    DrawingStatement          currentStatement_ {DrawingStatement::Standard}; |    DrawingStatement          currentStatement_ {DrawingStatement::Standard}; | ||||||
|  |    std::shared_ptr<DrawItem> currentDrawItem_ {nullptr}; | ||||||
| 
 | 
 | ||||||
|    // References
 |    // References
 | ||||||
|    std::unordered_map<std::size_t, std::shared_ptr<IconFile>> iconFiles_ {}; |    std::unordered_map<std::size_t, std::shared_ptr<IconFile>> iconFiles_ {}; | ||||||
|  | @ -179,6 +181,11 @@ std::shared_ptr<Placefile> Placefile::Load(const std::string& name, | ||||||
|                if (boost::istarts_with(line, "End:")) |                if (boost::istarts_with(line, "End:")) | ||||||
|                { |                { | ||||||
|                   placefile->p->currentStatement_ = DrawingStatement::Standard; |                   placefile->p->currentStatement_ = DrawingStatement::Standard; | ||||||
|  |                   placefile->p->currentDrawItem_  = nullptr; | ||||||
|  |                } | ||||||
|  |                else if (placefile->p->currentDrawItem_ != nullptr) | ||||||
|  |                { | ||||||
|  |                   placefile->p->ProcessElement(line); | ||||||
|                } |                } | ||||||
|                break; |                break; | ||||||
|             } |             } | ||||||
|  | @ -502,9 +509,39 @@ void Placefile::Impl::ProcessLine(const std::string& line) | ||||||
|       //    lat, lon
 |       //    lat, lon
 | ||||||
|       //    ...
 |       //    ...
 | ||||||
|       // End:
 |       // End:
 | ||||||
|  |       std::vector<std::string> tokenList = | ||||||
|  |          util::ParseTokens(line, {",", ","}, lineKey_.size()); | ||||||
|  | 
 | ||||||
|       currentStatement_ = DrawingStatement::Line; |       currentStatement_ = DrawingStatement::Line; | ||||||
| 
 | 
 | ||||||
|       // TODO
 |       std::shared_ptr<LineDrawItem> di = nullptr; | ||||||
|  | 
 | ||||||
|  |       if (tokenList.size() >= 2) | ||||||
|  |       { | ||||||
|  |          di = std::make_shared<LineDrawItem>(); | ||||||
|  | 
 | ||||||
|  |          di->threshold_ = threshold_; | ||||||
|  |          di->color_     = color_; | ||||||
|  | 
 | ||||||
|  |          di->width_ = std::stoul(tokenList[0]); | ||||||
|  |          di->flags_ = std::stoul(tokenList[1]); | ||||||
|  |       } | ||||||
|  |       if (tokenList.size() >= 3) | ||||||
|  |       { | ||||||
|  |          ProcessEscapeCharacters(tokenList[2]); | ||||||
|  |          TrimQuotes(tokenList[2]); | ||||||
|  |          di->hoverText_.swap(tokenList[2]); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (di != nullptr) | ||||||
|  |       { | ||||||
|  |          currentDrawItem_ = di; | ||||||
|  |          drawItems_.emplace_back(std::move(di)); | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          logger_->warn("Line statement malformed: {}", line); | ||||||
|  |       } | ||||||
|    } |    } | ||||||
|    else if (boost::istarts_with(line, trianglesKey_)) |    else if (boost::istarts_with(line, trianglesKey_)) | ||||||
|    { |    { | ||||||
|  | @ -548,6 +585,33 @@ void Placefile::Impl::ProcessLine(const std::string& line) | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Placefile::Impl::ProcessElement(const std::string& line) | ||||||
|  | { | ||||||
|  |    if (currentStatement_ == DrawingStatement::Line) | ||||||
|  |    { | ||||||
|  |       // Line: width, flags [, hover_text]
 | ||||||
|  |       //    lat, lon
 | ||||||
|  |       //    ...
 | ||||||
|  |       // End:
 | ||||||
|  |       std::vector<std::string> tokenList = util::ParseTokens(line, {",", ","}); | ||||||
|  | 
 | ||||||
|  |       if (tokenList.size() >= 2) | ||||||
|  |       { | ||||||
|  |          LineDrawItem::Element element; | ||||||
|  | 
 | ||||||
|  |          ParseLocation(tokenList[0], | ||||||
|  |                        tokenList[1], | ||||||
|  |                        element.latitude_, | ||||||
|  |                        element.longitude_, | ||||||
|  |                        element.x_, | ||||||
|  |                        element.y_); | ||||||
|  | 
 | ||||||
|  |          std::static_pointer_cast<LineDrawItem>(currentDrawItem_) | ||||||
|  |             ->elements_.emplace_back(std::move(element)); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Placefile::Impl::ParseLocation(const std::string& latitudeToken, | void Placefile::Impl::ParseLocation(const std::string& latitudeToken, | ||||||
|                                     const std::string& longitudeToken, |                                     const std::string& longitudeToken, | ||||||
|                                     double&            latitude, |                                     double&            latitude, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat