mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:30:06 +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