乐于分享
好东西不私藏

如何实现向模型编辑器菜单添加自定义菜单?

如何实现向模型编辑器菜单添加自定义菜单?

为了减轻我们的模型开发工作量,很多时候我们会编写自动化脚本来完成任务。但是运行脚本经常需要切出Simulink模型,然后找到脚本来运行,还是会有一点不方便。翻阅MATLAB文档发现,可以自定义向模型编辑器菜单添加菜单项。
要将一个菜单项添加到菜单中,请执行以下步骤:
  • 对于每个菜单项,创建一个名为架构函数的函数,用于定义该菜单项;
  • 在启动时使用 Simulink 自定义管理器注册菜单自定义项,例如,在 MATLAB路径上的 sl_customization.m 文件中;
  • 创建回调函数,用于实现由添加到菜单的菜单项触发的命令;
自定义simulink菜单:
  • 编写注册菜单自定义项
使用自定义管理器注册要包含在 Simulink 菜单中的自定义菜单项。使用 Simulink 的 sl_customization.m 文件来执行此任务。对于要自定义的每个菜单,系统 sl_customization 函数必须调用自定义管理器 addCustomMenuFcn 方法例如,以下 sl_customization 函数将自定义项添加到 Simulink 的“工具”菜单。
functionsl_customization(cm)    cm.addCustomMenuFcn('Simulink:PreContextMenu', @myCustomMenu);end
  • 创建自定义菜单函数

自定义菜单函数返回架构函数的元胞数组,这些架构函数定义要在模型编辑器菜单上显示的自定义项。自定义菜单函数返回一个元胞数组,它类似于 generateFcn 函数返回的元胞数组。

您的自定义菜单函数应接受回调信息对象并返回列出架构函数的元胞数组。该元胞数组的每个元素可以是架构函数的句柄,也可以是二元素元胞数组,其第一个元素是某架构函数的句柄,第二个元素是要传递给该架构函数的用户定义的数据。

function schemaFcns = myCustomMenu(callbackInfo)    schemaFcns = {@addMyMenu};end
  • 定义触发自定义命令的菜单项

指定菜单名称和执行动作。要定义子菜单,请创建一个架构函数,该函数接受回调信息对象并返回容器架构对象,该对象指定定义子菜单上的菜单项的架构。

function schema = addMyMenu(callbackInfo)    schema = sl_action_schema;    schema.label = '运行我的脚本';    schema.callback = @runMyScript;end
  • 编写执行函数
在菜单点击时执行的 MATLAB 代码。
functionrunMyScript(~)    disp('自定义脚本已运行!');    % 这里可以调用你的脚本:end
  • 刷新自定义菜单
保存文件后,在 MATLAB 命令行运行:
sl_refresh_customizations
重新打开 Simulink 模型编辑器,就能看到新的菜单项了。实际效果展示:
图一:菜单查看
图二:运行结果
注:
  1. 你可以用 Simulink:PreContextMenu 添加右键菜单,也用 Simulink:PreMenuBar 添加到菜单栏。
  2. 如果要分组多个菜单项,可以返回多个 sl_action_schema 对象。
  3. 复杂功能可以结合 GUI、脚本和模型 API 一起使用。
参考文档:    

向模型编辑器菜单添加菜单项:https://ww2.mathworks.cn/help/simulink/ug/adding-items-to-model-editor-menus.html;