Несколько точек GUI с дополнителями - PullRequest
1 голос
/ 24 октября 2019

У меня есть графический интерфейс, где пользователь нажимает кнопку, чтобы создать точку. Эта точка используется для измерений (т. Е. Для расчета расстояния между ней и другой статической точкой).

    function pushbutton1_Callback(hObject, eventdata, handles)

    a = handles.calciter; % This iterates for each time pushbutton is pressed.

    mypoint = drawpoint(handles.axes1);

    handles.el = addlistener(mypoint, 'ROIMoved', @mypointmoved_Callback);

Так что если my pushbutton1 создает другую точку;как это сделать, чтобы было несколько addlistener для каждой из точек?

Нужно ли иметь несколько handles.el?

Мой предыдущий вопрос содержитнемного больше информации, если интересно.

1 Ответ

1 голос
/ 25 октября 2019

Продолжение моего предыдущего ответа ...

  • Добавить слушателя к каждой новой точке.
  • Вам не нужно иметь несколько handles.el, вы можетепросто игнорируйте el, потому что вы все равно его не используете.
  • Вы можете сохранить массив дескрипторов созданных точек (если вам это нужно).
  • Вы можете сохранить индекс точкив mypoint.UserData (если вам это нужно).
  • В обратном вызове слушателя вы можете получить любую точку из массива, а также проверить индекс точек, вызвавших событие.

Вот соответствующие части кода (пожалуйста, прочитайте комментарии):

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
axes(handles.axes1);

mypoint = drawpoint;

%Add event listenr to every point
%if ~isfield(handles, 'el')
addlistener(mypoint, 'ROIMoved', @mypointmoved_Callback);
%end

%Save an array of handles to created points:
if ~isfield(handles, 'mypoints')
    mypoint.Color = [0.7410, 0.2, 0]; %First point has a different color.
    handles.mypoints = mypoint; %Add first point.

    %Distance from the first added point.
    handles.distx = 0;
    handles.disty = 0;
    set(handles.edit1, 'String', '0'); %Display the distance from the first added point.
else    
    handles.mypoints(end+1) = mypoint; %Add a new point to the end of the array
end

points_counter = length(handles.mypoints); %Number of points - use as "Point serial number".
mypoint.UserData = points_counter; %Store the index of the point in UserData property

% Update handles structure
guidata(hObject, handles);


function mypointmoved_Callback(src, eventData)
handles = guidata(src.Parent); %Get the handles using the parent of the point (the axes).

if src.UserData == 1
    %Example for using the index of the point stored in UserData property.
    set(handles.edit1, 'String', '0');
    return;
end

px = src.Position(1);
py = src.Position(2);

%Get the first point that added by the user 
p0 = handles.mypoints(1);

%Get the x,y position of the first point that added by the user
p0x = p0.Position(1);
p0y = p0.Position(2);

%Compute the distance from p0:
distx = abs(px - p0x);
disty = abs(py - p0y);

handles.distx = distx;
handles.disty = disty;

dist = norm([distx, disty]); %Euclidean distance

%Display the euclidean distance from p0.
set(handles.edit1, 'String', num2str(dist));
drawnow

В этом примере показано евклидово расстояние от точки, которая была перемещена пользователем до первой добавленной точки (пользователем). ).

...