You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Simulink自动对齐脚本需求:排除TriggerPort块并固定其位置

解决Simulink含TriggerPort子系统的自动对齐问题

原脚本调用Simulink.BlockDiagram.arrangeSystem时会统一布局子系统内所有块,包括TriggerPort,导致这类特殊端口块位置混乱。要固定TriggerPort位置并仅对齐其余组件,可通过锁定/排除特殊块+恢复位置的方式实现,以下是两种可行方案:

方案1:指定布局范围(推荐,适用于R2020b+)

利用arrangeSystem的Blocks参数,仅对非TriggerPort的块执行布局,同时保存并恢复TriggerPort的原始位置:

% Simulink模型名称
model = 'Sample_model';
% 打开模型
open_system(model);
% 查找所有子系统
subsystems = find_system(model, 'FollowLinks', 'on', 'LookUnderMasks', 'all', ...
    'LookUnderReadProtectedSubsystems','on', 'BlockType','SubSystem');

% 遍历每个子系统
for i = 1:length(subsystems)
    subsys_path = subsystems{i};
    
    % 定位当前子系统内的TriggerPort块
    trigger_ports = find_system(subsys_path, 'BlockType', 'TriggerPort');
    
    if ~isempty(trigger_ports)
        % 保存TriggerPort的当前位置
        trigger_positions = get_param(trigger_ports, 'Position');
        
        % 筛选出需要布局的块:排除TriggerPort及其他需固定的端口(如Inport/Outport)
        all_blocks = find_system(subsys_path, 'Type', 'Block');
        exclude_blocks = [trigger_ports; find_system(subsys_path, 'BlockType', {'Inport', 'Outport', 'EnablePort'})];
        layout_blocks = setdiff(all_blocks, exclude_blocks);
        
        % 仅对指定块执行自动布局
        if ~isempty(layout_blocks)
            Simulink.BlockDiagram.arrangeSystem(subsys_path, ...
                'FullLayout', true, ...
                'Blocks', layout_blocks);
        end
        
        % 强制恢复TriggerPort的原始位置
        set_param(trigger_ports, 'Position', trigger_positions);
    else
        % 无TriggerPort的子系统直接正常布局
        Simulink.BlockDiagram.arrangeSystem(subsys_path, 'FullLayout', true);
    end
end

% 保存并关闭模型(取消注释启用)
% save_system(model);
% close_system(model);

方案2:锁定端口块位置(兼容旧版本)

如果你的Simulink版本不支持Blocks参数,可先将TriggerPort设为锁定状态,布局完成后再解锁:

% Simulink模型名称
model = 'Sample_model';
% 打开模型
open_system(model);
% 查找所有子系统
subsystems = find_system(model, 'FollowLinks', 'on', 'LookUnderMasks', 'all', ...
    'LookUnderReadProtectedSubsystems','on', 'BlockType','SubSystem');

% 遍历每个子系统
for i = 1:length(subsystems)
    subsys_path = subsystems{i};
    
    % 定位当前子系统内的TriggerPort块
    trigger_ports = find_system(subsys_path, 'BlockType', 'TriggerPort');
    
    if ~isempty(trigger_ports)
        % 锁定TriggerPort,防止布局时被移动
        set_param(trigger_ports, 'Locked', 'on');
    end
    
    % 执行自动布局
    Simulink.BlockDiagram.arrangeSystem(subsys_path, 'FullLayout', true);
    
    % 解锁TriggerPort(如果之前锁定过)
    if ~isempty(trigger_ports)
        set_param(trigger_ports, 'Locked', 'off');
    end
end

% 保存并关闭模型(取消注释启用)
% save_system(model);
% close_system(model);

关键说明

  • 方案1的精准度更高,可灵活控制哪些块参与布局;方案2操作简单,但布局时可能仍会轻微影响锁定块的周边布局。
  • 可根据需求调整exclude_blocks列表,添加其他需要固定的特殊块(如FunctionCallerPort等)。

内容的提问来源于stack exchange,提问作者chuyễn hoàng cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:16:13