用Matlab脚本实现Simulink模块的自动整理

这篇具有很好参考价值的文章主要介绍了用Matlab脚本实现Simulink模块的自动整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        作为模型工程师,在Simulink中建模时,总是希望把模块排列整齐从而更加美观。但是模型的反复修改使得我们没有太多的精力去做这些整理工作。因此笔者开发了如下脚本来自动实现Simulink模块的整理工作,效果如下图所示:

simulink模型自动对齐,Matlab,matlab

        大家可以自取使用,希望可以给大家的开发工作带来一点便利。使用方法是,在模型中点击想要被整理的模块(比如一个subsystem,使得gcbh为当前选中模块的句柄),再运行函数 arrangeit() 即可。

 代码如下:

% 整理与所选模块的输入和输出连接的模块的位置,使之排布整齐
% 操作方法:先在simulink中点击选中目标模块,再运行该函数

function arrangeit()
lineh = get(gcbh, 'LineHandles');
porth = get(gcbh, 'PortHandles');
blkDistance = 150;

%% 设置输入接口模块
for i = 1:1:length(porth.Inport)
    % 如果当前port口上悬空,没有连线,则跳过
    if isequal(lineh.Inport(i), -1)
        continue;
    end
    
    % 获取当前port口的位置
    [portx, porty, ~, ~] = lgetpos(porth.Inport(i));
    % 获取当前port口连线的源模块的句柄
    curtLineSrcBlkH = get_param(lineh.Inport(i), 'SrcBlockHandle');
    
    % 如果源模块是subsystem,则不对该subsystem的位置进行设置
    if isequal('SubSystem', get_param(curtLineSrcBlkH, 'BlockType'))
        continue;
    end
    % 获取源模块的宽度和高度值
    [~, ~, width, height] = lgetpos(curtLineSrcBlkH);
    % 重新设置源模块的位置,保持其宽度和高度值不变
    newx = portx - blkDistance;
    newy = porty - height / 2;
    lsetpos(curtLineSrcBlkH, newx, newy, width, height);
end

%% 设置输出接口模块
for i = 1:1:length(porth.Outport)
    % 如果当前port口上悬空,没有连线,则跳过
    if isequal(lineh.Outport(i), -1)
        continue;
    end

    % curtPortPos = get_param(porth.Outport(i), 'Position');
    % 获取当前port口的位置
    [portx, porty, ~, ~] = lgetpos(porth.Outport(i));
    % 获取当前port口连线的目标模块的句柄
    curtLineDstBlkH = get_param(lineh.Outport(i), 'DstBlockHandle');
    
    % 如果目标模块是subsystem,则不对该subsystem的位置进行设置
    if isequal('SubSystem', get_param(curtLineDstBlkH, 'BlockType'))
        continue;
    end
    % 如果目标模块是 swithc, 则不对该subsystem的位置进行设置
    if isequal('Switch', get_param(curtLineDstBlkH, 'BlockType'))
        continue;
    end
    
    % 当前port连线的目标模块可能有多个模块,因此挨个处理
    for j = 1:1:length(curtLineDstBlkH)
        % 获取源模块的宽度和高度值
        [~, ~, width, height] = lgetpos(curtLineDstBlkH(j));
        % newx = curtPortPos(1) + blkDistance;
        % newy = curtPortPos(2) - height / 2 + height * (j - 1);
        newx = portx + blkDistance;
        newy = porty - height / 2 + height * (j - 1);
        lsetpos(curtLineDstBlkH(j), newx, newy, width, height);
    end
end

%% 设置 enable 或 trigger 接口,两种类型的port合并后处理
EnableTriggerPortH = -1;
EnableTriggerLineH = -1;
if (~isequal(lineh.Enable, -1)) && (~isempty(lineh.Enable))
    EnableTriggerPortH = porth.Enable;
    EnableTriggerLineH = lineh.Enable;
end
if (~isequal(lineh.Trigger, -1)) && (~isempty(lineh.Trigger))
    EnableTriggerPortH = porth.Trigger;
    EnableTriggerLineH = lineh.Trigger;
end

if ~isequal(EnableTriggerPortH, -1)
    % 获取当前port口的位置
    [portx, porty, ~, ~] = lgetpos(EnableTriggerPortH);
    % 获取当前port口连线的源模块的句柄
    curtLineSrcBlkH = get_param(EnableTriggerLineH, 'SrcBlockHandle');
    
    % 只有当enable port的源模块是 inport 类型的模块时,才对其位置进行优化
    if isequal('Inport', get_param(curtLineSrcBlkH, 'BlockType'))
        % 获取源模块的宽度和高度值
        [~, ~, width, height] = lgetpos(curtLineSrcBlkH);
        % 重新设置源模块的位置,保持其宽度和高度值不变
        newx = portx - width * 3;
        newy = porty - height * 2;
        lsetpos(curtLineSrcBlkH, newx, newy, width, height);
    end
end

end

函数 arrangeit() 使用到了位置设置和位置读取的两个函数的代码如下:

function lsetpos(blockH, x, y, width, height)
% lsetpos(blockH, x, y, width, height)
% blockH 可以是 目标模块句柄,或者是 目标模块路径
% blockH 不能是 port 或者 line 的句柄
% width 和 height 必须 ≥ 0

% 入参合法性检查
% 如果 blockH 是句柄,则维度必须是1
% 如果 blockH 是目标模块路径,则是字符串
if ((length(blockH) > 1) && (~ischar(blockH)))
    errordlg('函数 lsetpos 的入参 blockH 的长度大于1','错误','creatmode');
end
if (width < 0)
    errordlg('错误信息:函数 lsetpos 的入参 width 小于0 ! 应 ≥ 0 ','错误','creatmode');
end
if (height < 0)
    errordlg('错误信息:函数 lsetpos 的入参 height 小于0 ! 应 ≥ 0 ','错误','creatmode');
end

set_param(blockH, 'Position', [x, y, x + width, y + height]);

end


function [x, y, width, height] = lgetpos(blockH)
% [x, y, width, height] = lgetpos(目标模块句柄)
% 如果 目标模块句柄 是一个 port 的句柄,则 width 和 height 返回-1

% 入参合法性检查
if (length(blockH) > 1)
    errordlg('函数 lgetpos 的入参 blockH 的长度大于1','错误','creatmode');
end

pos = get_param(blockH, 'Position');

x = pos(1);
y = pos(2);

% 如果目标句柄是port的句柄,则pos只有两维,此时宽度和高度返回-1
if length(pos) == 4
    width = pos(3) - pos(1);
    height = pos(4) - pos(2);
else
    width = -1;
    height = -1;
end

end

如果大家觉得有点用处,还请点个赞,欢迎留言讨论~文章来源地址https://www.toymoban.com/news/detail-600985.html

到了这里,关于用Matlab脚本实现Simulink模块的自动整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab/simulink/simscape multibody-to wotkspace模块使用

    因工作需要,对于Matlab/simulink的需求越来越大,学过但不记录就如走马观花,既然如此,那就学在这里,记在这里。下面以simulink中to workspace块为主,以scope块 和 timeseries数据使用为辅的一种使用方法记录。 一句话,to workspace块的功能是把simulink环境生成的数据直接导入到Ma

    2024年02月06日
    浏览(32)
  • 基于Matlab/Simulink开发自动驾驶的解决方案

    文章目录 处理自动驾驶数据 仿真自动驾驶场景 设计感知算法 设计规划和控制算法 生成代码和部署算法 集成和测试 参考文献         使用 MATLAB/Simulink开发自动驾驶,能够深入建模真实世界的行为、减少车辆测试并验证嵌入式软件的功能,从而推进自动驾驶感知、规划和

    2024年01月20日
    浏览(34)
  • Matlab/simulink MIL自动化测试工具使用说明

      目录 文章目录 前言 二、工具详细介绍 1.基础功能 2.MIL测试功能 总结   随着Matlab/simulink建模在汽车ECU的开发过程中的使用越来越普及,如何对模型的正确性进行校核也显得尤为重要。因此在历经两个月的开发后,基于Matlab APP Designer做了一个MIL测试工具,工具主体分为基础

    2023年04月16日
    浏览(36)
  • 【SIMULINK】simulink实现信号矩阵整合、求逆、转置、分解、向量矩阵相乘(非matlab)

    simulink实现信号矩阵,并实现分解 simulink实现信号矩阵求逆 simulink实现信号矩阵转置 simulink矩阵向量相乘

    2024年02月11日
    浏览(26)
  • MATLAB/ SIMULINK模型在环MIL测试工具,自动化模型测试工具,自动生成测试报告

    MATLAB/ SIMULINK模型在环MIL测试工具,自动化模型测试工具,自动生成测试报告。 软件纯自己编写,经过长时间测试,包教会。 使用简单,可以参考如下截图。 ID:972000 677200256038 悦潮风尚

    2024年02月16日
    浏览(41)
  • 具有吸引子的非线性系统(Matlab&Simulink实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码Simulink仿真实

    2024年02月14日
    浏览(37)
  • [simulink] --- simulink模块

    输入/输出端口:作为模块之间传递数据的纽带,连接输入信号和输出信号。 模块外观:通常为矩形或圆形,上面带有说明文字或图像并显示有输出/输出端口名。 模块对话框:双击模块外观后弹出的参数GUI,可以在参数控件上进行参数设置。 gcb:获取当前被选中的模块 gcb

    2024年02月04日
    浏览(25)
  • 基于PID优化和矢量控制装置的四旋翼无人机(Matlab&Simulink实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 PID优化 2.2 矢量控制装置  🎉3 参考

    2024年02月10日
    浏览(36)
  • 非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码&Simulink仿真实现)

      目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真实现 非线性质量弹簧阻尼器(Nonlinear Mass-Spring-Damper,NMSD)是一种常见的振动控制装置,广泛应用于工程结构的减震和振动控制中。为了进行NMSD的神经网络仿真研究,以下步骤进行: 1. 数据收集:收集

    2024年02月16日
    浏览(24)
  • 【电路效应】信号处理和通信系统模型中的模拟电路效应研究(Simulink&Matlab代码实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真实现 在信号处理和通信系统模型中,模拟电路效应研究是指考虑到实际电路的特性对信号进行建模和分析的过程。模拟电路效应可以包括各种电路元件和组件的非线性、延迟、失真等特性对信号传输和处

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包