乐于分享
好东西不私藏

AFSIM 二次开发丨WKF 插件扩展:如何定制一个用户交互面板?

AFSIM 二次开发丨WKF 插件扩展:如何定制一个用户交互面板?

WKF 是 AFSIM 图形应用共享的插件框架。通过 WKF 插件,可以增加停靠面板、菜单动作、平台选择响应和 Viewer 附着图元。

AFSIM WKF 插件架构

一、扩展后能做什么

  • • 给 Wizard/Warlock 增加可停靠工具面板;
  • • 监听平台选择、关注对象和其他 WKF 环境事件;
  • • 在 2D/3D Viewer 上添加距离环、标注和辅助图元;
  • • 增加菜单、工具栏、快捷键与工作流工具。

二、具体实现路径:一共五个步骤

  1. 1. 派生 wkf::Plugin;2. 定义插件元数据;3. 创建 Qt DockWidget;4. 连接 WKF 事件并操作 Viewer;5. 配置 CMake、部署和验证。

三、步骤 1/5:定义插件类

class Plugin : public wkf::Plugin{public:   Plugin(const QString& name, size_t uniqueId);private:void SelectionChanged(const wkf::PlatformList& selected,                         const wkf::PlatformList& unselected);};

通用 WKF 插件不直接访问 WsfSimulation;它面向 GUI 环境、Viewer 和 WKF 平台代理。

四、步骤 2/5:导出插件符号

WKF_PLUGIN_DEFINE_SYMBOLS(   Training::Plugin,   "WKF Training",   "Plugin created for AFSIM Developer Course.",   "all")

最后一个标签决定插件适用应用。all 可同时供 Wizard 和 Warlock 加载;只面向特定应用时应使用对应标签。

五、步骤 3/5:增加 DockWidget

class DockWidget : public QDockWidget{   Q_OBJECTpublic:   DockWidget(QWidget* parent = nullptr,              Qt::WindowFlags flags = {});private:   Ui::WKF_Training mUI;};DockWidget::DockWidget(QWidget* parent, Qt::WindowFlags flags)   : QDockWidget(parent, flags){   mUI.setupUi(this);}

插件构造时挂到主窗口:

wkf::MainWindow* window = wkfEnv.GetMainWindow();window->addDockWidget(Qt::RightDockWidgetArea,                      new DockWidget());

setupUi(this) 缺失时面板存在但内容为空。

六、步骤 4/5:响应选择并附加图元

connect(&wkfEnv, &wkf::Environment::PlatformSelectionChanged,        this, &Training::Plugin::SelectionChanged);
for (auto platform : selected){   if (!platform->FindAttachment("range_ring"))   {      vespa::make_attachment<wkf::AttachmentRangeRing>(         *platform, vaEnv.GetStandardViewer(), "range_ring");   }}for (auto platform : unselected){   auto* ring = platform->FindAttachment("range_ring");   if (ring) platform->RemoveAttachment(ring->GetUniqueId());}

唯一名称防止重复创建;取消选择时使用 Attachment ID 移除。

七、步骤 5/5:构建与部署

plugin_cmakelists_template(   WKF_Training tools/wkf   LIBRARIES wkf wkf_common)

Qt .ui 文件由构建系统生成 ui_*.h。部署后验证插件发现、View 菜单面板开关、平台选中/取消以及场景切换后的 Attachment 清理。

八、工程注意事项

  • • UI 对象必须在 GUI 线程创建和修改;
  • • QObject 父子关系与 PluginUiPointer 决定生命周期;
  • • WKF Platform 是显示层代理,不等同于 WsfPlatform
  • • Attachment 名称应避免与其他插件冲突;
  • • Viewer 或平台销毁前清理引用;
  • • 插件标签、安装目录和依赖库决定能否被目标应用发现。