Сохраните очищенные данные в переменную при нажатии кнопки
Я пытаюсь сохранить очищенные данные в переменную по нажатию кнопки. Я читал другие вопросы, но не могу найти способ сделать это.
Внутри скрипта работает следующий код:
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
синтаксис, это неправильно в вашем примере.