Цикл для изменения положения блока - PullRequest
0 голосов
/ 06 июня 2019

У меня есть скрипт 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 Ответ

3 голосов
/ 06 июня 2019

Свойство position блока фактически не содержит его ширину и высоту, но позиции углов на холсте (см. Common Block Properties ):

вектор координат в пикселях: [left top right bottom]

Источником является верхний левый угол холста Simulink Editor до изменения размера холста. Поддерживаемые координаты находятся между -1073740824 и 1073740823 включительно. Положительные значения находятся справа и вниз от начала координат. Отрицательные значения располагаются слева от начала координат.

Так что измените свой код, например, на ::1012*

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]);
...