Перемещение нескольких ячеек на рисунке? - PullRequest
1 голос
/ 13 июля 2011

У меня уже есть функции, необходимые для перетаскивания одного прямоугольника на фигуре в MATLAB.Код, который я написал, заполняет фигуру несколькими прямоугольниками.С помощью другого цикла я заполнил фигуру большим количеством полей (которые содержат различную информацию в виде строки).

Эти два набора ящиков связаны с числами, которые я поместил в их UserData (соответствующие числа; для каждого ящика есть другое с таким же содержанием UserData).Находя блоки, содержащие одинаковые UserData (и, таким образом, связывая их), я хочу иметь возможность переместить элемент первого набора блоков в ту же позицию относительно соответствующего элемента второго набора блоков с помощью щелчка правой кнопкой мыши наящик, который я только что перетащил (uicontextmenu).

function recallfcn(hObject,eventdata)
for ydx=1:2
    diag_detail=get(gco,'UserData');   % This line should be in the drag fcn
    diag_pos=get(gco,'Position');      % So should this one (for current objects)
    xvar=diag_pos(1,1);
    yvar=diag_pos(1,2);
    detail=[diag_detail ydx]; 
    set(findobj('UserData',detail),'Position',[xvar+(ydx-1.5) yvar+0.5 0.8 0.8]);
end
end

% ydx is only there to add another level of detail as I'm actually looking to move     
% two boxes of the 'first kind', each of which have 2 numbers in user data, the first  
% number being the same, and the second number distinguishing the first box from the 
% second. The premise is the same.

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

Поскольку Jonas ссылается на , свойство 'HandleVisibility' объекта будет определять, будет ли объект отображаться в списке дочерних элементов его родителя, и, таким образом, будет ли он возвращен такие функции, как FINDOBJ . Стандартное исправление заключается в использовании функции FINDALL .

Однако свойство 'HandleVisibility' также вступает в игру при определении, может ли объект стать текущим объектом (то есть возвращаемым функцией GCO). Если он установлен на 'off', то этот объект не может стать текущим объектом. Кроме того, если свойство 'HandleVisibility' родительской фигуры объекта установлено в 'off', то ни один из его дочерних элементов (включая указанный объект) не может стать текущим объектом.

Если 'HandleVisibility' установлен на 'on' или 'callback' для всех ваших объектов и фигур, то я думаю, что все должно работать нормально.

3 голосов
/ 13 июля 2011

Я обычно использую findall вместо findobj, если ручки объектов не видны снаружи. Кроме этого я не понимаю, почему ваш код не будет работать.

Вот пример:

%# make a figure with two buttons, same userData
fh=figure,
uicontrol('userdata',[2 3],'parent',fh)
uicontrol('userData',[2 3],'units','normalized','position',[0.5 0.5,0.1 0.1],'parent',fh)

%# change color to red
set(findall(fh,'userData',[2 3]),'backgroundcolor','r')

%# move to the same position
set(findall(fh,'userData',[2 3]),'position',[0.3,0.3,0.1,0.1])
0 голосов
/ 10 мая 2016

Вы должны инвертировать вектор X и Y, и вы можете использовать только один цикл, изменение в вашем коде:

x2=x(end:-1:1); % invers the ordre
y2=y(end:-1:1);

for i=1:length(x)

set(hLine,'xdata',x(i),'ydata',y(i)); % move the point using set
                                  % to change the cooridinates.

set(hLine2,'xdata',x2(i),'ydata',y2(i));

 M(i)=getframe(gcf);

end
...