Data Cursor Position in GUI
9 views (last 30 days)
Show older comments
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.
0 Comments
Accepted Answer
Matt Fig
on 22 May 2011
Add this line to your myupdatefcn:
set(0,'userdata',pos);
Then from any workspace you can do:
pos = get(0,'userdata');
2 Comments
Matt Fig
on 23 May 2011
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...
More Answers (1)
Travis
on 11 Jul 2011
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
See Also
Categories
Find more on Data Type Identification in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!