国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用Matlab腳本實現Simulink模塊的自動整理

這篇具有很好參考價值的文章主要介紹了用Matlab腳本實現Simulink模塊的自動整理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????作為模型工程師,在Simulink中建模時,總是希望把模塊排列整齊從而更加美觀。但是模型的反復修改使得我們沒有太多的精力去做這些整理工作。因此筆者開發(fā)了如下腳本來自動實現Simulink模塊的整理工作,效果如下圖所示:

simulink模型自動對齊,Matlab,matlab

? ? ? ? 大家可以自取使用,希望可以給大家的開發(fā)工作帶來一點便利。使用方法是,在模型中點擊想要被整理的模塊(比如一個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 類型的模塊時,才對其位置進行優(yōu)化
    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

如果大家覺得有點用處,還請點個贊,歡迎留言討論~文章來源地址http://www.zghlxwxcb.cn/news/detail-600985.html

到了這里,關于用Matlab腳本實現Simulink模塊的自動整理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

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

    Matlab/simulink/simscape multibody-to wotkspace模塊使用

    因工作需要,對于Matlab/simulink的需求越來越大,學過但不記錄就如走馬觀花,既然如此,那就學在這里,記在這里。下面以simulink中to workspace塊為主,以scope塊 和 timeseries數據使用為輔的一種使用方法記錄。 一句話,to workspace塊的功能是把simulink環(huán)境生成的數據直接導入到Ma

    2024年02月06日
    瀏覽(22)
  • 基于Matlab/Simulink開發(fā)自動駕駛的解決方案

    基于Matlab/Simulink開發(fā)自動駕駛的解決方案

    文章目錄 處理自動駕駛數據 仿真自動駕駛場景 設計感知算法 設計規(guī)劃和控制算法 生成代碼和部署算法 集成和測試 參考文獻 ????????使用 MATLAB/Simulink開發(fā)自動駕駛,能夠深入建模真實世界的行為、減少車輛測試并驗證嵌入式軟件的功能,從而推進自動駕駛感知、規(guī)劃和

    2024年01月20日
    瀏覽(22)
  • Matlab/simulink MIL自動化測試工具使用說明

    Matlab/simulink MIL自動化測試工具使用說明

    ? 目錄 文章目錄 前言 二、工具詳細介紹 1.基礎功能 2.MIL測試功能 總結 ? 隨著Matlab/simulink建模在汽車ECU的開發(fā)過程中的使用越來越普及,如何對模型的正確性進行校核也顯得尤為重要。因此在歷經兩個月的開發(fā)后,基于Matlab APP Designer做了一個MIL測試工具,工具主體分為基礎

    2023年04月16日
    瀏覽(99)
  • 【SIMULINK】simulink實現信號矩陣整合、求逆、轉置、分解、向量矩陣相乘(非matlab)

    【SIMULINK】simulink實現信號矩陣整合、求逆、轉置、分解、向量矩陣相乘(非matlab)

    simulink實現信號矩陣,并實現分解 simulink實現信號矩陣求逆 simulink實現信號矩陣轉置 simulink矩陣向量相乘

    2024年02月11日
    瀏覽(47)
  • MATLAB/ SIMULINK模型在環(huán)MIL測試工具,自動化模型測試工具,自動生成測試報告

    MATLAB/ SIMULINK模型在環(huán)MIL測試工具,自動化模型測試工具,自動生成測試報告

    MATLAB/ SIMULINK模型在環(huán)MIL測試工具,自動化模型測試工具,自動生成測試報告。 軟件純自己編寫,經過長時間測試,包教會。 使用簡單,可以參考如下截圖。 ID:972000 677200256038 悅潮風尚

    2024年02月16日
    瀏覽(27)
  • 具有吸引子的非線性系統(tǒng)(Matlab&Simulink實現)

    具有吸引子的非線性系統(tǒng)(Matlab&Simulink實現)

    ???????? 歡迎來到本博客 ???????? ??博主優(yōu)勢: ?????? 博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ?? 座右銘: 行百里者,半于九十。 ?????? 本文目錄如下: ?????? 目錄 ??1 概述 ??2 運行結果 ??3?參考文獻 ??4 Matlab代碼Simulink仿真實

    2024年02月14日
    瀏覽(19)
  • [simulink] --- simulink模塊

    [simulink] --- simulink模塊

    輸入/輸出端口:作為模塊之間傳遞數據的紐帶,連接輸入信號和輸出信號。 模塊外觀:通常為矩形或圓形,上面帶有說明文字或圖像并顯示有輸出/輸出端口名。 模塊對話框:雙擊模塊外觀后彈出的參數GUI,可以在參數控件上進行參數設置。 gcb:獲取當前被選中的模塊 gcb

    2024年02月04日
    瀏覽(32)
  • 基于PID優(yōu)化和矢量控制裝置的四旋翼無人機(Matlab&Simulink實現)

    基于PID優(yōu)化和矢量控制裝置的四旋翼無人機(Matlab&Simulink實現)

    ????????? 歡迎來到本博客 ???????? ??博主優(yōu)勢: ?????? 博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ?? 座右銘: 行百里者,半于九十。 ?????? 本文目錄如下: ?????? 目錄 ??1 概述 ??2 運行結果 2.1 PID優(yōu)化 2.2?矢量控制裝置? ??3?參考

    2024年02月10日
    瀏覽(90)
  • 非線性質量彈簧阻尼器的神經網絡仿真研究(Matlab代碼&Simulink仿真實現)

    非線性質量彈簧阻尼器的神經網絡仿真研究(Matlab代碼&Simulink仿真實現)

    ? 目錄 ??1 概述 ??2 運行結果 ??3?參考文獻 ??4 Matlab代碼、Simulink仿真實現 非線性質量彈簧阻尼器(Nonlinear Mass-Spring-Damper,NMSD)是一種常見的振動控制裝置,廣泛應用于工程結構的減震和振動控制中。為了進行NMSD的神經網絡仿真研究,以下步驟進行: 1. 數據收集:收集

    2024年02月16日
    瀏覽(29)
  • 【電路效應】信號處理和通信系統(tǒng)模型中的模擬電路效應研究(Simulink&Matlab代碼實現)

    【電路效應】信號處理和通信系統(tǒng)模型中的模擬電路效應研究(Simulink&Matlab代碼實現)

    目錄 ??1 概述 ??2 運行結果 ??3?參考文獻 ??4 Matlab代碼、Simulink仿真實現 在信號處理和通信系統(tǒng)模型中,模擬電路效應研究是指考慮到實際電路的特性對信號進行建模和分析的過程。模擬電路效應可以包括各種電路元件和組件的非線性、延遲、失真等特性對信號傳輸和處

    2024年02月16日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包