SimsWorld/ComponentBasic/BehaviorPerform.cpp

1151 lines
25 KiB
C++
Raw Permalink Normal View History

2025-06-25 14:34:26 +00:00
#include "BehaviorPerform.h"
2025-06-28 17:38:37 +00:00
void BehaviorPerformPlugin::mapReset(const QString& path)
{
}
void BehaviorPerformPlugin::execute(std::shared_ptr<const EntityInitialRequest> in, QList<std::shared_ptr<RespondDefault>>& out)
{
}
void BehaviorPerformPlugin::execute(std::shared_ptr<const EntityPreparedRequest> in, QList<std::shared_ptr<RespondDefault>>& out)
{
}
void BehaviorPerformPlugin::execute(std::shared_ptr<const SyncRequest> in, QList<std::shared_ptr<RespondDefault>>& out)
{
}
void BehaviorPerformPlugin::execute(std::shared_ptr<const DeduceRequest> in, QList<std::shared_ptr<RespondDefault>>& out)
{
}
2025-06-25 14:34:26 +00:00
void BehaviorPerformPlugin::recoveryFrom(const QJsonObject& obj)
{
}
void BehaviorPerformPlugin::saveTo(QJsonObject& obj) const
{
}
2025-06-28 17:38:37 +00:00
std::shared_ptr<Serializable> BehaviorPerformPlugin::newDefault() const
2025-06-25 14:34:26 +00:00
{
2025-06-28 17:38:37 +00:00
return std::make_shared<BehaviorPerformPlugin>();
2025-06-25 14:34:26 +00:00
}
void BehaviorPerformPlugin::bindEntity(std::weak_ptr<WsEntity> host)
{
2025-06-28 17:38:37 +00:00
this->_bind_entity = host;
2025-06-25 14:34:26 +00:00
}
QString BehaviorPerformPlugin::name() const
{
2025-06-28 17:38:37 +00:00
return NAME(BehaviorPerformPlugin);
2025-06-25 14:34:26 +00:00
}
2025-06-28 17:38:37 +00:00
#include <MessageLoader.h>
2025-07-11 19:15:53 +00:00
#include "exec_delegate.h"
2025-07-04 17:45:32 +00:00
MapKernel::MapKernel(std::shared_ptr<MessageLoader> ins)
:_bind_loader(ins) {
2025-07-11 19:15:53 +00:00
auto output = std::make_shared<ConsolePresent>();
this->_execute_types[output->typeName()] = output;
2025-06-28 17:38:37 +00:00
}
2025-07-04 17:45:32 +00:00
QList<QString> MapKernel::compareTypes() const
2025-06-28 17:38:37 +00:00
{
return _compare_types.keys();
}
2025-07-04 17:45:32 +00:00
void MapKernel::registCompare(std::shared_ptr<CompareDelegate> ins)
2025-06-25 14:34:26 +00:00
{
2025-06-28 17:38:37 +00:00
_compare_types[ins->name()] = ins;
2025-06-30 16:45:32 +00:00
emit this->compareTypeListChanged();
2025-06-25 14:34:26 +00:00
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<CompareDelegate> MapKernel::getCompare(const QString& name) const
2025-06-25 14:34:26 +00:00
{
2025-06-28 17:38:37 +00:00
if (!_compare_types.contains(name))
2025-06-25 14:34:26 +00:00
return nullptr;
2025-06-28 17:38:37 +00:00
return _compare_types[name];
}
2025-07-04 17:45:32 +00:00
void MapKernel::registConvert(std::shared_ptr<ConvertDelegate> ins)
2025-06-28 17:38:37 +00:00
{
_convert_types[ins->name()] = ins;
2025-06-30 16:45:32 +00:00
emit this->convertTypeListChanged();
2025-06-28 17:38:37 +00:00
}
2025-07-04 17:45:32 +00:00
QList<QString> MapKernel::convertTypes() const
2025-06-28 17:38:37 +00:00
{
return _convert_types.keys();
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<ConvertDelegate> MapKernel::getConvert(const QString& name) const
2025-06-28 17:38:37 +00:00
{
if (!_convert_types.contains(name))
return nullptr;
return _convert_types[name];
}
2025-07-04 17:45:32 +00:00
void MapKernel::registExecute(std::shared_ptr<ExecuteDelegate> ins)
2025-06-30 05:49:36 +00:00
{
_execute_types[ins->typeName()] = ins;
}
2025-07-06 06:36:43 +00:00
struct JsonString : public TopicData {
QString _string_content;
// ͨ<><CDA8> TopicData <20>̳<EFBFBD>
std::shared_ptr<Serializable> newDefault() const override
{
return std::shared_ptr<JsonString>();
}
void recoveryFrom(const QJsonObject& obj) override
{
STRING_PEAK(_string_content);
}
void saveTo(QJsonObject& obj) const override
{
STRING_SAVE(_string_content);
}
QString topicString() const override
{
return NAME(JsonString);
}
};
2025-07-04 17:45:32 +00:00
void MapKernel::initial()
2025-06-30 16:45:32 +00:00
{
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
registData(std::make_shared<GeneralData>());
2025-07-06 06:36:43 +00:00
registData(std::make_shared<JsonString>());
for (auto key : _bind_loader->allType())
registData(_bind_loader->makeDefault(key));
2025-06-30 16:45:32 +00:00
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2025-07-04 15:07:33 +00:00
registNode(std::make_shared<SequenceNode>(this->shared_from_this()));
registNode(std::make_shared<SelectorNode>(this->shared_from_this()));
registNode(std::make_shared<ParallelNode>(this->shared_from_this()));
2025-06-30 16:45:32 +00:00
registNode(std::make_shared<CompareNode>(this->shared_from_this()));
registNode(std::make_shared<ExecuteNode>(this->shared_from_this()));
2025-07-04 15:26:36 +00:00
registNode(std::make_shared<ModifiedNode>(this->shared_from_this()));
2025-06-30 16:45:32 +00:00
registNode(std::make_shared<BehaviorMapNode>(this->shared_from_this()));
}
2025-07-04 17:45:32 +00:00
QJSEngine& MapKernel::bindEngine()
{
return this->_core_engine;
}
2025-07-04 17:45:32 +00:00
void MapKernel::registData(std::shared_ptr<TopicData> init)
2025-06-28 17:38:37 +00:00
{
if (_variable_types.contains(init->topicString()))
2025-06-29 17:19:07 +00:00
throw new UniException(QString(u8"<EFBFBD>ظ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{%1}").arg(init->topicString()));
2025-06-28 17:38:37 +00:00
_variable_types[init->topicString()] = init;
}
2025-07-04 17:45:32 +00:00
QList<QString> MapKernel::dataTypes() const
2025-06-28 17:38:37 +00:00
{
return _variable_types.keys();
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<TopicData> MapKernel::getData(const QString& topic) const
2025-06-28 17:38:37 +00:00
{
return _variable_types[topic];
}
2025-07-04 17:45:32 +00:00
QList<QString> MapKernel::executeTypes() const
2025-06-30 05:49:36 +00:00
{
return _execute_types.keys();
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<ExecuteDelegate> MapKernel::getExecute(const QString& name) const
2025-06-30 05:49:36 +00:00
{
return _execute_types[name];
}
2025-07-04 17:45:32 +00:00
void MapKernel::registNode(std::shared_ptr<LogicalNode> ins)
2025-06-30 05:49:36 +00:00
{
_logicalnode_types[ins->typeName()] = ins;
}
2025-07-04 17:45:32 +00:00
QList<QString> MapKernel::nodeTypes() const
2025-06-30 05:49:36 +00:00
{
return _logicalnode_types.keys();
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<LogicalNode> MapKernel::getNode(const QString& name) const
2025-06-30 05:49:36 +00:00
{
return _logicalnode_types[name];
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<Serializable> MapKernel::newDefault() const
2025-06-28 17:38:37 +00:00
{
return nullptr;
}
#include <QJsonArray>
#include <QJsonObject>
2025-07-04 17:45:32 +00:00
void MapKernel::recoveryFrom(const QJsonObject& obj)
{
QStringList compares, converts, executes, variable_keys;
STRLIST_PEAK(executes);
STRLIST_PEAK(variable_keys);
STRLIST_PEAK(compares);
STRLIST_PEAK(converts);
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
for (auto key : executes) {
if (this->executeTypes().contains(key))
continue;
throw new UniException("<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>" + key);
2025-07-06 06:36:43 +00:00
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
for (auto key : variable_keys) {
if (this->dataTypes().contains(key))
continue;
throw new UniException("<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>" + key);
}
this->_compare_types.clear();
// <20><>ȡ<EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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();
// <20><>ȡת<C8A1><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
}
}
2025-07-04 17:45:32 +00:00
void MapKernel::saveTo(QJsonObject& obj) const
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>
QStringList executes = this->executeTypes();
STRLIST_SAVE(executes);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QStringList variable_keys = this->dataTypes();
STRLIST_SAVE(variable_keys);
}
2025-07-04 17:45:32 +00:00
LogicalNode::LogicalNode(NodeKind t, std::shared_ptr<MapKernel> kernal)
2025-07-04 14:53:03 +00:00
:_node_type(t), _bind_kernal(kernal) {
2025-06-28 17:38:37 +00:00
}
2025-06-29 14:58:45 +00:00
void LogicalNode::_set_parent_node(std::weak_ptr<LogicalNode> pnode)
2025-06-28 17:38:37 +00:00
{
this->_parent_bind = pnode;
}
2025-06-29 12:30:32 +00:00
NodeKind LogicalNode::nodeKind() const
2025-06-28 17:38:37 +00:00
{
return _node_type;
}
2025-06-29 17:19:07 +00:00
int LogicalNode::depth() const
{
auto node_temp = this->parent().lock();
if (!node_temp) return 0;
return this->parent().lock()->depth() + 1;
}
2025-07-02 17:11:48 +00:00
std::shared_ptr<BehaviorMapNode> LogicalNode::bindMap() const
2025-06-28 17:38:37 +00:00
{
2025-06-29 12:30:32 +00:00
auto node_temp = this->parent().lock();
2025-06-28 17:38:37 +00:00
if (!node_temp) return nullptr;
2025-06-29 12:30:32 +00:00
while (node_temp->nodeKind() != NodeKind::MAPNODE) {
node_temp = node_temp->parent().lock();
2025-06-28 17:38:37 +00:00
}
2025-07-02 17:11:48 +00:00
return std::dynamic_pointer_cast<BehaviorMapNode>(node_temp);
2025-06-28 17:38:37 +00:00
}
2025-07-04 17:45:32 +00:00
std::shared_ptr<MapKernel> LogicalNode::getKernal() const
2025-07-04 15:07:33 +00:00
{
return _bind_kernal;
}
2025-06-28 17:38:37 +00:00
void LogicalNode::setID(int unique_id)
{
this->_node_id = unique_id;
}
int LogicalNode::getID() const
{
return this->_node_id;
}
2025-06-29 14:58:45 +00:00
QString LogicalNode::rtName() const
2025-06-28 17:38:37 +00:00
{
2025-06-29 17:19:07 +00:00
return QString(u8"%1(%2)").arg(this->typeName()).arg(getID());
2025-06-28 17:38:37 +00:00
}
2025-06-29 12:30:32 +00:00
std::weak_ptr<LogicalNode> LogicalNode::parent() const
2025-06-28 17:38:37 +00:00
{
return this->_parent_bind;
}
2025-07-04 17:45:32 +00:00
BehaviorMapNode::BehaviorMapNode(std::shared_ptr<MapKernel> core)
2025-07-04 15:26:36 +00:00
:LogicalNode(NodeKind::MAPNODE, core) {
2025-07-02 17:11:48 +00:00
}
2025-06-28 17:38:37 +00:00
void BehaviorMapNode::setVariable(const QString& key, IO_TYPE t, std::shared_ptr<TopicData> ins)
{
if (_variables.contains(key))
if (_variables[key].second->topicString() != ins->topicString())
2025-06-29 17:19:07 +00:00
throw new UniException(u8"<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>ͬһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>");
2025-06-28 17:38:37 +00:00
_variables[key] = std::make_pair(t, ins);
}
2025-07-04 16:32:32 +00:00
QList<QString> BehaviorMapNode::inputVariableKeys() const
{
QList<QString> keys;
for (auto key : this->_variables.keys())
if (this->_variables[key].first == IO_TYPE::INPUT)
2025-07-04 16:32:32 +00:00
keys << key;
return keys;
}
QList<QString> BehaviorMapNode::outputVariableKeys() const
{
QList<QString> keys;
for (auto key : this->_variables.keys())
if (this->_variables[key].first == IO_TYPE::OUTPUT)
keys << key;
return keys;
}
QList<QString> BehaviorMapNode::internalVariableKeys() const
{
QList<QString> keys;
for (auto key : this->_variables.keys())
if (this->_variables[key].first == IO_TYPE::INTERNAL)
keys << key;
return keys;
}
2025-07-04 16:32:32 +00:00
void BehaviorMapNode::removeVariable(const QString& key)
{
this->_variables.remove(key);
}
2025-06-28 17:38:37 +00:00
std::shared_ptr<TopicData> BehaviorMapNode::getVariable(const QString& key) const
{
if (!_variables.contains(key))
return nullptr;
return _variables[key].second;
}
void BehaviorMapNode::resetName(const QString& val)
{
this->_map_name = val;
}
std::shared_ptr<Serializable> BehaviorMapNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<BehaviorMapNode>(this->getKernal());
2025-06-28 17:38:37 +00:00
}
void BehaviorMapNode::recoveryFrom(const QJsonObject& obj)
{
}
void BehaviorMapNode::saveTo(QJsonObject& obj) const
{
}
QList<std::shared_ptr<LogicalNode>> BehaviorMapNode::getForwards() const
{
return children();
}
2025-07-04 16:42:29 +00:00
bool BehaviorMapNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-06-28 17:38:37 +00:00
{
this->_state_value = ste;
return true;
}
void BehaviorMapNode::reset()
{
2025-07-04 16:42:29 +00:00
this->_state_value = ExecuteResult::UNDEFINED;
2025-06-28 17:38:37 +00:00
}
QString BehaviorMapNode::rtName() const
{
return QString(u8"<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><%1>(%2)").arg(_map_name).arg(getID());
}
2025-06-28 17:38:37 +00:00
QString BehaviorMapNode::typeName() const
{
return u8"<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>";
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
ExecuteResult BehaviorMapNode::execute()
2025-06-28 17:38:37 +00:00
{
return _state_value;
}
QHash<QString, std::shared_ptr<TopicData>> BehaviorMapNode::inputList() const
{
QHash<QString, std::shared_ptr<TopicData>> list;
for (auto key : this->_variables.keys()) {
2025-06-29 17:19:07 +00:00
if (this->_variables[key].first == IO_TYPE::INPUT && key.contains(u8"::"))
2025-06-28 17:38:37 +00:00
list[key] = _variables[key].second;
}
return list;
}
QHash<QString, std::shared_ptr<TopicData>> BehaviorMapNode::outputList() const
{
QHash<QString, std::shared_ptr<TopicData>> list;
for (auto key : this->_variables.keys()) {
2025-06-29 17:19:07 +00:00
if (this->_variables[key].first == IO_TYPE::OUTPUT && key.contains(u8"::"))
2025-06-28 17:38:37 +00:00
list[key] = _variables[key].second;
}
return list;
}
2025-07-04 14:53:03 +00:00
2025-07-04 17:45:32 +00:00
SequenceNode::SequenceNode(std::shared_ptr<MapKernel> kernal)
2025-07-04 14:53:03 +00:00
: LogicalNode(NodeKind::SEQUENCENODE, kernal) {
2025-06-28 17:38:37 +00:00
}
QList<std::shared_ptr<LogicalNode>> SequenceNode::getForwards() const
{
for (auto item : children()) {
// <20>ӽڵ<D3BD>ִ<EFBFBD><D6B4>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
if (_state_map.contains(item->getID())) {
2025-07-04 16:42:29 +00:00
if (_state_map[item->getID()] != ExecuteResult::SUCCESS)
2025-06-28 17:38:37 +00:00
return QList<std::shared_ptr<LogicalNode>>();
}
// <20><>ȡ<EFBFBD>½ڵ<C2BD>
if (!_state_map.contains(item->getID()))
return QList<std::shared_ptr<LogicalNode>>() << item;
}
// ȫ<><C8AB><EFBFBD>ɹ<EFBFBD>
return QList<std::shared_ptr<LogicalNode>>();
}
QString SequenceNode::typeName() const
{
return u8"˳<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>";
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
ExecuteResult SequenceNode::execute() {
2025-06-28 17:38:37 +00:00
if (children().size() >= _state_map.size())
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
for (auto ste : this->_state_map) {
switch (ste) {
2025-07-04 16:42:29 +00:00
case ExecuteResult::SUCCESS:
2025-06-28 17:38:37 +00:00
break;
default:
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
}
}
2025-07-04 16:42:29 +00:00
return ExecuteResult::SUCCESS;
2025-06-28 17:38:37 +00:00
}
QHash<QString, std::shared_ptr<TopicData>> SequenceNode::inputList() const
{
return QHash<QString, std::shared_ptr<TopicData>>();
}
QHash<QString, std::shared_ptr<TopicData>> SequenceNode::outputList() const
{
return QHash<QString, std::shared_ptr<TopicData>>();
}
void SequenceNode::recoveryFrom(const QJsonObject& obj)
{
QStringList state_items;
STRLIST_PEAK(state_items);
for (auto kv : state_items) {
2025-06-29 17:19:07 +00:00
auto kv_pair = kv.split(u8":");
2025-07-04 16:42:29 +00:00
_state_map[kv_pair[0].toInt()] = (ExecuteResult)kv_pair[1].toInt();
2025-06-28 17:38:37 +00:00
}
}
void SequenceNode::saveTo(QJsonObject& obj) const
{
QStringList state_items;
for (auto inv : _state_map.keys()) {
2025-06-29 17:19:07 +00:00
state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]);
2025-06-28 17:38:37 +00:00
}
STRLIST_SAVE(state_items);
}
2025-07-04 16:42:29 +00:00
bool SequenceNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-06-28 17:38:37 +00:00
{
this->_state_map[node->getID()] = ste;
return true;
}
std::shared_ptr<Serializable> SequenceNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<SequenceNode>(this->getKernal());
2025-06-28 17:38:37 +00:00
}
void SequenceNode::reset()
{
this->_state_map.clear();
}
2025-06-29 14:58:45 +00:00
QList<std::shared_ptr<LogicalNode>> LogicalNode::children() const
2025-06-28 17:38:37 +00:00
{
return _child_list;
}
2025-06-29 14:58:45 +00:00
void LogicalNode::insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/)
2025-06-28 17:38:37 +00:00
{
for (auto it : _child_list)
if (it->getID() == node->getID())
return;
2025-07-04 14:53:03 +00:00
if (node->parent().lock())
2025-07-03 16:59:12 +00:00
node->parent().lock()->remove(node);
2025-06-28 17:38:37 +00:00
_child_list.insert(index, node);
2025-07-03 16:59:12 +00:00
node->_set_parent_node(this->shared_from_this());
2025-06-28 17:38:37 +00:00
}
2025-06-29 14:58:45 +00:00
void LogicalNode::remove(std::shared_ptr<LogicalNode> node)
2025-06-28 17:38:37 +00:00
{
_child_list.removeAll(node);
}
2025-07-04 17:45:32 +00:00
SelectorNode::SelectorNode(std::shared_ptr<MapKernel> kernal)
2025-07-04 15:07:33 +00:00
: LogicalNode(NodeKind::SEQUENCENODE, kernal) {
2025-06-28 17:38:37 +00:00
}
QList<std::shared_ptr<LogicalNode>> SelectorNode::getForwards() const
{
for (auto item : children()) {
// <20>ӽڵ<D3BD>ִ<EFBFBD><D6B4>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
if (_state_map.contains(item->getID())) {
2025-07-04 16:42:29 +00:00
if (_state_map[item->getID()] == ExecuteResult::SUCCESS)
2025-06-28 17:38:37 +00:00
return QList<std::shared_ptr<LogicalNode>>();
}
// <20><>ȡ<EFBFBD>½ڵ<C2BD>
if (!_state_map.contains(item->getID()))
return QList<std::shared_ptr<LogicalNode>>() << item;
}
// ȫ<><C8AB><EFBFBD>ɹ<EFBFBD>
return QList<std::shared_ptr<LogicalNode>>();
}
2025-07-04 16:42:29 +00:00
bool SelectorNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-06-28 17:38:37 +00:00
{
_state_map[node->getID()] = ste;
return true;
}
std::shared_ptr<Serializable> SelectorNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<SelectorNode>(this->getKernal());
2025-06-28 17:38:37 +00:00
}
void SelectorNode::recoveryFrom(const QJsonObject& obj)
{
QStringList state_items;
STRLIST_PEAK(state_items);
for (auto kv : state_items) {
2025-06-29 17:19:07 +00:00
auto kv_pair = kv.split(u8":");
2025-07-04 16:42:29 +00:00
_state_map[kv_pair[0].toInt()] = (ExecuteResult)kv_pair[1].toInt();
2025-06-28 17:38:37 +00:00
}
}
void SelectorNode::saveTo(QJsonObject& obj) const
{
QStringList state_items;
for (auto inv : _state_map.keys()) {
2025-06-29 17:19:07 +00:00
state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]);
2025-06-28 17:38:37 +00:00
}
STRLIST_SAVE(state_items);
}
void SelectorNode::reset()
{
_state_map.clear();
}
QString SelectorNode::typeName() const
{
return u8"ѡ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>";
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
ExecuteResult SelectorNode::execute()
2025-06-28 17:38:37 +00:00
{
for (auto value : _state_map) {
2025-07-04 16:42:29 +00:00
if (value == ExecuteResult::SUCCESS)
return ExecuteResult::SUCCESS;
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
}
QHash<QString, std::shared_ptr<TopicData>> SelectorNode::inputList() const
{
return {};
}
QHash<QString, std::shared_ptr<TopicData>> SelectorNode::outputList() const
{
return {};
}
QList<std::shared_ptr<LogicalNode>> ParallelNode::getForwards() const
{
if (this->children().size() == _state_map.size())
return QList<std::shared_ptr<LogicalNode>>();
return this->children();
}
2025-07-04 16:42:29 +00:00
bool ParallelNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-06-28 17:38:37 +00:00
{
_state_map[node->getID()] = ste;
return children().size() == _state_map.size();
}
void ParallelNode::reset()
{
_state_map.clear();
}
QString ParallelNode::typeName() const
{
return u8"<EFBFBD><EFBFBD><EFBFBD>нڵ<EFBFBD>";
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
ExecuteResult ParallelNode::execute()
2025-06-28 17:38:37 +00:00
{
for (auto ste : this->_state_map)
2025-07-04 16:42:29 +00:00
if (ste != ExecuteResult::SUCCESS)
return ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
2025-07-04 16:42:29 +00:00
return ExecuteResult::SUCCESS;
2025-06-28 17:38:37 +00:00
}
std::shared_ptr<Serializable> ParallelNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<ParallelNode>(this->getKernal());
2025-06-28 17:38:37 +00:00
}
2025-07-04 17:45:32 +00:00
ParallelNode::ParallelNode(std::shared_ptr<MapKernel> kernal)
2025-07-04 15:07:33 +00:00
: LogicalNode(NodeKind::PARALLELNODE, kernal) {
2025-06-28 17:38:37 +00:00
}
QHash<QString, std::shared_ptr<TopicData>> ParallelNode::inputList() const
{
return QHash<QString, std::shared_ptr<TopicData>>();
}
QHash<QString, std::shared_ptr<TopicData>> ParallelNode::outputList() const
{
return QHash<QString, std::shared_ptr<TopicData>>();
}
void ParallelNode::recoveryFrom(const QJsonObject& obj)
{
QStringList state_items;
STRLIST_PEAK(state_items);
for (auto kv : state_items) {
2025-06-29 17:19:07 +00:00
auto kv_pair = kv.split(u8":");
2025-07-04 16:42:29 +00:00
_state_map[kv_pair[0].toInt()] = (ExecuteResult)kv_pair[1].toInt();
2025-06-28 17:38:37 +00:00
}
}
void ParallelNode::saveTo(QJsonObject& obj) const
{
QStringList state_items;
for (auto inv : _state_map.keys()) {
2025-06-29 17:19:07 +00:00
state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]);
2025-06-28 17:38:37 +00:00
}
STRLIST_SAVE(state_items);
}
void CompareNode::reset() {
}
2025-07-04 16:42:29 +00:00
ExecuteResult CompareNode::execute()
2025-06-28 17:38:37 +00:00
{
if (this->_bind_delegate) {
2025-06-29 17:19:07 +00:00
auto vl = _data_map[u8"<EFBFBD><EFBFBD>ֵ"];
auto vb = _data_map[u8"<EFBFBD><EFBFBD>ֵ"];
2025-06-28 17:38:37 +00:00
if (this->_bind_delegate->compare(vl, vb))
2025-07-04 16:42:29 +00:00
return ExecuteResult::SUCCESS;
2025-06-28 17:38:37 +00:00
}
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
}
2025-06-29 14:58:45 +00:00
void CompareNode::insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/)
{
}
QList<std::shared_ptr<LogicalNode>> CompareNode::getForwards() const
{
return QList<std::shared_ptr<LogicalNode>>();
}
QString CompareNode::rtName() const
{
return QString(u8"%1<%2>(%3)").arg(typeName(), delegateName()).arg(getID());
}
QString CompareNode::typeName() const
{
return u8"<EFBFBD>ȽϽڵ<EFBFBD>";
}
2025-07-04 16:42:29 +00:00
bool CompareNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) {
2025-06-29 14:58:45 +00:00
return true;
}
2025-06-28 17:38:37 +00:00
std::shared_ptr<Serializable> CompareNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<CompareNode>(getKernal());
2025-06-28 17:38:37 +00:00
}
2025-07-04 17:45:32 +00:00
CompareNode::CompareNode(std::shared_ptr<MapKernel> ins)
2025-07-04 15:07:33 +00:00
: LogicalNode(NodeKind::COMPARENODE, ins) {
2025-06-29 17:19:07 +00:00
_data_map[u8"<EFBFBD><EFBFBD>ֵ"] = std::make_shared<GeneralData>();
_data_map[u8"<EFBFBD><EFBFBD>ֵ"] = std::make_shared<GeneralData>();
2025-06-28 17:38:37 +00:00
}
QString CompareNode::delegateName() const
{
if (_bind_delegate)
return _bind_delegate->name();
2025-06-29 17:19:07 +00:00
return u8"";
2025-06-28 17:38:37 +00:00
}
2025-06-30 05:49:36 +00:00
void CompareNode::bindDelegate(std::shared_ptr<CompareDelegate> ins)
2025-06-28 17:38:37 +00:00
{
this->_bind_delegate = ins;
}
QHash<QString, std::shared_ptr<TopicData>> CompareNode::inputList() const
{
return _data_map;
}
QHash<QString, std::shared_ptr<TopicData>> CompareNode::outputList() const
{
return QHash<QString, std::shared_ptr<TopicData>>();
}
2025-06-30 14:47:18 +00:00
#include <QJsonObject>
2025-06-28 17:38:37 +00:00
void CompareNode::recoveryFrom(const QJsonObject& obj)
{
2025-06-29 17:19:07 +00:00
auto vala = obj[u8"ValL"];
auto valb = obj[u8"ValR"];
2025-06-28 17:38:37 +00:00
2025-06-29 17:19:07 +00:00
_data_map[u8"<EFBFBD><EFBFBD>ֵ"]->recoveryFrom(vala.toObject());
_data_map[u8"<EFBFBD><EFBFBD>ֵ"]->recoveryFrom(valb.toObject());
2025-06-30 14:47:18 +00:00
QString delegate_name = "";
STRING_PEAK(delegate_name);
2025-07-04 15:07:33 +00:00
auto deins = getKernal()->getCompare(delegate_name);
2025-06-30 14:47:18 +00:00
bindDelegate(deins);
2025-06-28 17:38:37 +00:00
}
void CompareNode::saveTo(QJsonObject& obj) const
{
QJsonObject vala, valb;
2025-06-29 17:19:07 +00:00
_data_map[u8"<EFBFBD><EFBFBD>ֵ"]->saveTo(vala);
_data_map[u8"<EFBFBD><EFBFBD>ֵ"]->saveTo(valb);
2025-06-28 17:38:37 +00:00
2025-06-29 17:19:07 +00:00
obj[u8"ValL"] = vala;
obj[u8"ValR"] = valb;
2025-06-30 14:47:18 +00:00
QString delegate_name = "";
if (_bind_delegate) {
delegate_name = _bind_delegate->name();
}
STRING_SAVE(delegate_name);
2025-06-28 17:38:37 +00:00
}
#include <QJsonDocument>
QString GeneralData::topicString() const
{
2025-06-29 17:19:07 +00:00
return u8"GeneralData";
2025-06-28 17:38:37 +00:00
}
std::shared_ptr<Serializable> GeneralData::newDefault() const
{
return std::make_shared<GeneralData>();
}
void GeneralData::recoveryFrom(const QJsonObject& obj)
{
_element_bind = obj;
}
void GeneralData::saveTo(QJsonObject& obj) const
{
obj = _element_bind;
}
2025-06-30 05:49:36 +00:00
CompareDelegate::CompareDelegate(QJSEngine& bind_engine, const QString& func)
2025-06-28 17:38:37 +00:00
:_script_engine(bind_engine), _function_name(func) {
}
2025-06-30 05:49:36 +00:00
QString CompareDelegate::name() const
2025-06-28 17:38:37 +00:00
{
return _function_name;
}
2025-06-30 05:49:36 +00:00
bool CompareDelegate::compare(std::shared_ptr<TopicData> vleft, std::shared_ptr<TopicData> vright)
2025-06-28 17:38:37 +00:00
{
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
{
}
2025-07-04 17:45:32 +00:00
ConvertDelegate::ConvertDelegate(std::shared_ptr<MapKernel> host, QJSEngine& bind_engine, const QString& func)
2025-06-28 17:38:37 +00:00
: _host_bind(host), _script_engine(bind_engine), _function_name(func) {
}
2025-06-30 05:49:36 +00:00
QString ConvertDelegate::name() const
2025-06-28 17:38:37 +00:00
{
return _function_name;
}
2025-06-30 05:49:36 +00:00
QList<std::pair<ConvertDelegate::DATA_TOPIC_STRING, QString>> ConvertDelegate::inputTable() const
2025-06-28 17:38:37 +00:00
{
return _input_table;
}
2025-06-30 05:49:36 +00:00
void ConvertDelegate::inputReset(const QList<std::pair<DATA_TOPIC_STRING, QString>>& table)
2025-06-28 17:38:37 +00:00
{
this->_input_table = table;
}
2025-06-30 05:49:36 +00:00
std::pair<ConvertDelegate::DATA_TOPIC_STRING, QString> ConvertDelegate::outputVariable() const
2025-06-28 17:38:37 +00:00
{
return _output_appoint;
}
2025-06-30 05:49:36 +00:00
void ConvertDelegate::outputReset(std::pair<DATA_TOPIC_STRING, QString> appoint)
2025-06-28 17:38:37 +00:00
{
this->_output_appoint = appoint;
}
2025-06-30 05:49:36 +00:00
std::shared_ptr<TopicData> ConvertDelegate::convert(const QList<std::shared_ptr<TopicData>>& input_variables)
2025-06-28 17:38:37 +00:00
{
return nullptr;
2025-06-25 14:34:26 +00:00
}
2025-06-30 14:47:18 +00:00
std::shared_ptr<Serializable> ConvertDelegate::newDefault() const
{
return nullptr;
}
void ConvertDelegate::recoveryFrom(const QJsonObject& obj)
{
}
void ConvertDelegate::saveTo(QJsonObject& obj) const
{
}
2025-07-04 17:45:32 +00:00
ExecuteNode::ExecuteNode(std::shared_ptr<MapKernel> ins)
2025-07-04 15:07:33 +00:00
: LogicalNode(NodeKind::ACTIONNODE, ins) {
2025-06-30 14:47:18 +00:00
}
QString ExecuteNode::delegateName() const
{
if (_bind_delegate)
return _bind_delegate->typeName();
return "";
}
void ExecuteNode::bindDelegate(std::shared_ptr<ExecuteDelegate> ins)
{
_bind_delegate = ins;
}
QList<std::shared_ptr<LogicalNode>> ExecuteNode::getForwards() const
{
return QList<std::shared_ptr<LogicalNode>>();
}
QString ExecuteNode::rtName() const
{
2025-07-06 06:36:43 +00:00
return QString("%1<%2>(%3)").arg(typeName(), delegateName()).arg(getID());
}
2025-06-30 14:47:18 +00:00
QString ExecuteNode::typeName() const
{
return u8"ִ<EFBFBD>нڵ<EFBFBD>";
2025-06-30 14:47:18 +00:00
}
QHash<QString, std::shared_ptr<TopicData>> ExecuteNode::inputList() const
{
if (_bind_delegate)
return _bind_delegate->inputList();
return QHash<QString, std::shared_ptr<TopicData>>();
}
QHash<QString, std::shared_ptr<TopicData>> ExecuteNode::outputList() const
{
if (_bind_delegate)
return _bind_delegate->outputList();
return QHash<QString, std::shared_ptr<TopicData>>();
}
void ExecuteNode::insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/)
{
}
void ExecuteNode::reset()
{
if (_bind_delegate)
_bind_delegate->reset();
}
2025-07-04 16:42:29 +00:00
ExecuteResult ExecuteNode::execute()
2025-06-30 14:47:18 +00:00
{
if (_bind_delegate)
return _bind_delegate->execute();
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-06-30 14:47:18 +00:00
}
2025-07-04 16:42:29 +00:00
bool ExecuteNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-06-30 14:47:18 +00:00
{
return true;
}
std::shared_ptr<Serializable> ExecuteNode::newDefault() const
{
2025-07-04 15:07:33 +00:00
return std::make_shared<ExecuteNode>(this->getKernal());
2025-06-30 14:47:18 +00:00
}
void ExecuteNode::recoveryFrom(const QJsonObject& obj)
{
QString delegate_name = "";
STRING_PEAK(delegate_name);
2025-07-04 15:07:33 +00:00
auto de_ins = getKernal()->getExecute(delegate_name);
2025-06-30 14:47:18 +00:00
this->bindDelegate(de_ins);
if (obj.contains("data_json")) {
auto delegate_json = obj["data_json"].toObject();
de_ins->recoveryFrom(delegate_json);
}
}
void ExecuteNode::saveTo(QJsonObject& obj) const
{
QString delegate_name = "";
if (_bind_delegate)
delegate_name = _bind_delegate->typeName();
STRING_SAVE(delegate_name);
if (_bind_delegate) {
QJsonObject data_json;
this->_bind_delegate->saveTo(data_json);
obj["data_json"] = data_json;
}
}
2025-07-04 15:07:33 +00:00
2025-07-04 17:45:32 +00:00
ModifiedNode::ModifiedNode(std::shared_ptr<MapKernel> kernal)
2025-07-04 15:07:33 +00:00
: LogicalNode(NodeKind::MODIFYNODE, kernal) {
}
2025-07-04 15:26:36 +00:00
ModifyType ModifiedNode::modifyType() const
{
return _type_appoint;
}
void ModifiedNode::resetModify(ModifyType t)
{
this->_type_appoint = t;
}
void ModifiedNode::insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/)
{
if (children().size())
return;
LogicalNode::insert(node);
}
QString ModifiedNode::rtName() const
2025-07-04 15:26:36 +00:00
{
QString temp_string;
2025-07-04 15:26:36 +00:00
switch (modifyType())
{
case ModifyType::ALWAYS_SUCCESS:
temp_string = u8"<EFBFBD><EFBFBD><EFBFBD>νڵ<EFBFBD><<3C><>Զ<EFBFBD>ɹ<EFBFBD>>";
2025-07-04 15:26:36 +00:00
case ModifyType::ALWAYS_FAILURE:
temp_string = u8"<EFBFBD><EFBFBD><EFBFBD>νڵ<EFBFBD><<3C><>Զʧ<D4B6><CAA7>>";
2025-07-04 15:26:36 +00:00
case ModifyType::RESULT_INVENTER:
temp_string = u8"<EFBFBD><EFBFBD><EFBFBD>νڵ<EFBFBD><<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת>";
2025-07-04 15:26:36 +00:00
default:
temp_string = u8"<EFBFBD><EFBFBD><EFBFBD>νڵ<EFBFBD><>";
2025-07-04 15:26:36 +00:00
}
return temp_string + QString("(%1)").arg(getID());
}
QString ModifiedNode::typeName() const
{
return u8"<EFBFBD><EFBFBD><EFBFBD>νڵ<EFBFBD>";
2025-07-04 15:26:36 +00:00
}
QHash<QString, std::shared_ptr<TopicData>> ModifiedNode::inputList() const
{
return {};
}
QHash<QString, std::shared_ptr<TopicData>> ModifiedNode::outputList() const
{
return {};
}
void ModifiedNode::reset()
{
2025-07-04 16:42:29 +00:00
this->_result_store = ExecuteResult::UNDEFINED;
2025-07-04 15:26:36 +00:00
}
QList<std::shared_ptr<LogicalNode>> ModifiedNode::getForwards() const
{
return children();
}
2025-07-04 16:42:29 +00:00
bool ModifiedNode::fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste)
2025-07-04 15:26:36 +00:00
{
this->_result_store = ste;
return true;
}
2025-07-04 16:42:29 +00:00
ExecuteResult ModifiedNode::execute()
2025-07-04 15:26:36 +00:00
{
switch (_type_appoint)
{
case ModifyType::RESULT_INVENTER:
2025-07-04 16:42:29 +00:00
if (_result_store == ExecuteResult::SUCCESS) {
return ExecuteResult::FAILURE;
2025-07-04 15:26:36 +00:00
}
else {
2025-07-04 16:42:29 +00:00
return ExecuteResult::SUCCESS;
2025-07-04 15:26:36 +00:00
}
case ModifyType::ALWAYS_SUCCESS:
2025-07-04 16:42:29 +00:00
return ExecuteResult::SUCCESS;
2025-07-04 15:26:36 +00:00
case ModifyType::ALWAYS_FAILURE:
case ModifyType::NONE:
2025-07-04 16:42:29 +00:00
return ExecuteResult::FAILURE;
2025-07-04 15:26:36 +00:00
}
}
std::shared_ptr<Serializable> ModifiedNode::newDefault() const
{
return std::make_shared<ModifiedNode>(this->getKernal());
}
void ModifiedNode::recoveryFrom(const QJsonObject& obj)
{
2025-07-04 15:26:36 +00:00
}
void ModifiedNode::saveTo(QJsonObject& obj) const
{
2025-07-04 15:26:36 +00:00
}