Accessing ROI objects in GUIDE

I'm allowing the user to create a series of line ROIs like so, using a GUIDE app pushbutton:
function pushbuttonline_Callback(hObject, eventdata, handles)
% hObject handle to linebtn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
h = drawline(handles.axes1);
But how can I access these later on in the code?
I was thinking of placing the drawline variables in a global array, but is there a better way of doing this?
Also, if the user deleted a line using the GUI, would the line variable also be removed?
Thanks in advance.

 Respuesta aceptada

Adam Danz
Adam Danz el 22 de Nov. de 2019
Editada: Adam Danz el 22 de Nov. de 2019
This demo works outside of your GUI callback but it will be easy to implement it into your GUI. See inline comments for details.
% Create axes (your gui will already have axes)
handles.axes1 = axes();
% Draw 3 lines (your gui will only have 1 of these lines
% but it's important to add the 'Tag' to your line.
% The tag name should be something unique - I chose 'userLine'.
h = drawline(handles.axes1,'Tag','userLine');
h = drawline(handles.axes1,'Tag','userLine');
h = drawline(handles.axes1,'Tag','userLine');
% Later on from any other callback function that has
% access to 'handles', you can find all objects in
% your axes that has that tag. If 'lineHandles' is
% empty, no objects were found with that tag. Otherwise
% 'lineHandles' will contain all of the handles to your
% ROI lines.
lineHandles = findobj(handles.axes1,'Tag','userLine')

6 comentarios

John D
John D el 23 de Nov. de 2019
Editada: John D el 23 de Nov. de 2019
If I wanted to access the axes through a function that wasn't a callback (i.e. didn't have the 'handles' parameter), how would I go about doing that? For example, the allevents function:
function linebtn_Callback(hObject, eventdata, handles)
% hObject handle to linebtn (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
h = drawline(handles.axes1,'Tag','userLine');
addlistener(h,'ROIMoved',@allevents);
function allevents(src,evt)
evname = evt.EventName;
switch(evname)
case{'ROIMoved'}
% here ------------
end
Thanks.
Adam Danz
Adam Danz el 23 de Nov. de 2019
The only handle you really need is the axis handle handles.axes1
I don't know what is calling the allevents function so I can't guess what the src handle is.
A common way to find an axes is to use findobj(). For example, let's say you press a button that triggers allevents(). The parent of the button is the main GUI figure and your axes is also a child of the main GUI figure. If the button handle is 'h' you could find the axes using
ax = findobj(h.Parent,'type','axes')
assuming the GUI only has 1 axes (otherwise all axes handles would be returned).
John D
John D el 23 de Nov. de 2019
Ok, I see. I suppose, to combat the error of having multiple axes, you could do this?
ax = findobj(h.Parent,'Tag','axes1')
Adam Danz
Adam Danz el 23 de Nov. de 2019
Yes, as long as you've assigned "axes1" to the tag property of that axes!
Adam Danz
Adam Danz el 23 de Nov. de 2019
Editada: Adam Danz el 23 de Nov. de 2019
Better yet,
ax = findobj(h.Parent,'Type','axes','Tag','axes1')
When using findobj() or findall() you want to be as specific as possible.
John D
John D el 23 de Nov. de 2019
Thanks!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Creating, Deleting, and Querying Graphics Objects en Centro de ayuda y File Exchange.

Productos

Versión

R2019a

Etiquetas

Preguntada:

el 22 de Nov. de 2019

Comentada:

el 23 de Nov. de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by