diff --git a/ComponentBasic/DeduceFramework.cpp b/ComponentBasic/DeduceFramework.cpp index 95b9cd0..38d0e00 100644 --- a/ComponentBasic/DeduceFramework.cpp +++ b/ComponentBasic/DeduceFramework.cpp @@ -59,6 +59,7 @@ DeduceFramework::DeduceFramework() :_factory_ins(std::make_shared()) { } +#include "RouteManage.h" void DeduceFramework::init_framework() { auto mgr_e = std::make_shared(); @@ -70,6 +71,8 @@ void DeduceFramework::init_framework() auto res_e = std::make_shared(); info_pulls = std::make_shared(); res_e->append(info_pulls); + auto route_mgr = std::make_shared(); + res_e->append(route_mgr); this->_entity_map_over_0xffff[res_e->entityID()] = res_e; } diff --git a/ComponentBasic/RouteManage.cpp b/ComponentBasic/RouteManage.cpp index 2c02b1b..8cf04d4 100644 --- a/ComponentBasic/RouteManage.cpp +++ b/ComponentBasic/RouteManage.cpp @@ -1 +1,138 @@ #include "RouteManage.h" + +PlainRouteManage::PlainRouteManage() +{ + +} + + +#include + +void PlainRouteManage::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) +{ + auto resp = std::make_shared(); + resp->reset(in->targetEntity(), in->sourceEntity()); + + if(!this->_route_resource_map.contains(in->_route_name)){ + resp->_success_mark = true; + this->_route_resource_map[in->_route_name] = RouteResource(); + } + else { + resp->_reason_text = "已包含指定名称的路径"; + } + + out << resp; +} + +void PlainRouteManage::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) +{ + auto resp = std::make_shared(); + resp->reset(in->targetEntity(), in->sourceEntity()); + + if (this->_route_resource_map.contains(in->_route_name)) { + resp->_success_mark = true; + this->_route_resource_map.remove(in->_route_name); + } + else { + resp->_reason_text = "不包含指定名称的路径"; + } + + out << resp; +} + +void PlainRouteManage::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) +{ + auto resp = std::make_shared(); + resp->reset(in->targetEntity(), in->sourceEntity()); + + if (this->_route_resource_map.contains(in->_route_name)) { + resp->_success_mark = true; + + RouteResource res; + res._route_points = in->_lonlat_list; + this->_route_resource_map[in->_route_name] = res; + } + else { + resp->_reason_text = "不包含指定名称的路径"; + } + + out << resp; +} + +void PlainRouteManage::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) +{ + auto resp = std::make_shared(); + resp->reset(in->targetEntity(), in->sourceEntity()); + + if (this->_route_resource_map.contains(in->_route_name)) { + resp->_success_mark = true; + resp->_route_name = in->_route_name; + resp->_lonlat_list = this->_route_resource_map[in->_route_name]._route_points; + } + else { + resp->_reason_text = "不包含指定名称的路径"; + } + + out << resp; +} + +void PlainRouteManage::recoveryFrom(const QJsonObject& obj) +{ + auto route_array = obj["total_route"].toArray(); + for (auto idx = 0; idx < route_array.size(); ++idx) { + auto track_record = route_array.at(idx).toObject(); + auto track_name = track_record["name"].toString(); + auto track_points = track_record["points"].toArray(); + + RouteResource value; + for (auto tidx = 0; tidx < track_points.size(); tidx++) { + auto point = track_points.at(tidx).toObject(); + auto pins = LonLatPos{ point["point_lon"].toDouble(), point["point_lat"].toDouble() }; + value._route_points << pins; + } + + this->_route_resource_map[track_name] = value; + } +} + +void PlainRouteManage::saveTo(QJsonObject& obj) const +{ + QJsonArray route_array; + for (auto route_name : this->_route_resource_map.keys()) { + QJsonObject track_record; + track_record["name"] = route_name; + QJsonArray point_array; + for (auto pointv : this->_route_resource_map[route_name]._route_points) { + QJsonObject point; + point["point_lon"] = pointv._lon_deg; + point["point_lat"] = pointv._lat_deg; + point_array.append(point); + } + track_record["points"] = point_array; + + route_array.append(track_record); + } + + obj["total_route"] = route_array; +} + +std::shared_ptr PlainRouteManage::defaultNew() const +{ + return nullptr; +} + +void PlainRouteManage::bindEntity(std::weak_ptr host) +{ + this->_bind_entity = host; +} + +QString PlainRouteManage::name() const +{ + return NAME(PlainRouteManage); +} + +RouteResource& RouteResource::operator=(const RouteResource& other) +{ + this->_route_points = other._route_points; + return *this; +} diff --git a/ComponentBasic/RouteManage.h b/ComponentBasic/RouteManage.h index 9ddda31..7cc62de 100644 --- a/ComponentBasic/RouteManage.h +++ b/ComponentBasic/RouteManage.h @@ -1,5 +1,44 @@ #pragma once -class MapRoute -{ +#include "componentbasic.h" +#include +#include + +/// +/// 路径资源 +/// +struct RouteResource { + QList _route_points; + + RouteResource& operator=(const RouteResource& other); +}; + +/// +/// 平面路径管理插件 +/// +class PlainRouteManage : public ProcList< + WsRespond, + WsRespond, + WsRespond, + WsRespond +> { +private: + std::weak_ptr _bind_entity; + QHash _route_resource_map; + +public: + PlainRouteManage(); + + // 通过 ProcList 继承 + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + + std::shared_ptr defaultNew() const override; + void bindEntity(std::weak_ptr host) override; + QString name() const override; }; diff --git a/MessageBasic/messagebasic.h b/MessageBasic/messagebasic.h index 02285d9..26bcd05 100644 --- a/MessageBasic/messagebasic.h +++ b/MessageBasic/messagebasic.h @@ -20,11 +20,10 @@ #define STRLIST_PEAK(u) u = obj[NAME(u)].toString().split(",") class MESSAGEBASIC_EXPORT AbstractMessage : public WsMessage { -private: +protected: uint64_t _from_id = 0, _to_id = 0; QString _topic_string; -protected: AbstractMessage(const QString& topic); public: diff --git a/MessageBasic/route_access.cpp b/MessageBasic/route_access.cpp index 2a41f7f..478791a 100644 --- a/MessageBasic/route_access.cpp +++ b/MessageBasic/route_access.cpp @@ -66,3 +66,56 @@ void RemovePlainRoute::saveTo(QJsonObject& obj) const AbstractMessage::saveTo(obj); STRING_SAVE(_route_name); } + +PlainRouteQuery::PlainRouteQuery() + :AbstractMessage(NAME(PlainRouteQuery)) +{ + +} + +void PlainRouteQuery::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + STRING_PEAK(_route_name); +} + +void PlainRouteQuery::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + STRING_SAVE(_route_name); +} + +PlainRouteInfo::PlainRouteInfo() + :RespondDefault() { + _topic_string = NAME(PlainRouteInfo); +} + + +void PlainRouteInfo::recoveryFrom(const QJsonObject& obj) +{ + RespondDefault::recoveryFrom(obj); + STRING_PEAK(this->_route_name); + + QStringList lonlist, latlist; + STRLIST_PEAK(lonlist); + STRLIST_PEAK(latlist); + for (auto idx = 0; idx < lonlist.size(); ++idx) { + auto lon = lonlist.at(idx).toDouble(); + auto lat = latlist.at(idx).toDouble(); + this->_lonlat_list << LonLatPos{ lon, lat }; + } +} + +void PlainRouteInfo::saveTo(QJsonObject& obj) const +{ + RespondDefault::saveTo(obj); + STRING_SAVE(this->_route_name); + + QStringList lonlist, latlist; + for (auto pos : this->_lonlat_list) { + lonlist << QString("%1").arg(pos._lon_deg); + latlist << QString("%1").arg(pos._lat_deg); + } + STRLIST_SAVE(lonlist); + STRLIST_SAVE(latlist); +} \ No newline at end of file diff --git a/MessageBasic/route_access.h b/MessageBasic/route_access.h index 87ba861..7fa7087 100644 --- a/MessageBasic/route_access.h +++ b/MessageBasic/route_access.h @@ -41,3 +41,30 @@ struct MESSAGEBASIC_EXPORT PlainRouteReset : public AbstractMessage { void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; + +/// +/// 平面路径数据查询 +/// +struct MESSAGEBASIC_EXPORT PlainRouteQuery : public AbstractMessage { + QString _route_name; + + PlainRouteQuery(); + + // Serializable + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + +/// +/// 返回平面路径数据 +/// +struct MESSAGEBASIC_EXPORT PlainRouteInfo : public RespondDefault { + QList _lonlat_list; + QString _route_name; + + PlainRouteInfo(); + + // Serializable + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; \ No newline at end of file