From 17d44f10029517a550127f0555d8c36eb6372a04 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 5 Jul 2025 01:42:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0MapKernel=E7=9A=84=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=92=8C=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ComponentBasic/BehaviorPerform.cpp | 161 ++++++++++++++++++++++++++--- ComponentBasic/BehaviorPerform.h | 36 ++++--- 2 files changed, 164 insertions(+), 33 deletions(-) diff --git a/ComponentBasic/BehaviorPerform.cpp b/ComponentBasic/BehaviorPerform.cpp index 7238290..4ad40f0 100644 --- a/ComponentBasic/BehaviorPerform.cpp +++ b/ComponentBasic/BehaviorPerform.cpp @@ -51,7 +51,7 @@ QString BehaviorPerformPlugin::name() const #include MapKernal::MapKernal(std::shared_ptr ins) - : _bind_loader(ins) { + :_bind_loader(ins) { } QList MapKernal::compareTypes() const @@ -65,7 +65,7 @@ void MapKernal::registCompare(std::shared_ptr ins) emit this->compareTypeListChanged(); } -std::shared_ptr MapKernal::getCompare(const QString& name) +std::shared_ptr MapKernal::getCompare(const QString& name) const { if (!_compare_types.contains(name)) return nullptr; @@ -83,7 +83,7 @@ QList MapKernal::convertTypes() const return _convert_types.keys(); } -std::shared_ptr MapKernal::getConvert(const QString& name) +std::shared_ptr MapKernal::getConvert(const QString& name) const { if (!_convert_types.contains(name)) return nullptr; @@ -95,17 +95,12 @@ void MapKernal::registExecute(std::shared_ptr ins) _execute_types[ins->typeName()] = ins; } -std::shared_ptr MapKernal::messageLoader() const -{ - return this->_bind_loader; -} - void MapKernal::initial() { // 注册基础数据类型 registData(std::make_shared()); - for (auto key : messageLoader()->allType()) - registData(messageLoader()->makeDefault(key)); + for (auto key : _bind_loader->allType()) + registData(_bind_loader->makeDefault(key)); // 注册可用节点类型 registNode(std::make_shared(this->shared_from_this())); @@ -117,6 +112,11 @@ void MapKernal::initial() registNode(std::make_shared(this->shared_from_this())); } +QJSEngine& MapKernal::bindEngine() +{ + return this->_core_engine; +} + void MapKernal::registData(std::shared_ptr init) { if (_variable_types.contains(init->topicString())) @@ -130,7 +130,7 @@ QList MapKernal::dataTypes() const return _variable_types.keys(); } -std::shared_ptr MapKernal::getData(const QString& topic) +std::shared_ptr MapKernal::getData(const QString& topic) const { return _variable_types[topic]; } @@ -140,7 +140,7 @@ QList MapKernal::executeTypes() const return _execute_types.keys(); } -std::shared_ptr MapKernal::getExecute(const QString& name) +std::shared_ptr MapKernal::getExecute(const QString& name) const { return _execute_types[name]; } @@ -155,7 +155,7 @@ QList MapKernal::nodeTypes() const return _logicalnode_types.keys(); } -std::shared_ptr MapKernal::getNode(const QString& name) +std::shared_ptr MapKernal::getNode(const QString& name) const { return _logicalnode_types[name]; } @@ -165,6 +165,104 @@ std::shared_ptr MapKernal::newDefault() const return nullptr; } + +#include +#include +void MapKernal::recoveryFrom(const QJsonObject& obj) +{ + QStringList compares, converts, executes, variable_keys; + STRLIST_PEAK(executes); + STRLIST_PEAK(variable_keys); + STRLIST_PEAK(compares); + STRLIST_PEAK(converts); + + // 执行器类型校验 + for (auto key : executes) { + if (this->executeTypes().contains(key)) + continue; + throw new UniException("当前环境不包含指定执行器类型:" + key); + } + + // 变量类型校验 + for (auto key : variable_keys) { + if (this->dataTypes().contains(key)) + continue; + throw new UniException("当前环境不包含指定变量类型:" + key); + } + + this->_compare_types.clear(); + // 提取比较器代码 + auto compare_array = obj["compare_objs"].toArray(); + for (auto idx = 0; idx < compare_array.size(); ++idx) { + auto compare_obj = compare_array.at(idx); + auto func_name = compare_obj["name"].toString(); + auto func_obj = compare_obj["define_obj"].toObject(); + + auto compare_ins = std::make_shared(_core_engine, func_name); + compare_ins->recoveryFrom(func_obj); + + this->registCompare(compare_ins); + } + + this->_convert_types.clear(); + // 提取转换器代码 + auto convert_array = obj["convert_objs"].toArray(); + for (auto idx = 0; idx < convert_array.size(); ++idx) { + auto convert_obj = convert_array.at(idx); + auto func_name = convert_obj["name"].toString(); + auto func_obj = convert_obj["define_obj"].toObject(); + + auto convert_ins = std::make_shared(this->shared_from_this(), _core_engine, func_name); + convert_ins->recoveryFrom(func_obj); + + this->registConvert(convert_ins); + } +} + + +void MapKernal::saveTo(QJsonObject& obj) const +{ + // 保存比较器代码 + QStringList compares = this->compareTypes(); + STRLIST_SAVE(compares); + QJsonArray compare_array; + for (auto ins_key : compares) { + auto ins_compare = this->getCompare(ins_key); + + QJsonObject compare_obj, ins_entity; + compare_obj["name"] = ins_key; + ins_compare->saveTo(ins_entity); + compare_obj["define_obj"] = ins_entity; + + compare_array.append(compare_obj); + } + obj["compare_objs"] = compare_array; + + // 保存转换器代码 + QStringList converts = this->convertTypes(); + STRLIST_SAVE(converts); + QJsonArray convert_array; + for (auto ins_key : converts) { + auto ins_convert = this->getConvert(ins_key); + + QJsonObject convert_obj, ins_entity; + convert_obj["name"] = ins_key; + ins_convert->saveTo(ins_entity); + convert_obj["define_obj"] = ins_entity; + + convert_array.append(convert_obj); + } + obj["convert_objs"] = convert_array; + + // 保存执行器清单 + QStringList executes = this->executeTypes(); + STRLIST_SAVE(executes); + + // 保存变量类型清单 + QStringList variable_keys = this->dataTypes(); + STRLIST_SAVE(variable_keys); +} + LogicalNode::LogicalNode(NodeKind t, std::shared_ptr kernal) :_node_type(t), _bind_kernal(kernal) { } @@ -239,8 +337,8 @@ void BehaviorMapNode::setVariable(const QString& key, IO_TYPE t, std::shared_ptr QList BehaviorMapNode::inputVariableKeys() const { QList keys; - for(auto key : this->_variables.keys()) - if(this->_variables[key].first == IO_TYPE::INPUT) + for (auto key : this->_variables.keys()) + if (this->_variables[key].first == IO_TYPE::INPUT) keys << key; return keys; @@ -736,6 +834,20 @@ bool CompareDelegate::compare(std::shared_ptr vleft, std::shared_ptr< return true; } +#include +std::shared_ptr CompareDelegate::newDefault() const +{ + return nullptr; +} + +void CompareDelegate::recoveryFrom(const QJsonObject& obj) +{ +} + +void CompareDelegate::saveTo(QJsonObject& obj) const +{ +} + ConvertDelegate::ConvertDelegate(std::shared_ptr host, QJSEngine& bind_engine, const QString& func) : _host_bind(host), _script_engine(bind_engine), _function_name(func) { } @@ -770,6 +882,21 @@ std::shared_ptr ConvertDelegate::convert(const QList ConvertDelegate::newDefault() const +{ + return nullptr; +} + +void ConvertDelegate::recoveryFrom(const QJsonObject& obj) +{ + +} + +void ConvertDelegate::saveTo(QJsonObject& obj) const +{ + +} + ExecuteNode::ExecuteNode(std::shared_ptr ins) : LogicalNode(NodeKind::ACTIONNODE, ins) { } @@ -955,10 +1082,10 @@ std::shared_ptr ModifiedNode::newDefault() const void ModifiedNode::recoveryFrom(const QJsonObject& obj) { - + } void ModifiedNode::saveTo(QJsonObject& obj) const { - + } diff --git a/ComponentBasic/BehaviorPerform.h b/ComponentBasic/BehaviorPerform.h index f770fa1..bb24ccb 100644 --- a/ComponentBasic/BehaviorPerform.h +++ b/ComponentBasic/BehaviorPerform.h @@ -18,8 +18,8 @@ struct COMPONENTBASIC_EXPORT GeneralData : public TopicData { QJsonObject _element_bind; QString topicString() const override; - std::shared_ptr newDefault() const override; + std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; @@ -37,6 +37,7 @@ private: /// 绑定载入器 /// std::shared_ptr _bind_loader; + QJSEngine _core_engine; /// /// {Topic,default-value} @@ -76,13 +77,8 @@ public: MapKernal(std::shared_ptr ins); virtual ~MapKernal() = default; - /// - /// 获取MessageLoader单例 - /// - /// - std::shared_ptr messageLoader() const; - void initial(); + QJSEngine& bindEngine(); // 数据类型管理 ====================================================== /// @@ -100,7 +96,7 @@ public: /// /// /// - virtual std::shared_ptr getData(const QString& topic); + virtual std::shared_ptr getData(const QString& topic) const; @@ -121,7 +117,7 @@ public: /// /// /// - virtual std::shared_ptr getNode(const QString& name); + virtual std::shared_ptr getNode(const QString& name) const; @@ -142,7 +138,7 @@ public: /// /// /// - virtual std::shared_ptr getCompare(const QString& name); + virtual std::shared_ptr getCompare(const QString& name) const; @@ -163,7 +159,7 @@ public: /// /// /// - virtual std::shared_ptr getConvert(const QString& name); + virtual std::shared_ptr getConvert(const QString& name) const; @@ -183,20 +179,20 @@ public: /// /// /// - virtual std::shared_ptr getExecute(const QString& name); + virtual std::shared_ptr getExecute(const QString& name) const; // 通过 Serializable 继承 std::shared_ptr newDefault() const override; - void recoveryFrom(const QJsonObject& obj) override {} - void saveTo(QJsonObject& obj) const override {} + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; }; /// /// 比较关系实例 /// -class COMPONENTBASIC_EXPORT CompareDelegate { +class COMPONENTBASIC_EXPORT CompareDelegate : public Serializable { private: QJSEngine& _script_engine; QString _function_name; @@ -206,12 +202,17 @@ public: QString name() const; bool compare(std::shared_ptr vleft, std::shared_ptr vright); + + std::shared_ptr newDefault() const override; + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + }; /// /// 数据转换实例 /// -class COMPONENTBASIC_EXPORT ConvertDelegate { +class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable { public: typedef QString DATA_TOPIC_STRING; @@ -256,6 +257,9 @@ public: /// std::shared_ptr convert(const QList>& input_variables); + std::shared_ptr newDefault() const override; + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; private: std::shared_ptr _host_bind;