This commit is contained in:
codeboss 2025-06-25 22:34:26 +08:00
parent 3347f1c1e7
commit e9d2d011f1
11 changed files with 211 additions and 10 deletions

View File

@ -0,0 +1,40 @@
#include "BehaviorPerform.h"
void BehaviorPerformPlugin::recoveryFrom(const QJsonObject& obj)
{
}
void BehaviorPerformPlugin::saveTo(QJsonObject& obj) const
{
}
std::shared_ptr<WsComponent> BehaviorPerformPlugin::defaultNew() const
{
return std::make_shared<BehaviorPerformPlugin>();
}
void BehaviorPerformPlugin::bindEntity(std::weak_ptr<WsEntity> host)
{
this->_bind_entity = host;
}
QString BehaviorPerformPlugin::name() const
{
return NAME(BehaviorPerformPlugin);
}
void MapHost::setVariable(const QString& key, std::shared_ptr<TopicData> ins)
{
if (_variable_map.contains(key) && _variable_map[key]->topicString() != ins->typeName())
throw new UniException("不同数据类型数据绑定同一个名称!");
_variable_map[key] = ins;
}
std::shared_ptr<TopicData> MapHost::getVariable(const QString& key) const
{
if(!_variable_map.contains(key))
return nullptr;
return _variable_map[key];
}

View File

@ -0,0 +1,118 @@
#pragma once
#include "componentbasic.h"
#include <messagebasic.h>
/// <summary>
/// 行为树实例化节点
/// </summary>
class COMPONENTBASIC_EXPORT MapHost : public Serializable {
private:
/// <summary>
/// {Topicinit-value}
/// </summary>
QHash<QString, std::shared_ptr<TopicData>> _variable_types;
/// <summary>
/// 变量表
/// </summary>
QHash<QString, std::shared_ptr<TopicData>> _variable_map;
public:
virtual ~MapHost() = default;
/// <summary>
/// 注册数据类型
/// </summary>
/// <param name="init"></param>
virtual void registData(std::shared_ptr<TopicData> init) = 0;
/// <summary>
/// 设置变量如果类型错误会抛出UniException异常
/// 节点初始化时会按照配置注册默认值变量
/// </summary>
virtual void setVariable(const QString& key, std::shared_ptr<TopicData> ins);
/// <summary>
/// 获取指定名称的数据变量
/// </summary>
/// <param name="key"></param>
/// <returns>如果不存在指定名称数据返回nullptr类型不确定</returns>
virtual std::shared_ptr<TopicData> getVariable(const QString& key) const;
};
/// <summary>
/// 所有逻辑节点的基类
/// </summary>
class LogicalNode : public Serializable {
public:
virtual ~LogicalNode() = default;
/// <summary>
/// 设置节点id
/// </summary>
/// <param name="unique_id"></param>
virtual void setID(int unique_id) = 0;
/// <summary>
/// 提取节点id
/// </summary>
/// <returns></returns>
virtual int getID() const = 0;
/// <summary>
/// 获取节点名称
/// </summary>
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
/// 获取子节点列表
/// </summary>
/// <returns></returns>
virtual QList<std::shared_ptr<LogicalNode>> children() const = 0;
/// <summary>
/// 声明输入变量的内部标识和数据接口
/// </summary>
/// <returns>map{name, type}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> inputDeclares() const = 0;
/// <summary>
/// 声明输出变量的内部标识和数据接口
/// </summary>
/// <returns>map{name, type}</returns>
virtual QHash<QString, std::shared_ptr<TopicData>> outputDeclares() const = 0;
};
/// <summary>
/// 自定义行为树节点实例
/// </summary>
class COMPONENTBASIC_EXPORT BehaviorMapNode : public MapHost, public LogicalNode {
public:
/// <summary>
/// 重置行为树数据文件
/// </summary>
/// <param name="path"></param>
virtual void setBehaviorMap(const QString &path){}
/// <summary>
/// 设置行为树节点名称
/// </summary>
/// <param name="val"></param>
virtual void resetName(const QString &val){}
};
/// <summary>
/// 行为树组件
/// </summary>
class COMPONENTBASIC_EXPORT BehaviorPerformPlugin : public ProcList<
WsRespond<SyncRequest, RespondDefault>
>{
private:
std::weak_ptr<WsEntity> _bind_entity;
public:
// 通过 ProcList 继承
void execute(std::shared_ptr<Immediate> map, std::shared_ptr<const SyncRequest> in, QList<std::shared_ptr<RespondDefault>>& out) override;
void recoveryFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<WsComponent> defaultNew() const override;
void bindEntity(std::weak_ptr<WsEntity> host) override;
QString name() const override;
};

View File

@ -101,16 +101,18 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="BehaviorPerform.cpp" />
<ClCompile Include="componentbasic.cpp" />
<ClCompile Include="DeduceFramework.cpp" />
<ClCompile Include="InvisibleComponent.cpp" />
<ClCompile Include="ComponentsInfoPull.cpp" />
<ClCompile Include="RouteManage.cpp" />
<ClCompile Include="SurfaceMotion.cpp" />
<ClCompile Include="VisibleCube.cpp" />
<ClInclude Include="BehaviorPerform.h" />
<ClInclude Include="componentbasic_global.h" />
<ClInclude Include="componentbasic.h" />
<QtMoc Include="DeduceFramework.h" />
<ClInclude Include="InvisibleComponent.h" />
<ClInclude Include="ComponentsInfoPull.h" />
<ClInclude Include="RouteManage.h" />
<ClInclude Include="SurfaceMotion.h" />
<ClInclude Include="VisibleCube.h" />

View File

@ -35,12 +35,15 @@
<ClInclude Include="RouteManage.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="InvisibleComponent.h">
<ClInclude Include="ComponentsInfoPull.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SurfaceMotion.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="BehaviorPerform.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="VisibleCube.cpp">
@ -55,12 +58,15 @@
<ClCompile Include="componentbasic.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="InvisibleComponent.cpp">
<ClCompile Include="ComponentsInfoPull.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SurfaceMotion.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BehaviorPerform.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtMoc Include="DeduceFramework.h">

View File

@ -1,4 +1,4 @@
#include "InvisibleComponent.h"
#include "ComponentsInfoPull.h"
ComponentsInfoPull::ComponentsInfoPull() {}

View File

@ -37,18 +37,28 @@ public:
virtual QString content() const noexcept;
};
/// <summary>
/// 通用消息基类
/// </summary>
class WsMessage : public Serializable {
class TopicData {
public:
virtual ~WsMessage() = default;
virtual ~TopicData() = default;
/// <summary>
/// 获取消息类型字符串
/// </summary>
/// <returns>消息类型</returns>
virtual QString topicString() const = 0;
/// <summary>
/// 提取包含默认值的实例
/// </summary>
/// <returns></returns>
virtual std::shared_ptr<TopicData> newDefault() const = 0;
};
/// <summary>
/// 通用消息基类
/// </summary>
class WsMessage : public Serializable, public TopicData {
public:
virtual ~WsMessage() = default;
/// <summary>
/// 目标实体ID
/// </summary>
/// <returns>ID</returns>

View File

@ -0,0 +1 @@
#include "BehaviorEditor.h"

View File

@ -0,0 +1,12 @@
#pragma once
#include <QMainWindow>
#include "BehaviorPerform.h"
class BehaviorEditor : public QMainWindow
{
public:
BehaviorEditor(std::shared_ptr<BehaviorMapNode> map_ins, QWidget *parent = nullptr);
};

View File

@ -99,6 +99,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="BehaviorEditor.cpp" />
<ClCompile Include="PerspectiveView.cpp" />
<ClCompile Include="TempletAssemble.cpp" />
<QtRcc Include="sims_world.qrc" />
@ -115,6 +116,9 @@
<ItemGroup>
<QtMoc Include="PerspectiveView.h" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="BehaviorEditor.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
<Import Project="$(QtMsBuild)\qt.targets" />

View File

@ -52,6 +52,9 @@
<ClCompile Include="PerspectiveView.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BehaviorEditor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtMoc Include="TempletAssemble.h">
@ -61,4 +64,9 @@
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
<ClInclude Include="BehaviorEditor.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>