实现MapKernel的序列化和反序列化
This commit is contained in:
parent
4035690976
commit
17d44f1002
|
@ -51,7 +51,7 @@ QString BehaviorPerformPlugin::name() const
|
|||
|
||||
#include <MessageLoader.h>
|
||||
MapKernal::MapKernal(std::shared_ptr<MessageLoader> ins)
|
||||
: _bind_loader(ins) {
|
||||
:_bind_loader(ins) {
|
||||
}
|
||||
|
||||
QList<QString> MapKernal::compareTypes() const
|
||||
|
@ -65,7 +65,7 @@ void MapKernal::registCompare(std::shared_ptr<CompareDelegate> ins)
|
|||
emit this->compareTypeListChanged();
|
||||
}
|
||||
|
||||
std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name)
|
||||
std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name) const
|
||||
{
|
||||
if (!_compare_types.contains(name))
|
||||
return nullptr;
|
||||
|
@ -83,7 +83,7 @@ QList<QString> MapKernal::convertTypes() const
|
|||
return _convert_types.keys();
|
||||
}
|
||||
|
||||
std::shared_ptr<ConvertDelegate> MapKernal::getConvert(const QString& name)
|
||||
std::shared_ptr<ConvertDelegate> MapKernal::getConvert(const QString& name) const
|
||||
{
|
||||
if (!_convert_types.contains(name))
|
||||
return nullptr;
|
||||
|
@ -95,17 +95,12 @@ void MapKernal::registExecute(std::shared_ptr<ExecuteDelegate> ins)
|
|||
_execute_types[ins->typeName()] = ins;
|
||||
}
|
||||
|
||||
std::shared_ptr<MessageLoader> MapKernal::messageLoader() const
|
||||
{
|
||||
return this->_bind_loader;
|
||||
}
|
||||
|
||||
void MapKernal::initial()
|
||||
{
|
||||
// 注册基础数据类型
|
||||
registData(std::make_shared<GeneralData>());
|
||||
for (auto key : messageLoader()->allType())
|
||||
registData(messageLoader()->makeDefault(key));
|
||||
for (auto key : _bind_loader->allType())
|
||||
registData(_bind_loader->makeDefault(key));
|
||||
|
||||
// 注册可用节点类型
|
||||
registNode(std::make_shared<SequenceNode>(this->shared_from_this()));
|
||||
|
@ -117,6 +112,11 @@ void MapKernal::initial()
|
|||
registNode(std::make_shared<BehaviorMapNode>(this->shared_from_this()));
|
||||
}
|
||||
|
||||
QJSEngine& MapKernal::bindEngine()
|
||||
{
|
||||
return this->_core_engine;
|
||||
}
|
||||
|
||||
void MapKernal::registData(std::shared_ptr<TopicData> init)
|
||||
{
|
||||
if (_variable_types.contains(init->topicString()))
|
||||
|
@ -130,7 +130,7 @@ QList<QString> MapKernal::dataTypes() const
|
|||
return _variable_types.keys();
|
||||
}
|
||||
|
||||
std::shared_ptr<TopicData> MapKernal::getData(const QString& topic)
|
||||
std::shared_ptr<TopicData> MapKernal::getData(const QString& topic) const
|
||||
{
|
||||
return _variable_types[topic];
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ QList<QString> MapKernal::executeTypes() const
|
|||
return _execute_types.keys();
|
||||
}
|
||||
|
||||
std::shared_ptr<ExecuteDelegate> MapKernal::getExecute(const QString& name)
|
||||
std::shared_ptr<ExecuteDelegate> MapKernal::getExecute(const QString& name) const
|
||||
{
|
||||
return _execute_types[name];
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ QList<QString> MapKernal::nodeTypes() const
|
|||
return _logicalnode_types.keys();
|
||||
}
|
||||
|
||||
std::shared_ptr<LogicalNode> MapKernal::getNode(const QString& name)
|
||||
std::shared_ptr<LogicalNode> MapKernal::getNode(const QString& name) const
|
||||
{
|
||||
return _logicalnode_types[name];
|
||||
}
|
||||
|
@ -165,6 +165,104 @@ std::shared_ptr<Serializable> MapKernal::newDefault() const
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
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<CompareDelegate>(_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<ConvertDelegate>(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<MapKernal> kernal)
|
||||
:_node_type(t), _bind_kernal(kernal) {
|
||||
}
|
||||
|
@ -239,8 +337,8 @@ void BehaviorMapNode::setVariable(const QString& key, IO_TYPE t, std::shared_ptr
|
|||
QList<QString> BehaviorMapNode::inputVariableKeys() const
|
||||
{
|
||||
QList<QString> 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<TopicData> vleft, std::shared_ptr<
|
|||
return true;
|
||||
}
|
||||
|
||||
#include <exception>
|
||||
std::shared_ptr<Serializable> CompareDelegate::newDefault() const
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CompareDelegate::recoveryFrom(const QJsonObject& obj)
|
||||
{
|
||||
}
|
||||
|
||||
void CompareDelegate::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
}
|
||||
|
||||
ConvertDelegate::ConvertDelegate(std::shared_ptr<MapKernal> host, QJSEngine& bind_engine, const QString& func)
|
||||
: _host_bind(host), _script_engine(bind_engine), _function_name(func) {
|
||||
}
|
||||
|
@ -770,6 +882,21 @@ std::shared_ptr<TopicData> ConvertDelegate::convert(const QList<std::shared_ptr<
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> ConvertDelegate::newDefault() const
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ConvertDelegate::recoveryFrom(const QJsonObject& obj)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ConvertDelegate::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ExecuteNode::ExecuteNode(std::shared_ptr<MapKernal> ins)
|
||||
: LogicalNode(NodeKind::ACTIONNODE, ins) {
|
||||
}
|
||||
|
@ -955,10 +1082,10 @@ std::shared_ptr<Serializable> ModifiedNode::newDefault() const
|
|||
|
||||
void ModifiedNode::recoveryFrom(const QJsonObject& obj)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ModifiedNode::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -18,8 +18,8 @@ struct COMPONENTBASIC_EXPORT GeneralData : public TopicData {
|
|||
QJsonObject _element_bind;
|
||||
|
||||
QString topicString() const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
void recoveryFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
};
|
||||
|
@ -37,6 +37,7 @@ private:
|
|||
/// 绑定载入器
|
||||
/// </summary>
|
||||
std::shared_ptr<MessageLoader> _bind_loader;
|
||||
QJSEngine _core_engine;
|
||||
|
||||
/// <summary>
|
||||
/// {Topic,default-value}
|
||||
|
@ -76,13 +77,8 @@ public:
|
|||
MapKernal(std::shared_ptr<MessageLoader> ins);
|
||||
virtual ~MapKernal() = default;
|
||||
|
||||
/// <summary>
|
||||
/// »ñÈ¡MessageLoaderµ¥Àý
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
std::shared_ptr<MessageLoader> messageLoader() const;
|
||||
|
||||
void initial();
|
||||
QJSEngine& bindEngine();
|
||||
|
||||
// 数据类型管理 ======================================================
|
||||
/// <summary>
|
||||
|
@ -100,7 +96,7 @@ public:
|
|||
/// </summary>
|
||||
/// <param name="topic"></param>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<TopicData> getData(const QString& topic);
|
||||
virtual std::shared_ptr<TopicData> getData(const QString& topic) const;
|
||||
|
||||
|
||||
|
||||
|
@ -121,7 +117,7 @@ public:
|
|||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<LogicalNode> getNode(const QString& name);
|
||||
virtual std::shared_ptr<LogicalNode> getNode(const QString& name) const;
|
||||
|
||||
|
||||
|
||||
|
@ -142,7 +138,7 @@ public:
|
|||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<CompareDelegate> getCompare(const QString& name);
|
||||
virtual std::shared_ptr<CompareDelegate> getCompare(const QString& name) const;
|
||||
|
||||
|
||||
|
||||
|
@ -163,7 +159,7 @@ public:
|
|||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<ConvertDelegate> getConvert(const QString& name);
|
||||
virtual std::shared_ptr<ConvertDelegate> getConvert(const QString& name) const;
|
||||
|
||||
|
||||
|
||||
|
@ -183,20 +179,20 @@ public:
|
|||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name);
|
||||
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name) const;
|
||||
|
||||
|
||||
|
||||
// 通过 Serializable 继承
|
||||
std::shared_ptr<Serializable> 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;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 比较关系实例
|
||||
/// </summary>
|
||||
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<TopicData> vleft, std::shared_ptr<TopicData> vright);
|
||||
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
void recoveryFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 数据转换实例
|
||||
/// </summary>
|
||||
class COMPONENTBASIC_EXPORT ConvertDelegate {
|
||||
class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable {
|
||||
public:
|
||||
typedef QString DATA_TOPIC_STRING;
|
||||
|
||||
|
@ -256,6 +257,9 @@ public:
|
|||
/// <returns></returns>
|
||||
std::shared_ptr<TopicData> convert(const QList<std::shared_ptr<TopicData>>& input_variables);
|
||||
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
void recoveryFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
private:
|
||||
std::shared_ptr<MapKernal> _host_bind;
|
||||
|
||||
|
|
Loading…
Reference in New Issue