2017-03-29 12 views
0

私は、ユーザにを入力したいMatlab UIを持っています。ラジオボタンが選択されるとすぐにimrectを使用していくつかの領域を入力します。
選択範囲を無限ループにする必要があるため、いくつの領域が選択されるかは不明です。
ラジオボタンが選択されるとすぐに、imrect入力はを停止する必要がありますが、これは動作しません。Matlabは無限ループに直面する

function mwe 
ax = axes('Position', [0 0 1 1]); 
bg = uibuttongroup('Position',[0 0 .15 1], 'SelectionChangedFcn',{@bselection, ax}); 
r1 = uicontrol(bg, 'Style','radiobutton', 'String','Option 1', 'Position',[10 250 100 30]); 
r2 = uicontrol(bg, 'Style','radiobutton', 'String','Option 2', 'Position',[10 225 100 30], 'Value',1); 

function bselection(source, event, ax) 
    switch event.NewValue.String 
    case 'Option 1' 
     while true 
     h = imrect(ax); 
     % do stuff 
     delete(h); 
     end 
    case 'Option 2' 
     % do not show imrect and do other stuff 
    end 

私は任意の助けに感謝:

は、ここでは、最小限の作業例です。

答えて

0

ボタンにInterruptible propertyを設定できます。 BusyActioncancelに設定することもできます。ヘルプは言う:

中断は、そのような関数drawnow、uifigure、getframeの、WAITFOR、 または一時停止の指示があるときのように、MATLABは キューを処理し、次のポイントで発生します。

「ポーズ」を含めると、次の矩形が選択されるまで停止しないことがあります。これは、いったんimrectを呼び出すと、停止する必要があることを知らないかもしれないからです。

しかし、imrectがMATLAB UIがコールバックをトリガするのをブロックする場合、この方法は機能しません。

エンドレスループを使用するのは、ではなく、です。終了するときにいつ終了するかを教えてください -

running = true; 
while running 
    h=imrect(ax) 
    % do stuff 
    delete(h) 
    if (SOMETHING) 
     running = false 
    end 
end 

何がありますか?ボタンが選択解除されているかどうかを確認する必要があります。

あなたはr1が選択されていない、そうであれば、ランニングが偽になり、ループはサイクリングラウンドを停止したかどうかを確認します

if r1.Value!=1 
    running = false 
end 

を使用することができます。

+0

ありがとうございました!あなたのソリューションは非常にうまく動作します。私は、 'true 'を' while strcmp(source.SelectedObject.String、' Option 1 ') 'に置き換えることで、ラジオボタンの選択を確認する簡単な方法を見つけました。しかし、唯一の問題は、ラジオボタンの選択を変更した後も、前回と同じように 'imrect'が実行されることです。これを解決するために、オプション2が選択されたときにエスケープボタンの押下をシミュレートすることで回避策を使用します。したがって、 'case 'オプション2''私は 'robot = java.awt.Robot 'を追加しました。 robot.keyPress(java.awt.event.KeyEvent.VK_ESCAPE); robot.keyRelease(java.awt.event.KeyEvent.VK_ESCAPE); '。 – Jojo