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

一、扩展后能做什么
• 给 Wizard/Warlock 增加可停靠工具面板; • 监听平台选择、关注对象和其他 WKF 环境事件; • 在 2D/3D Viewer 上添加距离环、标注和辅助图元; • 增加菜单、工具栏、快捷键与工作流工具。
二、具体实现路径:一共五个步骤
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 或平台销毁前清理引用; • 插件标签、安装目录和依赖库决定能否被目标应用发现。
夜雨聆风