Data Cursor Position in GUI

9 次查看(过去 30 天)
Edward
Edward 2011-5-22
编辑: Mo Ba 2017-5-8
I am building a GUI in GUIDE.
The user selects an Image file, which is then displayed in a separate figure/window.
The datacursormode is activated for the figure, and the datatip text is customized.
I want to retrieve the data-cursor's position through the myupdatefcn. I am able to display the position info each time the user clicks somewhere on the image, but I can neither set or setappdata the position for use in another function.
...
imshow(I);
dcm_obj = datacursormode(f);
datacursormode on;
set(dcm_obj,'UpdateFcn', @myupdatefcn )
end
function txt = myupdatefcn(~, event_obj)
pos = event_obj.Position;
disp(['You clicked X:',num2str(pos(1)),', Y:',num2str(pos(2))]);
txt = {'Point to Compute'};
end
How can I retrieve the data cursors' position for use in a separate function in my m file?
p.s. I've tried getCursorInfo(dcm_obj). I haven't been able to get it to work though, even by using a pause or waitforbuttonpress command.
p.p.s. I've read through http://www.mathworks.com/help/techdoc/ref/datacursormode.html. It hasn't helped me much.
Thanks in advance for any help.

采纳的回答

Matt Fig
Matt Fig 2011-5-22
Add this line to your myupdatefcn:
set(0,'userdata',pos);
Then from any workspace you can do:
pos = get(0,'userdata');
  2 个评论
Edward
Edward 2011-5-23
Thank you for the response, this worked for me.
Just a small question, it seems that the user data is not cleared between runs. Unless I restart Matlab, the information is kept.
The solution that I have to this is to set this user data to an empty vector in the OpeningFcn. This works, just wondering if there is a better way, since this seems a bit hackish.
Thanks again.
Matt Fig
Matt Fig 2011-5-23
The userdata is there for you to use, so I don't consider it hackish at all to do so. However, you could also store the pos in the userdata of any object which has this property. So for instance you could set the userdata of the axes object which has the datacursor.
set(gca,'userdata',pos)
Then to find the particular axes of interest (if there are more than one up at a time), each should have a unique tag. Then the data is retrieved from any workspace with something like:
pos = get(findobj('tag','myaxestag'),'userdata');
If the axes is in a GUIDE GUI, use FINDALL instead when looking from outside a callback workspace. And if there is only one, non-GUIDE axes, gca should work...
I first suggested using the root object's userdata because it is automatically accessible from anywhere without worrying about handle visibility, differentiating between multiple objects of the same type, etc.
Also, see SETAPPDATA and cousins...

请先登录,再进行评论。

更多回答(1 个)

Travis
Travis 2011-7-11
I am doing a very similar thing, although I am having trouble getting mine to work. I am making a GUI using GUIDE. I need to gather the position info from an axes plot on the GUI, for any number of clicks. In other words I need "pos" to become available in the workspace at any click in the "MomentCurv" axes. Any help is much appreciated!
Here is the opening function:
function Analysis_OpeningFcn(hObject, eventdata, handles, varargin)
X = ...
Y = ...
axes(handles.MomentCurv);
datacursormode on;
plot(X,Y);
dcm_obj = datacursormode(gcf);
set(dcm_obj,'UpdateFcn',@myupdatefcn);
pos = get(0,'userdata');
guidata(hObject, handles);
end
Here is the myupdatefunction:
function txt = myupdatefcn(empt,event_obj)
pos = event_obj.Position;
txt = {['Phi: ',num2str(pos(1))],['Moment: ',num2str(pos(2))]};
set(0,'userdata',pos);
end
  1 个评论
Mo Ba
Mo Ba 2017-5-8
编辑:Mo Ba 2017-5-8
Try what @Loginatorist said above. It works with no problem:
Add this line to your myupdatefcn:
set(0,'userdata',pos);
Then from any workspace you can do:
pos = get(0,'userdata');

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Data Type Identification 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by