Simulink、Stateflow添加自定义菜单项
本文介绍如何将一个菜单项添加到simulink或Stateflow菜单中;
1. 注册菜单自定义项
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);
使用 sl_customization.m 函数注册您的自定义项。将该函数放在MATLAB的路径上或当前路径下。
您可以有多个 sl_customization.m 文件。每个文件中的自定义项都会生效,如果出现冲突,则由相应的自定义项进行处理。例如,如果您在多个 sl_customization 文件中为库指定了优先级,则只有一个生效。如果您对同一个菜单项添加两次,它会出现两次。要确保自定义按预期加载,请刷新自定义,如读取和刷新自定义文件中所述。
1.1 读取和刷新自定义文件
当 Simulink 启动时会读取 sl_customization.m 文件。如果您更改了 sl_customization.m 文件,请重新启动 Simulink 或输入以下命令以查看更改:
sl_refresh_customizations
此命令运行 MATLAB 路径和当前文件夹中的所有 sl_customization.m 文件。运行 sl_refresh_customizations 的一些副作用包括:
(1)重新编译 Simulink 工具条
(2)重新编译所有 Simulink Editor 菜单
(3)重新编译 Library Browser 菜单和工具栏
(4)清除 Library Browser 缓存并刷新 Library Browser
(5)重新加载 Viewers and Generators Manager 数据
1.2 函数使用
对于要自定义的每个菜单,系统 sl_customization 函数必须调用自定义管理器 addCustomMenuFcn 方法。每次调用都应该传递要自定义的菜单的标记和自定义菜单函数,该函数指定要添加到菜单中的项目。例如,以下 sl_customization 函数将自定义项添加到 Simulink 的 Tools 菜单。
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);
addCustomMenuFcn函数有两个输入参数,第一个是菜单标记,第二个输入参数是自定义菜单函数。
1.3 菜单标记
Simulink菜单标记
标记 | 添加的项目 |
---|---|
Simulink菜单标记 | |
Simulink:MenuBar | Simulink Editor 菜单栏的菜单 |
Simulink:PreContextMenu | Simulink Editor 上下文菜单开头的项目 |
Simulink:ContextMenu | Simulink Editor 上下文菜单末尾的项目 |
Simulink:FileMenu | Simulink Editor 的 File 菜单末尾的项目 |
Simulink:EditMenu | Simulink Editor 的 Edit 菜单末尾的项目 |
Simulink:ViewMenu | Simulink Editor 的 View 菜单末尾的项目 |
Simulink:DisplayMenu | Simulink Editor 的 Display 菜单末尾的项目 |
Simulink:DiagramMenu | Simulink Editor 的 Diagram 菜单末尾的项目 |
Simulink:SimulationMenu | Simulink Editor 的 Simulation 菜单末尾的项目 |
Simulink:AnalysisMenu | Simulink Editor 的 Analysis 菜单末尾的项目 |
Simulink:CodeMenu | Simulink Editor 的 Code 菜单末尾的项目 |
Simulink:ToolsMenu | Simulink Editor 的 Tools 菜单末尾的项目 |
Simulink:HelpMenu | Simulink Editor 的 Help 菜单末尾的项目 |
State flow菜单标记 | |
Stateflow:MenuBar | Stateflow Editor 菜单栏的菜单 |
Stateflow:PreContextMenu | Stateflow Editor 上下文菜单开头的项目 |
Stateflow:ContextMenu | Stateflow Editor 上下文菜单末尾的项目 |
Stateflow:FileMenu | Stateflow Editor 的 File 菜单末尾的项目 |
Stateflow:EditMenu | Stateflow Editor 的 Edit 菜单末尾的项目 |
Stateflow:ViewMenu | Stateflow Editor 的 View 菜单末尾的项目 |
Stateflow:DisplayMenu | Stateflow Editor 的 Display 菜单末尾的项目 |
Stateflow:ChartMenu | Stateflow Editor 的 Chart 菜单末尾的项目 |
Stateflow:SimulationMenu | Stateflow Editor 的 Simulation 菜单末尾的项目 |
Stateflow:AnalysisMenu | Stateflow Editor 的 Analysis 菜单末尾的项目 |
Stateflow:CodeMenu | Stateflow Editor 的 Code 菜单末尾的项目 |
Stateflow:ToolsMenu | Stateflow Editor 的 Tools 菜单末尾的项目 |
Stateflow:HelpMenu | Stateflow Editor 的 Help 菜单末尾的项目 |
例如:想要在simulink编辑界面,右键上下文菜单开头添加getMyItems自定义菜单函数:
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:PreContextMenu', @getMyItems);
2. 自定义菜单函数
2.1 创建自定义菜单函数
自定义菜单函数返回架构函数的元胞数组,这些架构函数定义要在模型编辑器菜单上显示的自定义项。自定义菜单函数返回一个元胞数组,它类似于 generateFcn 函数返回的元胞数组。
您的自定义菜单函数应接受回调信息对象并返回列出架构函数的元胞数组。该元胞数组的每个元素可以是架构函数的句柄,也可以是二元素元胞数组,其第一个元素是某架构函数的句柄,第二个元素是要传递给该架构函数的用户定义的数据。例如,以下自定义菜单函数返回一个列出三个架构函数的元胞数组。
function schemas = getMyItems(callbackInfo)
schemas = {@getItem1, ...
@getItem2, ...
@getItem3};
end
2.2 定义菜单项
可以通过创建一个返回架构对象的函数来定义菜单项,该对象指定创建该菜单项所需的信息。
function schema = getItem1(~)
schema = sl_action_schema;
schema.label = 'PortAlignment';
% schema.userdata = 'item one';
schema.callback = @PortAlignment;
end
操作架构对象. 此对象指定有关触发您定义的命令的菜单项的信息,包括菜单项上显示的标签以及用户选择该菜单项时要调用的函数。使用函数 sl_action_schema 在架构函数中创建此对象的实例。其属性包括:
属性 | 描述 |
---|---|
tag | 可选字符向量,用于标识此操作以便筛选器函数可以引用它 |
label | 字符向量,用于指定触发此操作的菜单项上显示的标签 |
state | 用于指定此操作的状态的属性。有效值为 ‘Enabled’(默认值)、‘Disabled’ 和 ‘Hidden’ |
statustip | 字符向量,指定当用户选择触发此操作的菜单项时在编辑器状态栏中要显示的文本 |
userdata | 指定的数据。可以是任何类型 |
accelerator | 字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式,并且不能重新定义 Simulink Editor 自带的快捷键。例如,Ctrl+D 是 Simulink Editor 中 Update Diagram 的快捷键,因此您不能重新定义它。要指定此值,请使用 ‘Ctrl+K’ 形式,其中 K 是快捷键。例如,对于通过按住 Ctrl 和 Alt 并按 T 调用的快捷键,使用 ‘Ctrl+Alt+T’ |
callback | 字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参数:回调信息对象 |
autoDisableWhen | 控制何时自动禁用菜单项的属性 |
这里需要着重关注的有两项,label和callback:
label是添加自定义菜单后,自定义菜单显示的名字;
callback是自定义菜单添加后,当触发此操作后,MATLAB索要运行的函数名;
注意:callback函数需要再MATLAB的编译路径下,否则因为无法找到报错;
3.如何使用
该脚本编写完成后,不能直接运行该m文件,该文件是当 Simulink 启动时会读取 sl_customization.m 文件。如果您更改了 sl_customization.m 文件,请重新启动 Simulink 或输入以下命令以查看更改:
sl_refresh_customizations
源码
以下源码是将前面两篇文章里介绍的端口对齐和数据字典自动生成功能,添加到了simulin和stateflow的右键菜单中,使用相应的功能时仅需要右键点击菜单,则自动运行相应的m文件;
%% 自定义Simulink菜单栏
%
% Author: LL
%% File Content
% 使用cm对象的addCustomMenuFcn函数,添加自定义菜单
function sl_customization(cm)
cm.addCustomMenuFcn('Simulink:PreContextMenu',@getMyItems);%simulink右键菜单
cm.addCustomMenuFcn('Stateflow:PreContextMenu',@getMyItems);%state右键菜单
end
% 自定义菜单创建函数
function schemaFcns = getMyItems(~)
schemaFcns = {@getItem1,@getItem2};
end
%% 为菜单项定义模式函数
function schema = getItem1(~)
schema = sl_action_schema;
schema.label = 'PortAlignment';
% schema.userdata = 'item one';
schema.callback = @PortAlignment;
end
function schema = getItem2(~)
schema = sl_action_schema;
schema.label = 'CreateSldd';
% schema.userdata = 'item one';
schema.callback = @CreateSldd;
end