This commit is contained in:
codeboss 2025-07-01 00:45:32 +08:00
parent 03958c106f
commit d633d0130f
6 changed files with 103 additions and 40 deletions

View File

@ -52,8 +52,6 @@ QString BehaviorPerformPlugin::name() const
#include <MessageLoader.h>
MapKernal::MapKernal(std::shared_ptr<MessageLoader> ins)
: _bind_loader(ins) {
for (auto key : ins->allType())
registData(ins->makeDefault(key));
}
QList<QString> MapKernal::compareTypes() const
@ -64,6 +62,7 @@ QList<QString> MapKernal::compareTypes() const
void MapKernal::registCompare(std::shared_ptr<CompareDelegate> ins)
{
_compare_types[ins->name()] = ins;
emit this->compareTypeListChanged();
}
std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name)
@ -76,6 +75,7 @@ std::shared_ptr<CompareDelegate> MapKernal::getCompare(const QString& name)
void MapKernal::registConvert(std::shared_ptr<ConvertDelegate> ins)
{
_convert_types[ins->name()] = ins;
emit this->convertTypeListChanged();
}
QList<QString> MapKernal::convertTypes() const
@ -93,6 +93,7 @@ std::shared_ptr<ConvertDelegate> MapKernal::getConvert(const QString& name)
void MapKernal::registExecute(std::shared_ptr<ExecuteDelegate> ins)
{
_execute_types[ins->typeName()] = ins;
emit this->executeTypeListChanged();
}
std::shared_ptr<MessageLoader> MapKernal::messageLoader() const
@ -100,6 +101,22 @@ 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));
// 注册可用节点类型
registNode(std::make_shared<SequenceNode>());
registNode(std::make_shared<SelectorNode>());
registNode(std::make_shared<ParallelNode>());
registNode(std::make_shared<CompareNode>(this->shared_from_this()));
registNode(std::make_shared<ExecuteNode>(this->shared_from_this()));
registNode(std::make_shared<BehaviorMapNode>(this->shared_from_this()));
}
void MapKernal::registData(std::shared_ptr<TopicData> init)
{
if (_variable_types.contains(init->topicString()))
@ -741,7 +758,7 @@ QList<std::shared_ptr<LogicalNode>> ExecuteNode::getForwards() const
QString ExecuteNode::typeName() const
{
return QString("执行节点<%1>(%2)").arg(delegateName()).arg(getID());
return QString(u8"执行节点<%1>").arg(delegateName());
}
QHash<QString, std::shared_ptr<TopicData>> ExecuteNode::inputList() const
@ -785,7 +802,6 @@ std::shared_ptr<Serializable> ExecuteNode::newDefault() const
return std::make_shared<ExecuteNode>(this->_bind_kernal);
}
#include <QJsonObject>
void ExecuteNode::recoveryFrom(const QJsonObject& obj)
{
QString delegate_name = "";

View File

@ -28,7 +28,10 @@ struct COMPONENTBASIC_EXPORT GeneralData : public TopicData {
/// <summary>
/// 行为树实例化节点
/// </summary>
class COMPONENTBASIC_EXPORT MapKernal : virtual public Serializable {
class COMPONENTBASIC_EXPORT MapKernal :
public QObject, virtual public Serializable,
public std::enable_shared_from_this<MapKernal> {
Q_OBJECT
private:
/// <summary>
/// 绑定载入器
@ -58,6 +61,21 @@ private:
/// </summary>
QHash<QString, std::shared_ptr<LogicalNode>> _logicalnode_types;
signals:
/// <summary>
/// 比较器类型列表变更
/// </summary>
void compareTypeListChanged();
/// <summary>
/// 转换器类型列表变更
/// </summary>
void convertTypeListChanged();
/// <summary>
/// 执行节点类型列表变更
/// </summary>
void executeTypeListChanged();
public:
MapKernal(std::shared_ptr<MessageLoader> ins);
virtual ~MapKernal() = default;
@ -68,6 +86,8 @@ public:
/// <returns></returns>
std::shared_ptr<MessageLoader> messageLoader() const;
void initial();
// 数据类型管理 ======================================================
/// <summary>
/// 注册数据类型
@ -84,7 +104,29 @@ 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);
// 逻辑树类型管理 ====================================================
/// <summary>
/// 注册逻辑节点
/// </summary>
/// <param name="ins"></param>
virtual void registNode(std::shared_ptr<LogicalNode> ins);
/// <summary>
/// 执行器类型名称
/// </summary>
/// <returns></returns>
virtual QList<QString> nodeTypes() const;
/// <summary>
/// 获取指定类型的执行器节点
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<LogicalNode> getNode(const QString& name);
@ -108,6 +150,7 @@ public:
// 转换器类型管理 ======================================================
/// <summary>
/// 注册转换器
@ -148,31 +191,10 @@ public:
// 逻辑树类型管理 ====================================================
/// <summary>
/// 注册逻辑节点
/// </summary>
/// <param name="ins"></param>
virtual void registNode(std::shared_ptr<LogicalNode> ins);
/// <summary>
/// 执行器类型名称
/// </summary>
/// <returns></returns>
virtual QList<QString> nodeTypes() const;
/// <summary>
/// 获取指定类型的执行器节点
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
virtual std::shared_ptr<LogicalNode> getNode(const QString& name);
// 通过 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>
@ -219,7 +241,7 @@ public:
/// 重置输入变量类型表
/// </summary>
/// <param name="table">list{pair{类型名称,绑定输入变量名}}</param>
void inputReset(const QList<std::pair<DATA_TOPIC_STRING, QString>> &table);
void inputReset(const QList<std::pair<DATA_TOPIC_STRING, QString>>& table);
/// <summary>
/// 输入变量
/// </summary>
@ -442,13 +464,13 @@ enum class IO_TYPE {
class COMPONENTBASIC_EXPORT BehaviorMapNode : public LogicalNode {
private:
std::shared_ptr<MapKernal> _bind_kernal;
QString _map_name = u8"未命名行为树";
QString _map_name = u8"行为树节点";
/// <summary>
/// 地图变量表
/// </summary>
QHash<QString, std::pair<IO_TYPE, std::shared_ptr<TopicData>>> _variables;
LogicalResult _state_value;
LogicalResult _state_value = LogicalResult::FAILURE;
public:
BehaviorMapNode(std::shared_ptr<MapKernal> kernal);
@ -639,7 +661,7 @@ class COMPONENTBASIC_EXPORT ExecuteNode : public LogicalNode {
private:
std::shared_ptr<MapKernal> _bind_kernal;
std::shared_ptr<ExecuteDelegate> _bind_delegate;
public:
ExecuteNode(std::shared_ptr<MapKernal> kernal);
@ -669,18 +691,18 @@ public:
/// 行为树组件
/// </summary>
class COMPONENTBASIC_EXPORT BehaviorPerformPlugin :
public RespondRoute<
public RespondRoute<
WsRespond<EntityInitialRequest, RespondDefault>,
WsRespond<EntityPreparedRequest, RespondDefault>,
WsRespond<SyncRequest, RespondDefault>,
WsRespond<DeduceRequest, RespondDefault>>,
public RequestRoute<>
public RequestRoute<>
{
private:
std::weak_ptr<WsEntity> _bind_entity;
public:
void mapReset(const QString &path);
void mapReset(const QString& path);
// 通过 ProcList 继承
void execute(std::shared_ptr<const EntityInitialRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;

View File

@ -108,7 +108,7 @@
<ClCompile Include="RouteManage.cpp" />
<ClCompile Include="SurfaceMotion.cpp" />
<ClCompile Include="VisibleCube.cpp" />
<ClInclude Include="BehaviorPerform.h" />
<QtMoc Include="BehaviorPerform.h" />
<ClInclude Include="componentbasic_global.h" />
<ClInclude Include="componentbasic.h" />
<QtMoc Include="DeduceFramework.h" />

View File

@ -41,9 +41,6 @@
<ClInclude Include="SurfaceMotion.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="BehaviorPerform.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="VisibleCube.cpp">
@ -72,5 +69,8 @@
<QtMoc Include="DeduceFramework.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="BehaviorPerform.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
</Project>

View File

@ -187,14 +187,33 @@ BehaviorEditor::BehaviorEditor(QWidget* parent /*= nullptr*/)
_logical_present(new BehaviorsPresent(this)),
_logs_present(new QTextBrowser(this))
{
_glbal_loader = std::make_shared<MessageLoader>();
_global_kernal = std::make_shared<MapKernal>(_glbal_loader);
_global_kernal->initial();
auto split_h = new QSplitter(Qt::Horizontal, this);
this->setCentralWidget(split_h);
split_h->addWidget(_type_view);
_type_view->setModel(_type_model);
auto split_v = new QSplitter(Qt::Vertical, this);
split_h->addWidget(split_v);
split_v->addWidget(_logical_present);
split_v->addWidget(_logs_present);
nodeTypesViewInit(_type_model);
}
#include <QStandardItem>
void BehaviorEditor::nodeTypesViewInit(QStandardItemModel* m)
{
auto types = this->_global_kernal->nodeTypes();
std::sort(types.begin(), types.end());
for (auto type : types) {
auto row_item = new QStandardItem(type);
row_item->setEditable(false);
m->appendRow(row_item);
}
}

View File

@ -90,6 +90,7 @@ public:
#include <QListView>
#include <QStandardItemModel>
#include <QTextBrowser>
#include <MessageLoader.h>
class BehaviorEditor : public QMainWindow {
private:
QListView *const _type_view;
@ -97,6 +98,11 @@ private:
BehaviorsPresent *const _logical_present;
QTextBrowser *const _logs_present;
std::shared_ptr<MessageLoader> _glbal_loader;
std::shared_ptr<MapKernal> _global_kernal;
public:
BehaviorEditor(QWidget *parent = nullptr);
void nodeTypesViewInit(QStandardItemModel *m);
};