循环更改块位置

时间:2019-06-06 11:10:38

标签: matlab simulink

我有一个Matlab脚本,可为我在文本文件中找到的每个元素创建一个模型块。

问题在于所有模型都在窗口中彼此创建。所以我试图做一个像这样的循环:

for each element in text file
    I add a Model block 
    I place right to the previous one
end

所以它看起来像这样: enter image description here

如您在左侧看到的那样,所有模型都位于彼此之间,我想将它们放置在右侧。

我尝试过:

m = mdlrefCountBlocks(diagrammeName)+500;
add_block('simulink/Ports & Subsystems/Model',[diagrammeName '/' component_NameValue]);
set_param(sprintf('%s/%s',diagrammeName,component_NameValue), 'ModelFile',component_NameValue); 
size_blk = get_param(sprintf('%s/%s',diagrammeName,component_NameValue),'Position'); 
X = size_blk(1,1); 
Y = size_blk(1,2); 
Width = size_blk(1,3); 
Height = size_blk(1,4); 
set_param(sprintf('%s/%s',diagrammeName,component_NameValue),'Position',[X+m Y X+Width Y+Height]);

在循环内部,但返回错误Invalid definition of rectangle. Width and height should be positive.

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

块的position属性实际上并不包含其宽度和高度,而是画布上角的位置(请参见Common Block Properties):

  

坐标矢量,以像素为单位:[left top right bottom]

     

原点是Simulink Editor画布在调整画布大小之前的左上角。支持的坐标在-1073740824和1073740823之间(含)。正值位于原点的右侧和下方。负值位于原点的左侧和上方。

因此将您的代码更改为例如:

size_blk = get_param(sprintf('%s/%s',diagrammeName,component_NameValue),'Position'); 
set_param(sprintf('%s/%s',diagrammeName,component_NameValue),'Position', size_blk + [m 0 0 0]);