获取图形中多个对象之一的当前位置



我写了一个脚本,返回了一个图中的几个文本框。文本框是可移动的(我可以拖放它们(,它们的位置由输入矩阵中的数据预先确定(输入矩阵的数据通过嵌套for循环应用于框的各个位置(。我想创建一个矩阵,它最初是输入矩阵的副本,但在我通过拖动框来更改框的位置时会更新。我该如何更新他们的立场?这是的整个脚本

function drag_drop=drag_drop(tsinput,infoinput)
[x,~]=size(tsinput);
dragging = [];
orPos = [];
fig = figure('Name','Docker Tool','WindowButtonUpFcn',@dropObject,...
'units','centimeters','WindowButtonMotionFcn',@moveObject,...
'OuterPosition',[0 0 25 30]);
% Setting variables to zero for the loop
plat_qty=0;
time_qty=0;
k=0;
a=0; 
% Start loop
z=1:2
    for idx=1:x
        if tsinput(idx,4)==1
            color='red';
        else
            color='blue';
        end
        a=tsinput(idx,z);
       b=a/100;
        c=floor(b); % hours
        d=c*100;
        e=a-d; % minutes
        time=c*60+e; % time quantity to be used in 'position'
        time_qty=time/15;
        plat_qty=tsinput(idx,3)*2;
        box=annotation('textbox','units','centimeters','position',...
        [time_qty plat_qty 1.5 1.5],'String',infoinput(idx,z),...
        'ButtonDownFcn',@dragObject,'BackgroundColor',color); 
        % need to new=get(box,'Position'), fill out matrix OUT of loop
    end
    fillmenu=uicontextmenu;
    hcb1 = 'set(gco, ''BackgroundColor'', ''red'')';
    hcb2 = 'set(gco, ''BackgroundColor'', ''blue'')';
    item1 = uimenu(fillmenu, 'Label', 'Train Full', 'Callback', hcb1);
    item2 = uimenu(fillmenu, 'Label', 'Train Empty', 'Callback', hcb2);
    hbox=findall(fig,'Type','hggroup');
    for jdx=1:x
        set(hbox(jdx),'uicontextmenu',fillmenu);
    end
end
new_arr=tsinput;
function dragObject(hObject,eventdata)
dragging = hObject;
orPos = get(gcf,'CurrentPoint');
end
function dropObject(hObject,eventdata,box)
if ~isempty(dragging)
    newPos = get(gcf,'CurrentPoint');
    posDiff = newPos - orPos;
    set(dragging,'Position',get(dragging,'Position') + ...
    [posDiff(1:2) 0 0]);
    dragging = [];
end
end
function moveObject(hObject,eventdata)
if ~isempty(dragging)
newPos = get(gcf,'CurrentPoint');
posDiff = newPos - orPos;
orPos = newPos;
set(dragging,'Position',get(dragging,'Position') + [posDiff(1:2) 0 0]);
end
end
end
% Testing purpose input matrices:
% tsinput=[0345 0405 1 1 ; 0230 0300 2 0; 0540 0635 3 1; 0745 0800 4 1]
% infoinput={'AJ35 NOT' 'KL21 MAN' 'XPRES'; 'ZW31 MAN' 'KM37 NEW' 'VISTA';
% 'BC38 BIR' 'QU54 LON' 'XPRES'; 'XZ89 LEC' 'DE34 MSF' 'DERP'}

如果我正确理解你(如果我不正确,请发布一些代码(,那么你所需要的就是一个set/get组合。

如果boxHandle是文本框对象的句柄,那么您可以通过以下方式获取其当前位置:

pos = get (boxHandle, 'position')

其中pos是[x,y,width,height]的输出数组。为了设置到一个新的位置,您使用:

set (boxHandle, 'position', newPos)

其中newPos是所需位置的阵列(具有与pos相同的结构(。

编辑

关于更新矩阵,由于您有移动对象的句柄,因此您实际上可以访问特定的文本框。

创建每个文本框时,设置一个名为"UserData"的属性,该属性具有用于该框的tsinput的关联索引。在您的嵌套for循环中添加此

set (box, 'UserData', [idx, z]);

盒子创建后,在moveObject回调中通过获取数据

udata = get(dragging,'UserData');

然后udata包含要更新的元素的索引。

相关内容

  • 没有找到相关文章

最新更新