0

でGUIを構築していMATLABます。この GUI にはいくつかの異なるaxesオブジェクトがあります。軸の 1 つでzoomツールを使用します (Figure のツールバーでアクティブ化)。別の軸オブジェクトで、ズームを無効にしました:

setAllowAxesZoom(zoom_handle,axes_handle,false)

...そして、いくつかのクリック可能なオブジェクトをプロットしました:

text(x,y,string,'buttondownfcn',{@func_handle, value});

これはすべてうまく機能します...マウスがズーム不可能なプロットにある場合、通常の矢印カーソルが表示され、クリックまたはクリックアンドドラッグしてもズームは発生しません。

でも!解決したい不便な問題があります。ズーム ツールをアクティブにbuttondownfcnすると、テキスト オブジェクトをクリックしてもコールバックがトリガーされないことがわかりました。今のところ、ツールバーに戻ってズーム モードを切り替える必要があります。マウスを異なる軸間で移動し、適切な動作をプログラムでアクティブにするだけです。

これを回避する最善の方法は何ですか? マウスが軸の 1 つに入ったときに使用できるコールバックはありますか? その場合、そのコールバックでズーム ツールをオンにし、対応する「イベントを終了」コールバックで再びオフにすることができます。または、ズーム不可能なプロットでマウスクリックイベントを伝播して、トリガーする適切なコールバックを見つける方法はありますか? または、私が考慮していない他の可能性はありますか?


編集:これを機能させました。私は解決策を投稿しましたが、他のシナリオでよりうまく機能し、より堅牢であるなど、他の解決策にも興味があります.

4

3 に答える 3

0

私の状況に適したものを一緒にハックしました。より一般的で堅牢なものにしたい場合は、同様に開始できaxesますが、たとえば、クリックされたオブジェクトがどの子であったか、実際にコールバックがインストールされているかどうか、追加の引数があるかどうかなどについて、さまざまなテストを行うことができます。 .

とにかく、私の特定のケースでは、クリックしたいオブジェクトはtextオブジェクトであり、すべてのテキストオブジェクトには、追加のパラメーターを1つだけ取るコールバックがインストールされています。

以下は、ズーム ツールが有効なときにこれらのテキスト オブジェクトを操作できるコードです。

function result = zoomtest(handle,eventdata)
    result=false;
    if strcmp(get(handle,'type'),'text')
        callback=get(handle,'buttondownfcn');
        callback{1}(handle,eventdata,callback{2})
    end
end

set(zoom_handle,'buttondownfilter',@zoomtest)

良いことに、これはズーム ツールの通常の動作に干渉せず、ズーム ツールがアクティブでない場合の動作も変更しません。

于 2013-11-13T16:32:13.110 に答える
-2

関連する質問への解決策を投稿しました。これにより、回転ツールを一緒に機能させることができますbuttondownfcn...ズームツールは同じ哲学です:

回転 3D と buttondownfcn の非互換性に対する質問/回答

アップデート

わかりました、私はこの特定のケースに対する答えを拡張して適切にします:

ズーム モードでインタラクティブ性を維持する良い方法は、 Matlab のヘルプButtonDownFilterで説明されている方法を使用することです。

function demo
% Allow a line to have its own 'ButtonDownFcn' callback.
hLine = plot(rand(1,10));
hLine.ButtonDownFcn = 'disp(''This executes'')';
hLine.Tag = 'DoNotIgnore';
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
% mouse click on the line
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end

あなたの場合、コードは次のようになります。

function demo2
%
% Allow a text element to have its own 'ButtonDownFcn' callback.
% And taging it for interaction
text(x,y,string,'buttondownfcn',{@func_handle, value}, 'tag', 'DoNotIgnore');
%
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
%
% mouse click on the text element
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end
于 2016-05-25T11:01:13.810 に答える