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;
};