ボタンのクリック時に、ブラシをかけたデータを変数に保存しようとしています。他の質問を読みましたが、それを行う方法が見つかりません。
スクリプト内では、次のコードが機能します。
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
閉じる前にボタンを複数回押すと、最後のボタン押しだけでなく、ボタンを押した回数だけポイントが保存されていると予想されます。