如何使用Ocean API编程调用Petrel中带UI的自定义流程
Petrel Ocean API 右键触发自定义流程实现方法
该需求可以通过Ocean API原生能力实现,官方文档没有对应示例是因为相关逻辑分散在菜单扩展、流程调用两个独立模块,没有组合场景演示,具体实现分两步:
注册自定义右键菜单项
实现IContextMenuInjector接口完成菜单注入:- 在
CanInject方法中校验当前右键选中的对象类型,匹配你的目标对象类型时返回true,此时才会往右键下拉菜单里追加你的自定义选项 - 插件加载阶段调用
CoreServiceRegistry.GetService<IMenuService>().RegisterContextMenuInjector()注册你写的菜单注入类,否则Petrel无法识别自定义菜单项 - 给自定义菜单项绑定点击回调事件,在回调里写流程触发逻辑
- 在
编程触发带UI的自定义流程
不要直接实例化你的流程窗体类弹出,优先走Petrel原生流程调用入口,避免上下文丢失、UI风格不兼容问题:- 如果你的流程已经注册为Petrel可识别的
Process,直接获取IProcessService服务实例,调用RunProcess()方法传入你的流程唯一ID即可,该调用和用户手动从流程面板点击启动的效果完全一致,会自动加载你开发的UI界面 - 如果你的流程没有注册为Petrel Process,在菜单点击回调中先获取当前右键选中的目标对象作为入参传给流程实例,再切到Petrel主线程启动流程、显示UI,跨线程弹UI会导致样式错乱甚至Petrel崩溃,参考代码:
PetrelApplication.Instance.Invoke(new Action(() => { var customFlow = new MyCustomFlow(); customFlow.TargetObject = currentRightClickedObject; customFlow.ShowFlowUI(); customFlow.Run(); }));
- 如果你的流程已经注册为Petrel可识别的
注意事项
CanInject方法是右键点击时实时执行的,不要在里面写重逻辑,否则会导致右键菜单弹出卡顿- 如果你的流程依赖Petrel全局选择集,触发流程前记得把当前右键选中的对象同步到全局选择集,避免流程读取到的选中对象和用户预期不符
- 所有UI操作必须切到Petrel主线程执行,不要在后台线程里直接操作窗体控件
如果你开发的是基于Workstep搭建的可视化流程,直接调用
RunProcess触发即可,不需要额外处理UI逻辑,Petrel会自动弹出对应的参数配置面板。
内容的提问来源于stack exchange,提问作者WDM
相关产品推荐
相关产品推荐

