Draw points on UIAxes until you press a button in APP DESIGNER
13 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Alejandro Fernández
el 9 de Jun. de 2020
Comentada: Michael Vinsome
el 25 de Jul. de 2022
Hi, I have a problem, I'm developing an application using the app designer but there comes a moment when I have to be able to select points from an image I show in a UIAxes using the drawcircle function.
What I need is to be able to enter points (without having defined how many in advance) until I press on a status button, but I also need to save the position of the points, what I came up with was this but it doesn't work well
i = 1;
ROI = zeros(8,2);
while app.AplicarInterpolacinButton.Value == 0
a = drawpoint(app.UIAxes);
ROI(i,:) = a.Position;
i = i + 1;
end
Thank you.
5 comentarios
Respuesta aceptada
Adam Danz
el 9 de Jun. de 2020
Editada: Adam Danz
el 9 de Jun. de 2020
Once drawpoint() is called, it waits for a response and the waiting time cannot be interrupted until you either draw a point, press escape, or close the figure. Since the rest of your while-loop is very fast, there is very little time between iterations so there is very little time that your code can detect that the stop-button was pressed. Therefore, it's very highly likely that any randomly timed button press will occur during the drawpoint() execution and the button press will not be detected until either a point is drawn or the user presses escape or the figure is closed. There's no way to programmatically end the drawpoint() wait-time.
If you can figure out an algorithm that detects when enough points were drawn, you could end the while-loop prior to initializing the next drawpoint.
To end loop when escape is pressed or figure is closed
When you end drawpoint by pressing escape, it returns an empty position value. When you end drawpoint by closing the figure, a "handle to deleted point" is returned.
To continually draw points until esc is pressed or the fig is closed, just test of those conditions.
userStopped = false;
pointhandles = gobjects();
while ~userStopped
a = drawpoint();
if ~isvalid(a) || isempty(a.Position)
% End the loop
userStopped = true;
else
% store point object handle
pointhandles(end+1) = a;
end
end
10 comentarios
Ely Raz
el 15 de Oct. de 2021
Editada: Ely Raz
el 15 de Oct. de 2021
I am trying to run the above code in a GUI and mark points over an image. I can not move or delete the points as clicking with both mouse buttons generate more points, can it be fixed? Is it possible to mark the points with text? and Furthermre, after pressing the ESC, how can I get the coordinates?
function StartButtonPushed(app, event)
imshow('peppers.png','Parent',app.ImageAxes);
userStopped = false;
pointhandles = gobjects();
while ~userStopped
a = drawpoint(app.ImageAxes);
if ~isvalid(a) || isempty(a.Position)
% End the loop
userStopped = true;
else
% store point object handle
pointhandles(end+1) = a;
end
end
disp(pointhandles)
end
Michael Vinsome
el 25 de Jul. de 2022
For drag and drop you need: https://uk.mathworks.com/matlabcentral/answers/94681-how-do-i-implement-drag-and-drop-functionality-in-matlab
For everything else:
function draw
idx = 0;
positions = [];
fig = figure(1);
ax = axes;
userStopped = false;
btn = uicontrol('Parent',gcf,'Style','pushbutton','string','Undo!', 'Callback', @undo);
while ~userStopped
a = drawpoint();
idx = idx + 1;
if ~isvalid(a) || isempty(a.Position)
userStopped = true;
else
positions(:,:,idx) = a.Position;
assignin("base", "positions", positions)
end
end
end
function undo(src, event)
ud = findobj('Type','images.roi.Point');
delete(ud);
draw
end
Más respuestas (0)
Ver también
Categorías
Más información sobre Graphics Object Programming en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!