Как добавить точки данных в анимированную строку в Matlab GUI через прослушиватель событий?

Я делаю приложение с графическим интерфейсом в Matlab, используя руководство. У меня есть оси, на которых я строю некоторые точки нажатием кнопки. Теперь я хочу использовать анимированные линии для построения линий на одинаковых осях. Точки данных, добавляемые в анимированную строку, поступают из события. Поэтому мне нужно добавить точки данных в прослушивателе событий. Я хочу знать, как я могу это сделать, потому что у слушателя событий нет доступа к анимированной строке. Ниже приведен код.

Эта функция вызывается при нажатии кнопки

function startButton_Callback(~, ~, handles)
    x = randi(100, 20);
    y = randi(100, 20);
    plot(x, y, 'o');
    la = newClass;
    addlistener(la,'statusAnnouncement',@StatusListener);

Это функция, вызываемая по событию

function StatusListener(obj, eventData)
    h = animatedline;
    addpoints(h,eventData.coordinate(1),eventData.coordinate(2));
    drawnow

Точки, построенные с использованием графика, отображаются только. Как показать анимированную линию? Кроме того, я не получаю никакой ошибки в командном окне.

1 ответ

Решение

Есть несколько способов, которыми вы можете дать слушателю доступ к animtedline объект.

  1. Вы можете определить StatusListener как подфункция startButton_Callback

    function startButton_Callback(~, ~, handles)
    
        h = animatedline;
    
        la = newClass;
        addlistener(la,'statusAnnouncement',@StatusListener);
    
        %// This as a subfunction so it can "see" h
        function StatusListener(src, evnt)
            h.addpoints(evnt.coordinate(1), evnt.coordinate(2));
        end
    end
    
  2. Пройти animtedline объект для функции обратного вызова через анонимную функцию

    function startButton_Callback(~, ~, handles)
        h = animatedline;
    
        la = newClass;
    
        %// Use the callback but add h as an additional input argument
        addlistener(la, 'statusAnnouncement', @(s,e)StatusListener(s,e,h))
    end
    
    %// Note the additional input argument here
    function StatusListener(obj, evnt, h)
        h.addpoints(evnt.coordinate(1), evnt.coordinate(2))
    end
    
  3. Обновите animatedline внутри анонимной функции

    function startButton_Callback(~, ~, handles)
        h = animatedline;
    
        la = newClass;
    
        %// Don't define a separate function and just do the update here
        addlistener(la, 'statusAnnouncement', @(s,e)h.addpoints(e.coordinate(1), e.coordinate(2)))
    end
    
  4. Хранить animatedline объект в guidata из appdata вашей фигуры.

    function startButton_Callback(~, ~, handles)
    
        h = animatedline;
    
        %// Store the handle within the appdata of the figure
        setappdata(gcbf, 'MyAnimatedLine', h)
    
        la = newClass;
        addlistener(la,'statusAnnouncement',@StatusListener);
    end
    
    function StatusListener(obj, evnt)
        %// Get the handle from the appdata of the figure
        h = getappdata(gcbf, 'MyAnimatedLine');
        h.addpoints(evnt.coordinate(1), evnt.coordinate(2))
    end
    
Другие вопросы по тегам