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
相关产品推荐
相关产品推荐

