Matlab编程技巧:自定义Simulink菜单(理解补充)

Matlab编程技巧:自定义Simulink菜单

本文对原文补充。和自我理解说明,原文见上面链接:

本文研究如何在Simulink菜单中嵌入自定义的脚本。博客内容参考了帮助文档:Add Items to Model Editor Menus。

文章目录

1 问题引入

2 自定义Simulink菜单过程

2.1 新建注册文件

2.2 项目组的函数

2.3 项目的函数

2.4 功能实现的函数

3 模型验证

4 其他注意点

5 总结

1 问题引入

博主以前的博客分享过很多关于Matlab脚本自动化处理模型的方法。但是运行脚本经常需要切出Simulink模型,然后找到脚本来运行,还是会有一点不方便。

基于这个痛点,博主研究了一下将脚本命令直接在模型的菜单中运行的方法。实际工作中使用下来非常方便。

2 自定义Simulink菜单过程

本章中博主从零开始记录自定义Simulink菜单的过程。

2.1 新建注册文件

sl_customization.m文件是Matlab中专门提供给用户注册自定义功能的,因此,自定义Simulink菜单也需要创建这个文件。这里的Simulink:ContextMenu 可以修改成Simulink:ToolsMenu如下所示:

Matlab 复制代码
function sl_customization(cm)

cm = sl_customization_manager;
cm.addCustomMenuFcn('Simulink:ToolsMenu',@MyCustomMenu);
end

function schemaFcns = MyCustomMenu(~)
    schemaFcns = {@MainMenuItem};
end

function schema = MainMenuItem(~)
    schema = sl_container_schema;
    schema.label = 'MyTools';% subfunction name
    schema.childrenFcns = {@SubItem1,@SubItem2};% call back Hand
end
function schema =SubItem1(~)
    schema = sl_action_schema;
    schema.callback = @ResoloveSignals;%call back Hand
end

这一步中要新建一个名为sl_customization.m的空白文件,在文件中写入如下函数。

在这里插入图片描述

上图中cm.addCustomMenuFcn()函数是将自定义Simulink菜单的功能注册到整个sl_customization自定义文件中。该函数包含两个参数:

Simulink:ContextMenu指的是自定义菜单的位置添加到ContextMenu中,也就是鼠标右键的菜单;

@getMyMenuItems是一个回调函数,会返回具体有哪些菜单的项目。

2.2 项目组的函数

在sl_customization.m的后面继续添加项目组的函数,也就是2.1节中的回调函数@getMyMenuItems。

在这里插入图片描述

该函数返回值也是回调函数,是项目函数组成的的单元数组。单元数组中的回调函数可以有多个,对应了定义多个菜单,后面的项目回调函数也要能够一一对应。

2.3 项目的函数

紧接着之后是项目的函数,也就是上一节的回调函数@getItem1。

在这里插入图片描述

这个函数返回的shema中有两个关键信息。label指的是菜单的名称,会显示在右键菜单中。callback是运行自定义菜单后所执行的脚本名,也是一个回调函数。

如果在2.2节中的单元数组返回了多个回调函数,这里也要建立对应的回调函数。

2.4 功能实现的函数

最后建立真正实现功能的函数ModifyBlockColorToRed,其效果是将选中的模块的颜色置为红色。

在这里插入图片描述

首先用set_param函数将当前选中的模块的BackgroundColor属性改为Red。然后用msgbox弹窗显示完成。如果2.2章节的单元数组中有多个项目。功能实现的函数要和2.3章节中的多个回调函数一一对应。

至此,这个简单的脚本就写完了,将其保存。全部代码如下。

Matlab 复制代码
function sl_customization(cm)
cm.addCustomMenuFcn('Simulink:ContextMenu', @getMyMenuItems);
end

%% Define the custom menu function.
function schemaFcns = getMyMenuItems(~)
schemaFcns = {@getItem1};
end

%% Define the schema function for first menu item.
function schema = getItem1(~)
schema = sl_action_schema;
schema.label = 'ModifyBlockColorToRed';
schema.callback = @ModifyBlockColorToRed;
end

%% Define the change color function
function ModifyBlockColorToRed(~)
set_param(gcb,'BackgroundColor','Blue');
msgbox('Complete!');
end

3 模型验证

1)将sl_customization.m保存到当前路径,或者Matlab的搜索路径中。然后在模型中运行:

>> sl_refresh_customizations

就可以将第2章的脚本内容注册到Simulink中了。

2)新建一个模型,做一些简单的模块来验证一下效果。

在这里插入图片描述

3)在Gain模块上右键,可以看到菜单的最下面多了一个ModifyBlockColorToRed。

在这里插入图片描述

点击ModifyBlockColorToRed后,Gain模块就变成了红色,然后弹出了窗口。

在这里插入图片描述

自定义菜单的功能也就验证完成了。

4 其他注意点

前两章通过简单的例子研究了自定义菜单的方法,但是在实际应用中可以更加灵活多变。

第2章节中的函数可以分成多个文件管理,只要这些文件都在Matlab的搜索路径中就行了;

自定义菜单所处的位置也可以是顶部工具栏,只要修改一下addCustomMenuFcn函数中的参数;

如果是修改模块参数,最好还是弹窗反馈或者在Matlab中打印出改的地方,以免脚本的bug改错了模型;

5 总结

本文研究了自定义Simulink菜单的方法,提高了建模的效率。


版权声明:本文为CSDN博主「chhttty」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u013288925/article/details/110717931

相关推荐
华玥作者6 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_6 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠6 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog6 小时前
zebra通过zpl语言实现中文打印(二)
javascript
lang201509286 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC7 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务8 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
baidu_247438618 小时前
Android ViewModel定时任务
android·开发语言·javascript
嘿起屁儿整8 小时前
面试点(网络层面)
前端·网络
VT.馒头8 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript