SimsWorld/ComponentBasic/BehaviorPerform.h

762 lines
20 KiB
C
Raw Normal View History

2025-06-25 14:34:26 +00:00
#pragma once
#include "componentbasic.h"
#include <messagebasic.h>
2025-06-28 17:38:37 +00:00
#include <QJsonObject>
#include <QJSEngine>
class MessageLoader;
2025-06-30 05:49:36 +00:00
class CompareDelegate;
class ConvertDelegate;
class ExecuteDelegate;
2025-06-28 17:38:37 +00:00
class LogicalNode;
2025-06-25 14:34:26 +00:00
2025-06-29 12:30:32 +00:00
/// <summary>
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
struct COMPONENTBASIC_EXPORT GeneralData : public TopicData {
QJsonObject _element_bind;
QString topicString() const override;
std::shared_ptr<Serializable> newDefault() const override;
2025-06-29 12:30:32 +00:00
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
// ==================================================================================
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><>Ϊ<EFBFBD><CEAA>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
/// </summary>
2025-06-30 16:45:32 +00:00
class COMPONENTBASIC_EXPORT MapKernal :
public QObject, virtual public Serializable,
public std::enable_shared_from_this<MapKernal> {
Q_OBJECT
2025-06-25 14:34:26 +00:00
private:
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
std::shared_ptr<MessageLoader> _bind_loader;
QJSEngine _core_engine;
2025-06-28 17:38:37 +00:00
/// <summary>
/// {Topic<69><63>default-value}
2025-06-25 14:34:26 +00:00
/// </summary>
QHash<QString, std::shared_ptr<TopicData>> _variable_types;
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20>Ƚ<EFBFBD><C8BD><EFBFBD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-30 05:49:36 +00:00
QHash<QString, std::shared_ptr<CompareDelegate>> _compare_types;
2025-06-28 17:38:37 +00:00
/// <summary>
/// ת<><D7AA><EFBFBD><EFBFBD>
/// </summary>
2025-06-30 05:49:36 +00:00
QHash<QString, std::shared_ptr<ConvertDelegate>> _convert_types;
/// <summary>
/// ִ<><D6B4><EFBFBD><EFBFBD>
/// </summary>
QHash<QString, std::shared_ptr<ExecuteDelegate>> _execute_types;
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><><EFBFBD>п<EFBFBD><D0BF>õĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
QHash<QString, std::shared_ptr<LogicalNode>> _logicalnode_types;
2025-06-25 14:34:26 +00:00
2025-06-30 16:45:32 +00:00
signals:
/// <summary>
/// <20>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
void compareTypeListChanged();
/// <summary>
/// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
void convertTypeListChanged();
2025-06-25 14:34:26 +00:00
public:
2025-06-28 17:38:37 +00:00
MapKernal(std::shared_ptr<MessageLoader> ins);
virtual ~MapKernal() = default;
2025-06-30 16:45:32 +00:00
void initial();
QJSEngine& bindEngine();
2025-06-30 16:45:32 +00:00
2025-06-28 17:38:37 +00:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD> ======================================================
2025-06-25 14:34:26 +00:00
/// <summary>
/// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="init"></param>
2025-06-28 17:38:37 +00:00
virtual void registData(std::shared_ptr<TopicData> init);
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-28 17:38:37 +00:00
/// <returns></returns>
virtual QList<QString> dataTypes() const;
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><>ȡָ<C8A1><D6B8>topic<69><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-28 17:38:37 +00:00
/// <param name="topic"></param>
/// <returns></returns>
virtual std::shared_ptr<TopicData> getData(const QString& topic) const;
2025-06-30 16:45:32 +00:00
// <20>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD> ====================================================
/// <summary>
/// ע<><D7A2><EFBFBD>߼<EFBFBD><DFBC>ڵ<EFBFBD>
/// </summary>
/// <param name="ins"></param>
virtual void registNode(std::shared_ptr<LogicalNode> ins);
/// <summary>
/// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QList<QString> nodeTypes() const;
/// <summary>
/// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<LogicalNode> getNode(const QString& name) const;
2025-06-30 16:45:32 +00:00
2025-06-28 17:38:37 +00:00
// <20>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD> ======================================================
/// <summary>
/// ע<><D7A2><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>
/// </summary>
/// <param name="ins"></param>
2025-06-30 05:49:36 +00:00
virtual void registCompare(std::shared_ptr<CompareDelegate> ins);
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><>ȡ<EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QList<QString> compareTypes() const;
/// <summary>
/// <20><>ȡ<EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<CompareDelegate> getCompare(const QString& name) const;
2025-06-28 17:38:37 +00:00
2025-06-30 16:45:32 +00:00
2025-06-28 17:38:37 +00:00
// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD> ======================================================
/// <summary>
/// ע<><D7A2>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
/// </summary>
/// <param name="ins"></param>
2025-06-30 05:49:36 +00:00
virtual void registConvert(std::shared_ptr<ConvertDelegate> ins);
2025-06-28 17:38:37 +00:00
/// <summary>
/// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QList<QString> convertTypes() const;
/// <summary>
/// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<ConvertDelegate> getConvert(const QString& name) const;
2025-06-30 05:49:36 +00:00
// ִ<>нڵ<D0BD><DAB5><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD> ====================================================
/// <summary>
/// ע<><D7A2><EFBFBD><EFBFBD>չִ<D5B9><D6B4><EFBFBD><EFBFBD>
/// </summary>
/// <param name="ins"></param>
virtual void registExecute(std::shared_ptr<ExecuteDelegate> ins);
/// <summary>
/// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QList<QString> executeTypes() const;
/// <summary>
/// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<ExecuteDelegate> getExecute(const QString& name) const;
2025-06-30 05:49:36 +00:00
2025-06-28 17:38:37 +00:00
// ͨ<><CDA8> Serializable <20>̳<EFBFBD>
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-06-28 17:38:37 +00:00
};
/// <summary>
/// <20>ȽϹ<C8BD>ϵʵ<CFB5><CAB5>
/// </summary>
class COMPONENTBASIC_EXPORT CompareDelegate : public Serializable {
2025-06-28 17:38:37 +00:00
private:
QJSEngine& _script_engine;
QString _function_name;
public:
2025-06-30 05:49:36 +00:00
CompareDelegate(QJSEngine& bind_engine, const QString& func);
2025-06-28 17:38:37 +00:00
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;
2025-06-28 17:38:37 +00:00
};
2025-06-29 12:30:32 +00:00
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ʵ<EFBFBD><CAB5>
/// </summary>
class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable {
2025-06-28 17:38:37 +00:00
public:
typedef QString DATA_TOPIC_STRING;
/// <summary>
/// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
/// </summary>
/// <param name="host"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="bind_engine"></param>
/// <param name="func"></param>
2025-06-30 05:49:36 +00:00
ConvertDelegate(std::shared_ptr<MapKernal> host, QJSEngine& bind_engine, const QString& func);
2025-06-28 17:38:37 +00:00
/// <summary>
/// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>JS<4A><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
QString name() const;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͱ󶨱<CDB0>
/// </summary>
/// <returns>list{pair{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}}</returns>
QList<std::pair<DATA_TOPIC_STRING, QString>> inputTable() const;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>
/// </summary>
/// <param name="table">list{pair{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}}</param>
2025-06-30 16:45:32 +00:00
void inputReset(const QList<std::pair<DATA_TOPIC_STRING, QString>>& table);
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns>pair{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}</returns>
std::pair<DATA_TOPIC_STRING, QString> outputVariable() const;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="appoint"></param>
void outputReset(std::pair<DATA_TOPIC_STRING, QString> appoint);
/// <summary>
/// ִ<><D6B4>ת<EFBFBD><D7AA>
/// </summary>
/// <param name="input_variables"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD></param>
/// <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;
2025-06-28 17:38:37 +00:00
private:
std::shared_ptr<MapKernal> _host_bind;
QJSEngine& _script_engine;
QString _function_name;
QList<std::pair<DATA_TOPIC_STRING, QString>> _input_table;
std::pair<DATA_TOPIC_STRING, QString> _output_appoint;
};
/// <summary>
/// ִ<>н<EFBFBD><D0BD><EFBFBD>
/// </summary>
2025-07-04 16:42:29 +00:00
enum class ExecuteResult {
2025-06-28 17:38:37 +00:00
UNDEFINED, // δ<><CEB4><EFBFBD><EFBFBD>
SUCCESS, // <20>ɹ<EFBFBD>
FAILURE // ʧ<><CAA7>
};
2025-06-30 05:49:36 +00:00
/// <summary>
/// ִ<>д<EFBFBD><D0B4><EFBFBD>
/// </summary>
class COMPONENTBASIC_EXPORT ExecuteDelegate : public Serializable {
public:
/// <summary>
/// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
virtual QString typeName() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ݽӿ<DDBD>
/// </summary>
/// <returns>map{name, type-ins}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> inputList() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ݽӿ<DDBD>
/// </summary>
/// <returns>map{name, type-ins}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> outputList() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>״̬
/// </summary>
virtual void reset() = 0;
/// <summary>
/// ִ<><D6B4><EFBFBD>߼<EFBFBD><DFBC>ڵ<EFBFBD>
/// </summary>
/// <param name="core"></param>
/// <returns></returns>
2025-07-04 16:42:29 +00:00
virtual ExecuteResult execute() = 0;
2025-06-30 05:49:36 +00:00
};
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20>߼<EFBFBD><DFBC>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
enum class NodeKind {
MAPNODE, // <20>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>ڵ<EFBFBD>
SEQUENCENODE, // ˳<><CBB3><EFBFBD>ڵ<EFBFBD>
SELECTORNODE, // ѡ<><D1A1><EFBFBD>ڵ<EFBFBD>
PARALLELNODE, // <20><><EFBFBD>нڵ<D0BD>
COMPARENODE, // <20>ȽϽڵ<CFBD>
ACTIONNODE, // <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
2025-07-04 14:53:03 +00:00
MODIFYNODE, // <20><><EFBFBD>νڵ<CEBD>
2025-06-28 17:38:37 +00:00
};
2025-07-02 17:11:48 +00:00
class BehaviorMapNode;
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC>ڵ<EFBFBD><DAB5>Ļ<EFBFBD><C4BB><EFBFBD>
/// </summary>
2025-06-29 14:58:45 +00:00
class COMPONENTBASIC_EXPORT LogicalNode : virtual public Serializable, public std::enable_shared_from_this<LogicalNode> {
2025-06-28 17:38:37 +00:00
private:
int _node_id = 0;
NodeKind _node_type = NodeKind::ACTIONNODE;
2025-07-04 14:53:03 +00:00
std::shared_ptr<MapKernal> _bind_kernal;
2025-06-29 14:58:45 +00:00
2025-06-28 17:38:37 +00:00
std::weak_ptr<LogicalNode> _parent_bind;
QList<std::shared_ptr<LogicalNode>> _child_list;
2025-06-29 14:58:45 +00:00
/// <summary>
/// <20><><EFBFBD>ø<EFBFBD><C3B8>ڵ<EFBFBD>
/// </summary>
/// <param name="pnode"></param>
void _set_parent_node(std::weak_ptr<LogicalNode> pnode);
2025-06-25 14:34:26 +00:00
public:
2025-07-04 14:53:03 +00:00
LogicalNode(NodeKind t, std::shared_ptr<MapKernal> kernal);
2025-06-25 14:34:26 +00:00
virtual ~LogicalNode() = default;
2025-06-29 12:30:32 +00:00
/// <summary>
/// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
NodeKind nodeKind() const;
2025-06-29 17:19:07 +00:00
/// <summary>
/// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
int depth() const;
2025-06-29 12:30:32 +00:00
2025-06-28 17:38:37 +00:00
/// <summary>
2025-06-29 14:58:45 +00:00
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>ڵ<EFBFBD>
2025-06-28 17:38:37 +00:00
/// </summary>
2025-06-29 14:58:45 +00:00
/// <returns></returns>
2025-07-02 17:11:48 +00:00
std::shared_ptr<BehaviorMapNode> bindMap() const;
2025-07-04 15:07:33 +00:00
std::shared_ptr<MapKernal> getKernal() const;
2025-06-29 14:58:45 +00:00
2025-06-28 17:38:37 +00:00
/// <summary>
2025-06-29 12:30:32 +00:00
/// <20><><EFBFBD>˽ڵ<CBBD>
2025-06-28 17:38:37 +00:00
/// </summary>
/// <returns></returns>
2025-06-29 12:30:32 +00:00
std::weak_ptr<LogicalNode> parent() const;
2025-06-28 17:38:37 +00:00
/// <summary>
2025-06-29 14:58:45 +00:00
/// <20><>ȡ<EFBFBD>ӽڵ<D3BD><DAB5>б<EFBFBD>
2025-06-28 17:38:37 +00:00
/// </summary>
/// <returns></returns>
2025-06-29 14:58:45 +00:00
virtual QList<std::shared_ptr<LogicalNode>> children() const;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
/// </summary>
/// <param name="node"></param>
/// <param name="index"></param>
virtual void insert(std::shared_ptr<LogicalNode> node, int index = -1);
/// <summary>
/// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
/// </summary>
/// <param name="node"></param>
virtual void remove(std::shared_ptr<LogicalNode> node);
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><><EFBFBD>ýڵ<C3BD>id
/// </summary>
/// <param name="unique_id"></param>
2025-06-28 17:38:37 +00:00
void setID(int unique_id);
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><>ȡ<EFBFBD>ڵ<EFBFBD>id
/// </summary>
/// <returns></returns>
2025-06-28 17:38:37 +00:00
int getID() const;
/// <summary>
/// ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
2025-06-29 14:58:45 +00:00
QString rtName() const;
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
2025-06-28 17:38:37 +00:00
virtual QString typeName() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ݽӿ<DDBD>
/// </summary>
/// <returns>map{name, type-ins}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> inputList() const = 0;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ݽӿ<DDBD>
/// </summary>
/// <returns>map{name, type-ins}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> outputList() const = 0;
/// <summary>
2025-06-29 14:58:45 +00:00
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>״̬
2025-06-28 17:38:37 +00:00
/// </summary>
2025-06-29 14:58:45 +00:00
virtual void reset() = 0;
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><>ȡִ<C8A1><D6B4><EFBFBD><EFBFBD><EFBFBD>ڽڵ<DABD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-28 17:38:37 +00:00
/// <returns></returns>
virtual QList<std::shared_ptr<LogicalNode>> getForwards() const = 0;
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><><EFBFBD>нڵ<D0BD>ִ<EFBFBD><D6B4>״̬<D7B4>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-28 17:38:37 +00:00
/// <param name="node"></param>
/// <param name="ste"></param>
/// <returns><3E><><EFBFBD><EFBFBD>ִ<EFBFBD>б<EFBFBD>־</returns>
2025-07-04 16:42:29 +00:00
virtual bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) = 0;
2025-06-29 14:58:45 +00:00
/// <summary>
/// ִ<><D6B4><EFBFBD>߼<EFBFBD><DFBC>ڵ<EFBFBD>
/// </summary>
/// <param name="core"></param>
/// <returns></returns>
2025-07-04 16:42:29 +00:00
virtual ExecuteResult execute() = 0;
2025-06-29 14:58:45 +00:00
/// <summary>
/// <20>½<EFBFBD>Ĭ<EFBFBD><C4AC>ʵ<EFBFBD><CAB5>
/// </summary>
/// <returns></returns>
virtual std::shared_ptr<Serializable> newDefault() const = 0;
2025-06-25 14:34:26 +00:00
};
2025-06-29 14:58:45 +00:00
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
enum class IO_TYPE {
INPUT, OUTPUT
};
/// <summary>
/// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڵ<EFBFBD>ʵ<EFBFBD><CAB5>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-29 14:58:45 +00:00
class COMPONENTBASIC_EXPORT BehaviorMapNode : public LogicalNode {
2025-06-28 17:38:37 +00:00
private:
2025-07-02 17:15:51 +00:00
QString _map_name = u8"<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>";
2025-06-29 14:58:45 +00:00
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
QHash<QString, std::pair<IO_TYPE, std::shared_ptr<TopicData>>> _variables;
2025-07-04 16:42:29 +00:00
ExecuteResult _state_value = ExecuteResult::FAILURE;
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
public:
2025-06-29 14:58:45 +00:00
BehaviorMapNode(std::shared_ptr<MapKernal> kernal);
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
/// <summary>
2025-06-28 17:38:37 +00:00
/// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD>UniException<6F>
/// <20>ڵ<EFBFBD><DAB5><EFBFBD>ʼ<EFBFBD><CABC>ʱ<EFBFBD><EFBFBD><E1B0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ĭ<EFBFBD><C4AC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
2025-06-25 14:34:26 +00:00
/// </summary>
2025-06-28 17:38:37 +00:00
virtual void setVariable(const QString& key, IO_TYPE t, std::shared_ptr<TopicData> ins);
2025-07-04 16:32:32 +00:00
virtual QList<QString> inputVariableKeys() const;
virtual QList<QString> outputVariableKeys() const;
virtual void removeVariable(const QString &key);
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
/// </summary>
/// <param name="key"></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>nullptr<74><72><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD>ȷ<EFBFBD><C8B7></returns>
virtual std::shared_ptr<TopicData> getVariable(const QString& key) const;
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="val"></param>
2025-06-28 17:38:37 +00:00
virtual void resetName(const QString& val);
/// <summary>
/// <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>״̬
/// </summary>
void reset() override;
/// <summary>
/// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
QString typeName() const override;
/// <summary>
/// <20><>ȡǰ<C8A1>ýڵ<C3BD>
/// </summary>
/// <returns></returns>
QList<std::shared_ptr<LogicalNode>> getForwards() const override;
/// <summary>
/// <20><><EFBFBD><EFBFBD>״̬
/// </summary>
/// <param name="node"></param>
/// <param name="ste"></param>
/// <returns></returns>
2025-07-04 16:42:29 +00:00
bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-28 17:38:37 +00:00
/// <summary>
/// ִ<><D6B4>״̬
/// </summary>
/// <returns></returns>
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
2025-06-28 17:38:37 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
/// <returns></returns>
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
/// <returns></returns>
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
// <20><>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD> ======================================================
/// <summary>
/// ˳<><CBB3><EFBFBD>ڵ<EFBFBD>
/// </summary>
2025-06-29 14:58:45 +00:00
class COMPONENTBASIC_EXPORT SequenceNode : public LogicalNode {
2025-06-28 17:38:37 +00:00
private:
2025-07-04 16:42:29 +00:00
QHash<int, ExecuteResult> _state_map;
2025-06-28 17:38:37 +00:00
public:
2025-07-04 14:53:03 +00:00
SequenceNode(std::shared_ptr<MapKernal> kernal);
2025-06-28 17:38:37 +00:00
QList<std::shared_ptr<LogicalNode>> getForwards() const override;
QString typeName() const override;
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-28 17:38:37 +00:00
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// ѡ<><D1A1><EFBFBD>ڵ<EFBFBD>
/// </summary>
2025-06-29 14:58:45 +00:00
class COMPONENTBASIC_EXPORT SelectorNode : public LogicalNode {
2025-06-28 17:38:37 +00:00
private:
2025-07-04 16:42:29 +00:00
QHash<int, ExecuteResult> _state_map;
2025-06-28 17:38:37 +00:00
public:
2025-07-04 14:53:03 +00:00
SelectorNode(std::shared_ptr<MapKernal> kernal);
2025-06-28 17:38:37 +00:00
QList<std::shared_ptr<LogicalNode>> getForwards() const override;
QString typeName() const override;
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-28 17:38:37 +00:00
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// <20><><EFBFBD>нڵ<D0BD>
/// </summary>
2025-06-29 14:58:45 +00:00
class COMPONENTBASIC_EXPORT ParallelNode : public LogicalNode {
2025-06-28 17:38:37 +00:00
private:
2025-07-04 16:42:29 +00:00
QHash<int, ExecuteResult> _state_map;
2025-06-28 17:38:37 +00:00
public:
2025-07-04 14:53:03 +00:00
ParallelNode(std::shared_ptr<MapKernal> kernal);
2025-06-28 17:38:37 +00:00
2025-06-30 14:47:18 +00:00
QList<std::shared_ptr<LogicalNode>> getForwards() const override;
2025-06-28 17:38:37 +00:00
QString typeName() const override;
2025-06-30 14:47:18 +00:00
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
2025-06-28 17:38:37 +00:00
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-28 17:38:37 +00:00
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// <20>ȽϽڵ<CFBD>
/// </summary>
class COMPONENTBASIC_EXPORT CompareNode : public LogicalNode {
private:
2025-06-30 05:49:36 +00:00
std::shared_ptr<CompareDelegate> _bind_delegate;
2025-06-28 17:38:37 +00:00
QHash<QString, std::shared_ptr<TopicData>> _data_map;
public:
2025-06-30 14:47:18 +00:00
CompareNode(std::shared_ptr<MapKernal> kernal);
2025-06-28 17:38:37 +00:00
QString delegateName() const;
2025-06-30 05:49:36 +00:00
void bindDelegate(std::shared_ptr<CompareDelegate> ins);
2025-06-28 17:38:37 +00:00
2025-06-30 14:47:18 +00:00
virtual QList<std::shared_ptr<LogicalNode>> getForwards() const override;
QString typeName() const override;
2025-06-28 17:38:37 +00:00
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
2025-06-29 14:58:45 +00:00
virtual void insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/) override;
2025-06-30 14:47:18 +00:00
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
virtual bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-30 14:47:18 +00:00
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
/// <summary>
/// ִ<>нڵ<D0BD>
/// </summary>
class COMPONENTBASIC_EXPORT ExecuteNode : public LogicalNode {
private:
std::shared_ptr<ExecuteDelegate> _bind_delegate;
2025-06-30 16:45:32 +00:00
2025-06-30 14:47:18 +00:00
public:
ExecuteNode(std::shared_ptr<MapKernal> kernal);
QString delegateName() const;
void bindDelegate(std::shared_ptr<ExecuteDelegate> ins);
2025-06-28 17:38:37 +00:00
2025-06-29 14:58:45 +00:00
virtual QList<std::shared_ptr<LogicalNode>> getForwards() const override;
2025-06-30 14:47:18 +00:00
QString typeName() const override;
2025-06-29 14:58:45 +00:00
2025-06-30 14:47:18 +00:00
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
virtual void insert(std::shared_ptr<LogicalNode> node, int index /*= -1*/) override;
2025-06-29 14:58:45 +00:00
2025-06-28 17:38:37 +00:00
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
virtual bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-06-28 17:38:37 +00:00
virtual std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-06-25 14:34:26 +00:00
};
2025-07-04 14:53:03 +00:00
/// <summary>
/// <20><><EFBFBD>νڵ<CEBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
enum class ModifyType {
NONE,
ALWAYS_SUCCESS, // <20><>Զ<EFBFBD>ɹ<EFBFBD>
ALWAYS_FAILURE, // <20><>Զʧ<D4B6><CAA7>
RESULT_INVENTER, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
};
class COMPONENTBASIC_EXPORT ModifiedNode : public LogicalNode {
private:
ModifyType _type_appoint = ModifyType::NONE;
2025-07-04 16:42:29 +00:00
ExecuteResult _result_store = ExecuteResult::UNDEFINED;
2025-07-04 15:07:33 +00:00
2025-07-04 14:53:03 +00:00
public:
2025-07-04 15:07:33 +00:00
ModifiedNode(std::shared_ptr<MapKernal> kernal);
2025-07-04 14:53:03 +00:00
ModifyType modifyType() const;
void resetModify(ModifyType t);
2025-07-04 15:26:36 +00:00
void insert(std::shared_ptr<LogicalNode> node, int index = -1) override;
QString typeName() const override;
QHash<QString, std::shared_ptr<TopicData>> inputList() const override;
QHash<QString, std::shared_ptr<TopicData>> outputList() const override;
QList<std::shared_ptr<LogicalNode>> getForwards() const override;
2025-07-04 16:42:29 +00:00
bool fallback(std::shared_ptr<LogicalNode> node, ExecuteResult ste) override;
2025-07-04 15:26:36 +00:00
void reset() override;
2025-07-04 16:42:29 +00:00
ExecuteResult execute() override;
2025-07-04 15:26:36 +00:00
std::shared_ptr<Serializable> newDefault() const override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-07-04 14:53:03 +00:00
};
2025-06-28 17:38:37 +00:00
// <20><>Ϊ<EFBFBD>ڵ<EFBFBD> ====================================================================
2025-06-25 14:34:26 +00:00
/// <summary>
/// <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
2025-06-28 17:38:37 +00:00
class COMPONENTBASIC_EXPORT BehaviorPerformPlugin :
2025-06-30 16:45:32 +00:00
public RespondRoute<
2025-06-28 17:38:37 +00:00
WsRespond<EntityInitialRequest, RespondDefault>,
WsRespond<EntityPreparedRequest, RespondDefault>,
WsRespond<SyncRequest, RespondDefault>,
WsRespond<DeduceRequest, RespondDefault>>,
2025-06-30 16:45:32 +00:00
public RequestRoute<>
2025-06-28 17:38:37 +00:00
{
2025-06-25 14:34:26 +00:00
private:
std::weak_ptr<WsEntity> _bind_entity;
public:
2025-06-30 16:45:32 +00:00
void mapReset(const QString& path);
2025-06-28 17:38:37 +00:00
2025-06-25 14:34:26 +00:00
// ͨ<><CDA8> ProcList <20>̳<EFBFBD>
2025-06-28 17:38:37 +00:00
void execute(std::shared_ptr<const EntityInitialRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
void execute(std::shared_ptr<const EntityPreparedRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
void execute(std::shared_ptr<const SyncRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
void execute(std::shared_ptr<const DeduceRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
2025-06-25 14:34:26 +00:00
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
2025-06-28 17:38:37 +00:00
std::shared_ptr<Serializable> newDefault() const override;
2025-06-25 14:34:26 +00:00
void bindEntity(std::weak_ptr<WsEntity> host) override;
QString name() const override;
};