MATLAB Answers

drawrectangle not working consistently, help!

23 views (last 30 days)
I am using drawrectangle in an app so the user can interactively draw region of interest. It is not working consistently. Sometimes it works fine, but sometimes it draws the region with a offset in -x direction. I cannot figure out why it works sometimes and somstimes it doesn't. Here is a snippet of my code I am using to get the roi.
function [roi] = selectDataPoints(app,tab)
delete(findall(app.([tab 'UIAxes']), 'Type', 'images.roi.Rectangle'))
originalTitle = get(app.([tab 'UIAxes']).Title, {'String', 'Color'});
set(app.([tab 'UIAxes']).Title, 'String', 'Draw rectangle around region to clip.', 'Color', 'r')
pan(app.([tab 'UIAxes']), 'off') %turn off panning so the interaction doesn't drag the data.
zoom(app.([tab 'UIAxes']),'off')
roi = drawrectangle(app.([tab 'UIAxes']),'StripeColor','r','InteractionsAllowed','none');
% Return original title
set(app.([tab 'UIAxes']).Title, 'String', originalTitle{1}, 'Color', originalTitle{2})
end
  10 Comments
Adam Danz
Adam Danz on 3 Dec 2020
Questions addressed in my answer below.

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 3 Dec 2020
Edited: Adam Danz on 3 Dec 2020
In AppDesigner / uifigure & uiaxes, drawrectangle is horribly slow and does not show the rectangle borders immediately. It's so slow that I would never use it in AppDesigner or a uifigure. I think this giagantic lag is the cause of the problem. As evidence of that, if you hold the initial button-down in place, slowly drag, and then hold the mouse button in the final destination until the rectangle appears, and then let go of the mouse button, the problem goes away but it's replaced by an unreasonable amount of waiting and wondering and frustration.
The problem of slow responses with uifigures / uiaxes / AppDesigner is common
Alternative 1) Provide the user with instructions to not let go of the mouse until the rectangle appears.
Alternative 2) Set the axes' ButtonDownFunction along with the CurrentPoint to detect coordinates of button-down and button-up and then can plot the rectangle manually using rectangle() or plot() etc.
Demo of Alernative 2:
% Set up figure
uif = uifigure();
uiax = uiaxes(uif);
uiax.UserData.rectangle = [];
grid(uiax,'on')
hold(uiax,'on')
uiax.XLimMode = 'Manual';
uiax.YLimMode = 'Manual';
uiax.ButtonDownFcn = @drawRect;
function drawRect(ax, event)
% User must click twice to mark any two diagonal corners of a rectangle.
if size(ax.UserData.rectangle,1)~=1
% Store the first coordinate
ax.UserData.rectangle = [];
ax.UserData.rectangle(1,:) = event.IntersectionPoint;
else
% Store second coordinate and draw rectangle.
ax.UserData.rectangle(2,:) = event.IntersectionPoint;
WidthHeight = abs(diff(ax.UserData.rectangle(:,1:2)));
rectangle('Parent',ax,'Position',...
[min(ax.UserData.rectangle(:,1)), min(ax.UserData.rectangle(:,2)), WidthHeight], ...
'EdgeColor','r','LineWidth',2)
end
end
Alternative 3) Use an external figure that wasn't created by uifigure/uiaxes
Demo of Alternative 3:
Use copyobj to copy the axes to a new figure. The new figure will be a regular figure but the copied axes will still be uiaxes but I don't think that will be a problem. Then draw the rectangle and copy it back to the app's axes.
fig = figure();
appAxes = app.([tab 'UIAxes']);
ax = copyobj(appAxes, fig);
roi = drawrectangle(ax,'StripeColor','r','InteractionsAllowed','none');
appRoi = copyobj(roi, appAxes)
delete(fig)
If you're using an older release of matlab that does not support uiaxes with copyobj, you can use copyUIAxes() from the file exchange.
  4 Comments
Adam Danz
Adam Danz on 3 Dec 2020
An example of Alt#2 is added to my answer.
Make sure you're storing the handle to the copied object (appRoi in my demo) rather than the handle that's deleted with the figure (roi in my demo).

Sign in to comment.

More Answers (1)

Christian Wrobel
Christian Wrobel on 5 Feb 2021
I had the same Problem, when I was using the AppDesigner (Matlab 2019a). I used a GridLayout to organize the axes and some surrounding UI-Objects within a tab. I've found out, that the padding of the GridLayout of the Tab was causing the Offset (Parent of axes). I changed the padding to [0,0,0,0] and the offset was gone. When I increased the padding of GridLayout the offset got even worse. Hope, this may help you.
Best Christian

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by