diff --git a/ComponentBasic/ComponentBasic.vcxproj b/ComponentBasic/ComponentBasic.vcxproj index 1685f31..d8be6c4 100644 --- a/ComponentBasic/ComponentBasic.vcxproj +++ b/ComponentBasic/ComponentBasic.vcxproj @@ -101,12 +101,15 @@ + + + diff --git a/ComponentBasic/ComponentBasic.vcxproj.filters b/ComponentBasic/ComponentBasic.vcxproj.filters index 477273e..111d8d7 100644 --- a/ComponentBasic/ComponentBasic.vcxproj.filters +++ b/ComponentBasic/ComponentBasic.vcxproj.filters @@ -35,6 +35,9 @@ Header Files + + Header Files + @@ -46,6 +49,12 @@ Source Files + + Source Files + + + Source Files + diff --git a/ComponentBasic/EntityDocks.cpp b/ComponentBasic/EntityDocks.cpp index 4678d7c..74b0fee 100644 --- a/ComponentBasic/EntityDocks.cpp +++ b/ComponentBasic/EntityDocks.cpp @@ -1,7 +1,7 @@ #include "EntityDocks.h" #include -QList> deduct_each(std::shared_ptr item) +QList> deduct_each(std::shared_ptr item) { QList> rets; auto immediate = std::make_shared(item); @@ -30,7 +30,7 @@ void DeduceFramework::deduceBegin(std::shared_ptr ins) auto dt = QTime::currentTime(); auto ret_list_set = QtConcurrent::blockingMapped( - _entity_map.values(), deduct_each + _entity_map_over_0xffff.values(), deduct_each ); _accept_stack.clear(); @@ -44,10 +44,17 @@ void DeduceFramework::deduceBegin(std::shared_ptr ins) } #include -DeduceFramework::DeduceFramework() { +#include "invisible_component.h" +DeduceFramework::DeduceFramework() + :_factory_ins(std::make_shared()) { +} + +void DeduceFramework::init_backend() +{ auto mgr_e = std::make_shared(); mgr_e->append(this->shared_from_this()); - this->_entity_map[mgr_e->entityID()] = mgr_e; + + this->_entity_map_over_0xffff[mgr_e->entityID()] = mgr_e; } std::shared_ptr DeduceFramework::defaultNew() const @@ -55,9 +62,9 @@ std::shared_ptr DeduceFramework::defaultNew() const throw std::logic_error("The method or operation is not implemented."); } -void DeduceFramework::bindEntity(uint64_t entity_id) +void DeduceFramework::bindEntity(std::weak_ptr ins) { - this->_bind_entity = entity_id; + this->_bind_entity = ins; } QString DeduceFramework::name() const @@ -76,15 +83,255 @@ void DeduceFramework::saveTo(QJsonObject& obj) const } void DeduceFramework::execute(std::shared_ptr map, - std::shared_ptr in, QList>& out) + std::shared_ptr in, QList>& out) { + auto dt = QTime::currentTime(); + auto result = std::make_shared(); + result->reset(in->targetEntity(), in->sourceEntity()); + + switch ((EntityOperateType)in->_operate_code) + { + case EntityOperateType::NEW: { + if (!this->_templets_within_0x2ff_0xffff.contains(in->_template_name)) { + result->_reason_text = QString("指定的Template:%1不存在").arg(in->_template_name); + } + else { + result->_success_mark = true; + + auto ins_t = this->_templets_within_0x2ff_0xffff[in->_template_name]; + auto new_copy = std::static_pointer_cast(ins_t->defaultNew()); + new_copy->resetID(0xffff); + auto desc_p = std::make_shared(); + new_copy->append(desc_p); + + while (_entity_map_over_0xffff.contains(new_copy->entityID())) + { + auto ncode = new_copy->entityID() + 1; + new_copy->resetID(ncode); + } + _entity_map_over_0xffff[new_copy->entityID()] = new_copy; + } + }break; + case EntityOperateType::DELETE: { + if (!this->_entity_map_over_0xffff.contains(in->_entity_id_over_0xffff)) { + result->_reason_text = QString("指定的实体id:%1不存在").arg(in->_entity_id_over_0xffff); + } + else { + result->_success_mark = true; + this->_entity_map_over_0xffff.remove(in->_entity_id_over_0xffff); + } + }break; + case EntityOperateType::MODIFY: { + if (!this->_entity_map_over_0xffff.contains(in->_entity_id_over_0xffff)) { + result->_reason_text = QString("指定的实体id:%1不存在").arg(in->_entity_id_over_0xffff); + } + else { + result->_success_mark = true; + + auto target_ins = std::static_pointer_cast( + this->_entity_map_over_0xffff[in->_entity_id_over_0xffff] + ); + target_ins->resetName(in->_entity_name); + target_ins->resetTemplet(in->_template_name); + } + }break; + default: + result->_reason_text = QString("指定操作码非法:%1").arg(in->_operate_code); + break; + } + + result->_time_consume = dt.msecsTo(QTime::currentTime()); + out << result; } + void DeduceFramework::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) { auto rst = std::make_shared(); rst->reset(in->targetEntity(), in->sourceEntity()); - rst->_entities_list = _entity_map.keys(); + rst->_entities_list = _entity_map_over_0xffff.keys(); out << rst; } + +void DeduceFramework::execute(std::shared_ptr map, + std::shared_ptr in, QList>& out) +{ + auto ins = std::make_shared(); + ins->reset(in->targetEntity(), in->sourceEntity()); + ins->_component_types = this->_factory_ins->allComponentTypes(); + for (auto ekey : this->_templets_within_0x2ff_0xffff.keys()) + ins->_entity_templets[ekey] = this->_templets_within_0x2ff_0xffff[ekey]->entityID(); + + out << ins; +} + +void DeduceFramework::execute(std::shared_ptr map, + std::shared_ptr in, QList>& out) +{ + auto dt = QTime::currentTime(); + + auto nins = std::make_shared(); + nins->reset(in->targetEntity(), in->sourceEntity()); + + switch ((EntityOperateType)in->_operate_code) { + case EntityOperateType::NEW: { + nins->_success_mark = true; + auto ent_t = std::make_shared(); + ent_t->resetTemplet(in->_template_name); + auto desc_p = std::make_shared(); + ent_t->append(desc_p); + + // 提取所有的模板id + auto _tm_ins = _templets_within_0x2ff_0xffff.values(); + QList allids; + std::transform(_templets_within_0x2ff_0xffff.begin(), + _templets_within_0x2ff_0xffff.end(), + std::back_inserter(allids), + [](std::shared_ptr i) { return i->entityID(); }); + + // 重置模板id + while (allids.contains(ent_t->entityID())) { + auto nid = ent_t->entityID() + 1; + ent_t->resetID(nid); + } + + // 模板载入系统 + _templets_within_0x2ff_0xffff[in->_template_name] = ent_t; + }break; + case EntityOperateType::DELETE: { + for (auto ekey : this->_templets_within_0x2ff_0xffff.keys()) { + auto eins = this->_templets_within_0x2ff_0xffff[ekey]; + nins->_success_mark = false; + nins->_reason_text = QString("指定的实体id:%1不存在").arg(in->_template_id_within_0x2ff_0xffff); + + if (eins->entityID() == in->_template_id_within_0x2ff_0xffff) { + this->_templets_within_0x2ff_0xffff.remove(ekey); + nins->_success_mark = true; + nins->_reason_text = ""; + break; + } + } + }break; + case EntityOperateType::MODIFY: { + for (auto ekey : this->_templets_within_0x2ff_0xffff.keys()) { + auto eins = this->_templets_within_0x2ff_0xffff[ekey]; + nins->_reason_text = QString("指定的实体id:%1不存在").arg(in->_template_id_within_0x2ff_0xffff); + nins->_success_mark = false; + + if (eins->entityID() == in->_template_id_within_0x2ff_0xffff) { + eins->resetTemplet(in->_template_name); + nins->_success_mark = true; + nins->_reason_text = ""; + break; + } + } + }break; + default: + nins->_reason_text = QString("指定操作码非法:%1").arg(in->_operate_code); + break; + } + + nins->_time_consume = dt.msecsTo(QTime::currentTime()); + out << nins; +} + +void DeduceFramework::execute(std::shared_ptr map, + std::shared_ptr in, QList>& out) +{ + auto dt = QTime::currentTime(); + + auto result = std::make_shared(); + result->reset(in->targetEntity(), in->sourceEntity()); + + // 提取目标实例 ==================================================== + std::shared_ptr target_ins = nullptr; + if (in->_entity_id_within_0x2ff_0xffffffffffffffff < 0xffff) { + for (auto info_t : this->_templets_within_0x2ff_0xffff) { + if (info_t->entityID() == in->_entity_id_within_0x2ff_0xffffffffffffffff) { + target_ins = info_t; + break; + } + } + } + else { + if (this->_entity_map_over_0xffff.contains(in->_entity_id_within_0x2ff_0xffffffffffffffff)) { + target_ins = std::static_pointer_cast( + this->_entity_map_over_0xffff[in->_entity_id_within_0x2ff_0xffffffffffffffff]); + } + } + + if (!target_ins) { + result->_reason_text = QString("指定的实体id:%1不存在").arg(in->_entity_id_within_0x2ff_0xffffffffffffffff); + } + else { + result->_success_mark = true; + + QStringList total_component_types = this->_factory_ins->allComponentTypes(); + for (auto chk : in->_component_types) { + if (!total_component_types.contains(chk)) { + result->_success_mark = false; + result->_reason_text = QString("ComponentType错误,包含非法类型:%1").arg(chk); + break; + } + } + + if (result->_success_mark) { + auto comps_list = target_ins->components(); + + QStringList exists_component_types; + std::transform(comps_list.begin(), comps_list.end(), + std::back_inserter(exists_component_types), + [](std::shared_ptr c) { return c->name(); }); + + for (auto comp : in->_component_types) { + if (!exists_component_types.contains(comp)) { + auto ins_comp = this->_factory_ins->makeNew(comp); + target_ins->append(ins_comp); + } + } + } + } + + result->_time_consume = dt.msecsTo(QTime::currentTime()); + out << result; +} + +#include "VisibleBox.h" +ComponentFactory::ComponentFactory() +{ + auto ins = std::make_shared(); + _comp_types[ins->name()] = ins; +} + +std::shared_ptr ComponentFactory::makeNew(const QString& type) +{ + if (!this->_comp_types.contains(type)) + return NULL; + + auto ntype = _comp_types[type]; + return ntype->defaultNew(); +} + +QList ComponentFactory::allComponentTypes() const +{ + return _comp_types.keys(); +} + +void ComponentFactory::recoveryFrom(const QJsonObject& obj) +{ + QStringList tlist; + STRLIST_PEAK(tlist); + + auto curr_list = _comp_types.keys(); + for (auto chk : tlist) + if (!curr_list.contains(chk)) + throw std::logic_error("基础数据不兼容"); +} + +void ComponentFactory::saveTo(QJsonObject& obj) const +{ + QStringList tlist = _comp_types.keys(); + std::sort(tlist.begin(), tlist.end()); + STRLIST_SAVE(tlist); +} diff --git a/ComponentBasic/EntityDocks.h b/ComponentBasic/EntityDocks.h index 34e2cb3..52afe5d 100644 --- a/ComponentBasic/EntityDocks.h +++ b/ComponentBasic/EntityDocks.h @@ -5,16 +5,37 @@ #include #include +class COMPONENTBASIC_EXPORT ComponentFactory : public Serializable { +private: + QHash> _comp_types; + +public: + ComponentFactory(); + + std::shared_ptr makeNew(const QString &type); + QList allComponentTypes() const; + + // 通过 Serializable 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + +}; + class COMPONENTBASIC_EXPORT DeduceFramework : public QObject, public ProcList< - WsRespond, + WsRespond, + WsRespond, + WsRespond, + WsRespond, WsRespond> { Q_OBJECT private: - uint64_t _bind_entity = 0; + std::weak_ptr _bind_entity; + std::shared_ptr _factory_ins; - QHash> _entity_map; + QHash> _templets_within_0x2ff_0xffff; + QHash> _entity_map_over_0xffff; signals: /// @@ -42,15 +63,22 @@ public slots: public: static QList> _accept_stack; + DeduceFramework(); + void init_backend(); + std::shared_ptr defaultNew() const override; - void bindEntity(uint64_t entity_id) override; + void bindEntity(std::weak_ptr ins) override; QString name() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const 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 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; }; \ No newline at end of file diff --git a/ComponentBasic/VisibleBox.cpp b/ComponentBasic/VisibleBox.cpp index 20dc6bb..6523781 100644 --- a/ComponentBasic/VisibleBox.cpp +++ b/ComponentBasic/VisibleBox.cpp @@ -3,8 +3,7 @@ // 通过 ProcList 继承 -void Visible3DPlugin::recoveryFrom(const QJsonObject& obj) { - this->_bind_entity = obj["_bind_entity"].toVariant().toULongLong(); +void VisibleCubePlugin::recoveryFrom(const QJsonObject& obj) { DOUOBLE_PEAK(_self_d3._length_m); DOUOBLE_PEAK(_self_d3._width_m); DOUOBLE_PEAK(_self_d3._height_m); @@ -18,9 +17,7 @@ void Visible3DPlugin::recoveryFrom(const QJsonObject& obj) { DOUOBLE_PEAK(_self_posture._roll_deg); } -void Visible3DPlugin::saveTo(QJsonObject& obj) const { - obj["_bind_entity"] = QJsonValue::fromVariant(QVariant::fromValue(this->_bind_entity)); - +void VisibleCubePlugin::saveTo(QJsonObject& obj) const { DOUBLE_SAVE(_self_d3._length_m); DOUBLE_SAVE(_self_d3._width_m); DOUBLE_SAVE(_self_d3._height_m); @@ -34,8 +31,8 @@ void Visible3DPlugin::saveTo(QJsonObject& obj) const { DOUBLE_SAVE(_self_posture._roll_deg); } -std::shared_ptr Visible3DPlugin::defaultNew() const { - auto copy = std::make_shared(); +std::shared_ptr VisibleCubePlugin::defaultNew() const { + auto copy = std::make_shared(); copy->_bind_entity = _bind_entity; copy->_self_d3 = _self_d3; copy->_self_lla = _self_lla; @@ -43,20 +40,21 @@ std::shared_ptr Visible3DPlugin::defaultNew() const { return copy; } -void Visible3DPlugin::bindEntity(uint64_t entity_id) { - this->_bind_entity = entity_id; +void VisibleCubePlugin::bindEntity(std::weak_ptr ins) +{ + this->_bind_entity = ins; } -QString Visible3DPlugin::name() const { - return NAME(Visible3DPlugin); +QString VisibleCubePlugin::name() const { + return NAME(VisibleCubePlugin); } -void Visible3DPlugin::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) +void VisibleCubePlugin::execute(std::shared_ptr map, std::shared_ptr in, QList>& out) { auto ins = std::make_shared(); ins->_lla_pos = _self_lla; ins->_posture_d3 = _self_posture; ins->_d3_data = _self_d3; - ins->reset(_bind_entity, in->sourceEntity()); + ins->reset(in->targetEntity(), in->sourceEntity()); out << ins; } diff --git a/ComponentBasic/VisibleBox.h b/ComponentBasic/VisibleBox.h index 2cf3582..36be1d0 100644 --- a/ComponentBasic/VisibleBox.h +++ b/ComponentBasic/VisibleBox.h @@ -6,21 +6,21 @@ /// /// 可视化3d体积盒 /// -class COMPONENTBASIC_EXPORT Visible3DPlugin : public ProcList< +class COMPONENTBASIC_EXPORT VisibleCubePlugin : public ProcList< WsRespond > { private: - uint64_t _bind_entity = 0; + std::weak_ptr _bind_entity; D3Data _self_d3; LLAPos _self_lla; Posture _self_posture; public: - explicit Visible3DPlugin() = default; + explicit VisibleCubePlugin() = default; // 通过 ProcList 继承 - void bindEntity(uint64_t entity_id) override; + void bindEntity(std::weak_ptr ins) override; QString name() const override; void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; diff --git a/ComponentBasic/componentbasic.cpp b/ComponentBasic/componentbasic.cpp new file mode 100644 index 0000000..217cda7 --- /dev/null +++ b/ComponentBasic/componentbasic.cpp @@ -0,0 +1,2 @@ +#include "componentbasic.h" + diff --git a/ComponentBasic/invisible_component.cpp b/ComponentBasic/invisible_component.cpp new file mode 100644 index 0000000..2a1aeba --- /dev/null +++ b/ComponentBasic/invisible_component.cpp @@ -0,0 +1,56 @@ +#include "invisible_component.h" + +ComponentsInfoPull::ComponentsInfoPull() {} + +void ComponentsInfoPull::bindEntity(std::weak_ptr ins) +{ + this->_bind_entity = ins; +} + +QString ComponentsInfoPull::name() const +{ + return NAME(ComponentsInfoPull); +} + +#include +#include +void ComponentsInfoPull::execute(std::shared_ptr map, + std::shared_ptr in, QList>& out) +{ + auto rst = std::make_shared(); + rst->reset(in->targetEntity(), in->sourceEntity()); + + auto bind_e = this->_bind_entity.lock(); + rst->_entity_json["entity_templet"] = bind_e->templetName(); + rst->_entity_json["entity_id"] = QJsonValue::fromVariant(QVariant::fromValue(bind_e->entityID())); + rst->_entity_json["entity_name"] = bind_e->name(); + + QList> comp_list; + auto host_conv = std::dynamic_pointer_cast(bind_e); + comp_list = host_conv->components(); + + auto array = QJsonArray(); + for (auto ins : comp_list) { + auto info_comp = QJsonObject(); + info_comp["component_type"] = ins->name(); + ins->saveTo(info_comp); + array.append(info_comp); + } + rst->_entity_json["component_list"] = array; + out << rst; +} + +std::shared_ptr ComponentsInfoPull::defaultNew() const +{ + return std::make_shared(); +} + +void ComponentsInfoPull::recoveryFrom(const QJsonObject& obj) +{ + +} + +void ComponentsInfoPull::saveTo(QJsonObject& obj) const +{ + +} diff --git a/ComponentBasic/invisible_component.h b/ComponentBasic/invisible_component.h new file mode 100644 index 0000000..5408f90 --- /dev/null +++ b/ComponentBasic/invisible_component.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include "componentbasic.h" + +class COMPONENTBASIC_EXPORT ComponentsInfoPull : public ProcList< + WsRespond +> { +private: + std::weak_ptr _bind_entity; + +public: + ComponentsInfoPull(); + + // 通过 ProcList 继承 + void bindEntity(std::weak_ptr ins) override; + QString name() const override; + + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + + std::shared_ptr defaultNew() const override; + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; \ No newline at end of file diff --git a/MessageBasic/messagebasic.cpp b/MessageBasic/messagebasic.cpp index c9d4086..1c2beaf 100644 --- a/MessageBasic/messagebasic.cpp +++ b/MessageBasic/messagebasic.cpp @@ -40,12 +40,16 @@ void RespondDefault::recoveryFrom(const QJsonObject& obj) { AbstractMessage::recoveryFrom(obj); DOUOBLE_PEAK(_time_consume); + UINT64_PEAK(_success_mark); + STRING_PEAK(_reason_text); } void RespondDefault::saveTo(QJsonObject& obj) const { AbstractMessage::saveTo(obj); DOUBLE_SAVE(_time_consume); + UINT64_SAVE(_success_mark); + STRING_SAVE(_reason_text); } Get3DBox::Get3DBox() @@ -90,22 +94,28 @@ void Box3DDesc::saveTo(QJsonObject& obj) const DOUBLE_SAVE(this->_posture_d3._roll_deg); } -EntityAllocte::EntityAllocte() +EntityOperate::EntityOperate() :AbstractMessage(NAME(EntityAllocte)) { } -void EntityAllocte::recoveryFrom(const QJsonObject& obj) +void EntityOperate::recoveryFrom(const QJsonObject& obj) { AbstractMessage::recoveryFrom(obj); - STRING_PEAK(_entity_templet); + UINT64_PEAK(_operate_code); + STRING_PEAK(_template_name); + STRING_PEAK(_entity_name); + UINT64_PEAK(_entity_id_over_0xffff); } -void EntityAllocte::saveTo(QJsonObject& obj) const +void EntityOperate::saveTo(QJsonObject& obj) const { AbstractMessage::saveTo(obj); - STRING_SAVE(_entity_templet); + UINT64_SAVE(_operate_code); + STRING_SAVE(_template_name); + STRING_SAVE(_entity_name); + UINT64_SAVE(_entity_id_over_0xffff); } AbstractMessage::AbstractMessage(const QString& topic) :_topic_string(topic) {} @@ -169,3 +179,127 @@ void EntityTotalList::saveTo(QJsonObject& obj) const [](int v) { return QString(",").arg(v); }); STRLIST_SAVE(strs); } + +TypesQueryResult::TypesQueryResult() + :AbstractMessage(NAME(TypesQueryResult)) { +} + +auto ilist_conv = [](const QList& ilist) { + QStringList _templets_ids; + std::transform(ilist.begin(), ilist.end(), + std::back_inserter(_templets_ids), [](uint64_t v) {return QString("%1").arg(v); }); + return _templets_ids; + }; +auto ilist_from = [](const QStringList& slist) { + QList _ids; + std::transform(slist.begin(), slist.end(), + std::back_inserter(_ids), [](QString s) { return s.toULongLong(); }); + return _ids; + }; +void TypesQueryResult::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + STRLIST_PEAK(_component_types); + + QStringList _templet_types; + STRLIST_SAVE(_templet_types); + + QStringList _templets_ids; + STRLIST_SAVE(_templets_ids); + auto idlist = ilist_from(_templets_ids); + + _entity_templets.clear(); + for (auto idx = 0; idx < _templets_ids.size(); idx++) { + _entity_templets[_templet_types.at(idx)] = idlist.at(idx); + } +} + +void TypesQueryResult::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + STRLIST_SAVE(_component_types); + + QStringList _templet_types = _entity_templets.keys(); + STRLIST_SAVE(_templet_types); + + QList _templet_ids; + for (auto key : _templet_types) + _templet_ids << _entity_templets[key]; + + QStringList _templets_ids = ilist_conv(_templet_ids); + STRLIST_SAVE(_templets_ids); +} + +TypesQuery::TypesQuery() + :AbstractMessage(NAME(TypesQuery)) { +} + +ComponentInfosQuery::ComponentInfosQuery() + :AbstractMessage(NAME(ComponentInfosQuery)) { +} + +void ComponentInfosQuery::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + UINT64_PEAK(_bind_entity_id); +} + +void ComponentInfosQuery::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + UINT64_SAVE(_bind_entity_id); +} + +ComponentInfoQueryResult::ComponentInfoQueryResult() + :AbstractMessage(NAME(ComponentInfoQueryResult)) { +} + +void ComponentInfoQueryResult::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + _entity_json = obj["result_json"].toObject(); +} + +void ComponentInfoQueryResult::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + obj["result_json"] = _entity_json; +} + +TempletOperate::TempletOperate() + :AbstractMessage(NAME(TempletOperate)) { +} + +void TempletOperate::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + UINT64_PEAK(_operate_code); + STRING_PEAK(_template_name); + UINT64_PEAK(_template_id_within_0x2ff_0xffff); +} + +void TempletOperate::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + UINT64_SAVE(_operate_code); + STRING_SAVE(_template_name); + UINT64_SAVE(_template_id_within_0x2ff_0xffff); +} + +ComponentOperate::ComponentOperate() + :AbstractMessage(NAME(ComponentOperate)) { +} + +void ComponentOperate::recoveryFrom(const QJsonObject& obj) +{ + AbstractMessage::recoveryFrom(obj); + UINT64_PEAK(_entity_id_within_0x2ff_0xffffffffffffffff); + STRLIST_PEAK(_component_types); +} + +void ComponentOperate::saveTo(QJsonObject& obj) const +{ + AbstractMessage::saveTo(obj); + UINT64_SAVE(_entity_id_within_0x2ff_0xffffffffffffffff); + STRLIST_SAVE(_component_types); +} diff --git a/MessageBasic/messagebasic.h b/MessageBasic/messagebasic.h index 28404b0..7be079a 100644 --- a/MessageBasic/messagebasic.h +++ b/MessageBasic/messagebasic.h @@ -8,6 +8,9 @@ #define DOUBLE_SAVE(u) obj[NAME(u)] = u #define DOUOBLE_PEAK(u) u = obj[NAME(u)].toDouble() +#define UINT64_SAVE(u) obj[NAME(u)] = QJsonValue::fromVariant(QVariant::fromValue(u)) +#define UINT64_PEAK(u) u = obj[NAME(u)].toVariant().toULongLong() + #define STRING_SAVE(u) obj[NAME(u)] = u #define STRING_PEAK(u) u = obj[NAME(u)].toString() @@ -45,6 +48,8 @@ struct MESSAGEBASIC_EXPORT DeduceRequest : public AbstractMessage { /// struct MESSAGEBASIC_EXPORT RespondDefault : public AbstractMessage { double _time_consume; + bool _success_mark = false; + QString _reason_text = ""; RespondDefault(); @@ -109,12 +114,67 @@ struct MESSAGEBASIC_EXPORT Box3DDesc : public AbstractMessage { // 实体构造消息定义 ========================================== /// -/// 实体构造 +/// 查询系统重的组件类型和实体类型 /// -struct MESSAGEBASIC_EXPORT EntityAllocte : public AbstractMessage { - QString _entity_templet = ""; +struct MESSAGEBASIC_EXPORT TypesQuery : public AbstractMessage { + TypesQuery(); +}; +/// +/// 返回系统内所有的组件类型和实体模板类型 +/// +struct MESSAGEBASIC_EXPORT TypesQueryResult : public AbstractMessage { + QStringList _component_types; + QHash _entity_templets; - EntityAllocte(); + TypesQueryResult(); + // 通过 WsMessage 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + + +/// +/// 操作类型 +/// +enum class EntityOperateType { + NEW, DELETE, MODIFY +}; +/// +/// 模板操作支持增、删、改 +/// +struct MESSAGEBASIC_EXPORT TempletOperate : public AbstractMessage { + uint64_t _operate_code = (uint64_t)EntityOperateType::NEW; + QString _template_name = ""; + uint64_t _template_id_within_0x2ff_0xffff = 0x2ff; + + TempletOperate(); + + // 通过 WsMessage 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + +/// +/// 实体构造操作 +/// +struct MESSAGEBASIC_EXPORT EntityOperate : public AbstractMessage { + uint64_t _operate_code = (uint64_t)EntityOperateType::NEW; + QString _template_name = ""; + QString _entity_name = ""; + uint64_t _entity_id_over_0xffff = 0xffff; + + EntityOperate(); + + // 通过 WsMessage 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + +struct MESSAGEBASIC_EXPORT ComponentOperate : public AbstractMessage { + uint64_t _entity_id_within_0x2ff_0xffffffffffffffff = 0x2ff; + QStringList _component_types; + + ComponentOperate(); // 通过 WsMessage 继承 void recoveryFrom(const QJsonObject& obj) override; @@ -135,6 +195,31 @@ struct MESSAGEBASIC_EXPORT EntityTotalList : public AbstractMessage { EntityTotalList(); + // 通过 WsMessage 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + +// componoents_desc =================================== + +/// +/// 获取指定实体的所有组件数据 +/// +struct MESSAGEBASIC_EXPORT ComponentInfosQuery : public AbstractMessage { + uint64_t _bind_entity_id = 0; + + ComponentInfosQuery(); + + // 通过 WsMessage 继承 + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; +}; + +struct MESSAGEBASIC_EXPORT ComponentInfoQueryResult : public AbstractMessage { + QJsonObject _entity_json; + + ComponentInfoQueryResult(); + // 通过 WsMessage 继承 void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; diff --git a/SimsBasic/simsbasic.cpp b/SimsBasic/simsbasic.cpp index 4ebce07..315a387 100644 --- a/SimsBasic/simsbasic.cpp +++ b/SimsBasic/simsbasic.cpp @@ -39,6 +39,8 @@ QString RtEntity::name() const { void RtEntity::append(std::shared_ptr ins) { if (this->_comps_list.contains(ins->name())) return; + + ins->bindEntity(this->shared_from_this()); this->_comps_list[ins->name()] = ins; } @@ -191,6 +193,16 @@ void EntitiesManager::saveTo(QJsonObject& obj) const obj["component_array"] = array; } +void EntitiesManager::remove(const QString& component_type) +{ + this->_comps_list.remove(component_type); +} + +QList> EntitiesManager::components() const +{ + return this->_comps_list.values(); +} + ImmediateCore::ImmediateCore(std::shared_ptr bind) :_bind_entity(bind) {} uint64_t ImmediateCore::entityManagerID() const diff --git a/SimsBasic/simsbasic.h b/SimsBasic/simsbasic.h index d989a70..410f317 100644 --- a/SimsBasic/simsbasic.h +++ b/SimsBasic/simsbasic.h @@ -95,49 +95,6 @@ public: /// using WsRespondEntry = std::function map, std::shared_ptr, QList>&)>; -/// -/// 功能插件的基类 -/// -class WsComponent : public Serializable, public std::enable_shared_from_this { -public: - virtual ~WsComponent() = default; - - /// - /// 克隆一个具有相同数据的实例 - /// - /// 实例指针 - virtual std::shared_ptr defaultNew() const = 0; - /// - /// 绑定Entity - /// - /// EntityID - virtual void bindEntity(uint64_t entity_id) = 0; - - /// - /// 插件唯一命名 - /// - /// 插件名 - virtual QString name() const = 0; - - /// - /// 允许输入的消息类型 - /// - /// 消息类型集合 - virtual QList inputTypes() const = 0; - /// - /// 通过指定的签名获取处理入口 - /// - /// 处理签名 - /// 处理接口 - virtual QList getEntryWithSignature(const WsRespondSignatureType& t) const = 0; - /// - /// 通过输入消息类型获取处理入口 - /// - /// 输入消息类型 - /// 处理接口列表 - virtual QList getEntrysWithInType(const QString& msg_type) const = 0; -}; - class WsEntity : public Serializable { public: virtual ~WsEntity() = default; @@ -179,11 +136,73 @@ public: virtual QList getEntryWithInType(const QString& msg_type) const = 0; }; +/// +/// 功能插件的基类 +/// +class WsComponent : public Serializable, public std::enable_shared_from_this { +public: + virtual ~WsComponent() = default; + + /// + /// 克隆一个具有相同数据的实例 + /// + /// 实例指针 + virtual std::shared_ptr defaultNew() const = 0; + /// + /// 绑定Entity + /// + /// 实体实例 + virtual void bindEntity(std::weak_ptr host) = 0; + + /// + /// 插件唯一命名 + /// + /// 插件名 + virtual QString name() const = 0; + + /// + /// 允许输入的消息类型 + /// + /// 消息类型集合 + virtual QList inputTypes() const = 0; + /// + /// 通过指定的签名获取处理入口 + /// + /// 处理签名 + /// 处理接口 + virtual QList getEntryWithSignature(const WsRespondSignatureType& t) const = 0; + /// + /// 通过输入消息类型获取处理入口 + /// + /// 输入消息类型 + /// 处理接口列表 + virtual QList getEntrysWithInType(const QString& msg_type) const = 0; +}; + +class ComponentSet { +public: + /// + /// 为本实例添加指定类型的插件 + /// + /// + virtual void append(std::shared_ptr ins) = 0; + /// + /// 移除指定类型的插件实例 + /// + /// + virtual void remove(const QString& component_type) = 0; + /// + /// 获取本实例内包含的所有插件实例 + /// + /// + virtual QList> components() const = 0; +}; + #include /// /// 内存实体实例类型 /// -class SIMSBASIC_EXPORT RtEntity : public WsEntity, public std::enable_shared_from_this { +class SIMSBASIC_EXPORT RtEntity : public WsEntity, public ComponentSet, public std::enable_shared_from_this { private: uint64_t _entity_id = 0; QString _templet_name, _runtime_name; @@ -229,17 +248,17 @@ public: /// 为本实例添加指定类型的插件 /// /// - virtual void append(std::shared_ptr ins); + virtual void append(std::shared_ptr ins) override; /// /// 移除指定类型的插件实例 /// /// - virtual void remove(const QString& component_type); + virtual void remove(const QString& component_type) override; /// /// 获取本实例内包含的所有插件实例 /// /// - virtual QList> components() const; + virtual QList> components() const override; /// /// 深度克隆本实例,插件和数据一致 @@ -271,7 +290,9 @@ public: }; -class SIMSBASIC_EXPORT EntitiesManager : public WsEntity { +class SIMSBASIC_EXPORT EntitiesManager : public WsEntity, public ComponentSet, + public std::enable_shared_from_this +{ public: static const uint64_t const_id = 0x01ff; QHash> _comps_list; @@ -280,6 +301,9 @@ public: uint64_t entityID() const override; QString name() const override; void append(std::shared_ptr ins); + void remove(const QString& component_type) override; + QList> components() const override; + std::shared_ptr defaultNew() const override; QList getEntryWithSignature(const WsRespondSignatureType& t) const override; QList getEntryWithInType(const QString& msg_type) const override; diff --git a/SimsWorld/SimsWorld.vcxproj b/SimsWorld/SimsWorld.vcxproj index d1a14fa..292ea58 100644 --- a/SimsWorld/SimsWorld.vcxproj +++ b/SimsWorld/SimsWorld.vcxproj @@ -15,8 +15,7 @@ QtVS_v304 10.0 10.0 - $(MSBuildProjectDirectory)\QtMsBuild + $(MSBuildProjectDirectory)\QtMsBuild @@ -46,11 +45,8 @@ core;gui;widgets release - - + + @@ -64,9 +60,16 @@ + $(SolutionDir)StandardGlobe;$(SolutionDir)SimsBasic;$(SolutionDir)MessageBasic;$(SolutionDir)ComponentBasic;$(IncludePath) + $(SolutionDir)$(Platform)\$(Configuration);$(LibraryPath) + + + StandardGlobe.lib;SimsBasic.lib;MessageBasic.lib;ComponentBasic.lib;%(AdditionalDependencies) + + true @@ -96,11 +99,11 @@ - - - - - + + + + + diff --git a/SimsWorld/SimsWorld.vcxproj.filters b/SimsWorld/SimsWorld.vcxproj.filters index e0efcd9..e293b4c 100644 --- a/SimsWorld/SimsWorld.vcxproj.filters +++ b/SimsWorld/SimsWorld.vcxproj.filters @@ -35,14 +35,6 @@ Source Files - - - - Resource Files - - - Resource Files - Resource Files @@ -50,4 +42,9 @@ Resource Files - + + + Source Files + + + \ No newline at end of file diff --git a/SimsWorld/sims_world.cpp b/SimsWorld/sims_world.cpp index 0875831..c5d52e7 100644 --- a/SimsWorld/sims_world.cpp +++ b/SimsWorld/sims_world.cpp @@ -1,9 +1,12 @@ #include "sims_world.h" SimsWorld::SimsWorld(QWidget *parent) - : QMainWindow(parent) + : QMainWindow(parent), + _backend_ins(std::make_shared()) { ui.setupUi(this); + + _backend_ins->init_backend(); } SimsWorld::~SimsWorld() diff --git a/SimsWorld/sims_world.h b/SimsWorld/sims_world.h index 921040f..4d9d9e6 100644 --- a/SimsWorld/sims_world.h +++ b/SimsWorld/sims_world.h @@ -2,6 +2,7 @@ #include #include "ui_sims_world.h" +#include class SimsWorld : public QMainWindow { @@ -13,4 +14,5 @@ public: private: Ui::SimsWorldClass ui; + std::shared_ptr _backend_ins; };