Сохраните очищенные данные в переменную при нажатии кнопки

Я пытаюсь сохранить очищенные данные в переменную по нажатию кнопки. Я читал другие вопросы, но не могу найти способ сделать это.

Внутри скрипта работает следующий код:

t=0:0.2:25;
x=sin(t);
n=plot(t,x,'s');
brush on
pause
brushedData = find(get(n,'BrushData'));

Однако, вызывая функцию selectBrush не работает:

function selectBrush()
% Create data
t=0:0.2:25;
x=sin(t);

% Create figure with points
fig=figure();
n=plot(t,x,'s');
brush on;
addBP = uicontrol(1,'Style', 'pushbutton',...
        'String', 'Get selected points index',...
        'Position',[5, 5, 200, 30],...
        'Units','pixel',...
        'Callback',@()assignin('caller','selectedPoints',get(n,'BrushData')));

% ---> Now the user should select the points and click the button 'Get
% selected points index'
waitfor(fig)

% Display index of selected points once the figure is closed
disp(selectedPoints);
end

Я получаю сообщение об ошибке

Error using selectBrush>@()assignin('caller','selectedPoints',get(n,'BrushData'))
Too many input arguments.

Я пробовал другие вещи, такие как использование eval('selectedPoints=,get(n,''BrushData'')') в качестве функции обратного вызова, используя дескрипторы или определяя отдельно новую функцию обратного вызова, все безуспешно.

Как я должен это делать?

РЕДАКТИРОВАТЬ 1

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

С помощью следующего кода,

function testcode()
% Create data
t = 0:0.2:25;
x = sin(t);

% Create figure with points
myfig = figure();
n = plot(t, x, 's');
brush on;
pointslist=[];
uicontrol('Parent', myfig, ...
          'Style', 'pushbutton',...
          'String', 'Get selected points index',...
          'Position', [5, 5, 200, 30],...
          'Units', 'pixels',...
          'Callback', {@mycallback, n, pointslist} ...
           );

% ---> Now the user should select the points and click the button 'Get
% selected points index'
waitfor(myfig)

% Display index of selected points once the figure is closed
disp(pointslist);
end

function mycallback(~, ~, mylineseries, pointslist)
% Ignore the first 2 function inputs: handle of invoking object & event
% data

assignin('caller', 'pointslist', [pointslist find(get(mylineseries,'BrushData'))])
end

если я нажму кнопку более одного раза перед закрытием, я буду ожидать сохранения точек столько раз, сколько я нажал кнопку, а не только последнего нажатия кнопки.

1 ответ

Решение

Из документации, обратные вызовы MATLAB всегда отправляют 2 переменные по умолчанию:

  • Дескриптор объекта, чей обратный вызов выполняется. Используйте этот дескриптор в вашей функции обратного вызова для ссылки на объект обратного вызова.

  • Структура данных события, которая может быть пустой для некоторых обратных вызовов или содержать конкретную информацию, которая описана в описании свойства для этого объекта.

Так что здесь происходит, что assignin вызову передается на 2 переменные больше, чем он может обработать, поэтому он выдает ошибку (я бы рекомендовал включать сообщения об ошибках в ваши вопросы).

Для немедленного исправления вы можете использовать обозначение массива ячеек, упомянутое в документации, чтобы создать локальную функцию обратного вызова:

function testcode()
% Create data
t = 0:0.2:25;
x = sin(t);

% Create figure with points
myfig = figure();
n = plot(t, x, 's');
brush on;
uicontrol('Parent', myfig, ...
          'Style', 'pushbutton',...
          'String', 'Get selected points index',...
          'Position', [5, 5, 200, 30],...
          'Units', 'pixels',...
          'Callback', {@mycallback, n} ...
           );

% ---> Now the user should select the points and click the button 'Get
% selected points index'
waitfor(myfig)

% Display index of selected points once the figure is closed
disp(selectedPoints);
end

function mycallback(~, ~, mylineseries)
% Ignore the first 2 function inputs: handle of invoking object & event
% data

assignin('caller', 'selectedPoints', get(mylineseries,'BrushData'))
end

Который должен функционировать как хотелось бы. Также обратите внимание на соответствующие assignin синтаксис, это неправильно в вашем примере.

Другие вопросы по тегам