2011-02-09 4 views
15

Matlabでは、ユーザーがプロットウィンドウをズームすると、一連の軸にプロットされたデータを更新したいと思います。たとえば、分析的に定義された特定の関数をプロットするとします。ユーザーがトレースを拡大するときにプロットウィンドウを追加データで更新して、任意の解像度で関数を調べることができます。プロットが拡大/縮小/再描画されたときにMatlabはコールバックを実行しますか?

ビューが変更されたときにMatlabはデータを更新するためのフックを備えていますか? (または単にそれが再描画されるとき)?

答えて

9

はい、あります。 ZOOMモードオブジェクトは、次のコールバックがあります

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

後者の二つはいずれかの直前または直後にズーム機能を実行しています。 ActionPostCallbackに更新機能を設定できます。ここでは、新しい軸の制限に従ってプロットを更新します(軸のハンドルは、コールバックの2番目の入力引数として渡されます)。私はこの質問を解決する一つの一般的な「再描画」コールバックを見つけるためにまだ持っているが

+0

ありがとう、これは私が探していたものです!一般的な再描画コールバックもありますか? – nibot

+0

@nibot:あなたは['refresh'](http://www.mathworks.com/help/techdoc/ref/refresh.html)と同じですか?あるいは、 'drawnow'がキューをフラッシュします。 – Jonas

+1

私は、Figureを再描画するたびにMatlabが指定する関数を呼び出すための方法があるのでしょうか? – nibot

16

は、私は一緒にすべての状況(ほとんど?)で、この目標を達成するように見える4つのコールバックのグループ*を考え出すために管理しています。
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2.セットアップpan callback function:所定の軸がax = gca()

1.セットアップzoom callback function向けby @Jonasとしてオブジェクトの
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3.セットアップをfigure resize callback function
getParentFigure(ax)set(,'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. 編集:これはR2014bでは機能しなくなりましたが、Figureにカラーバーなどを追加した場合(Figureのサイズや軸のズーム/パンを変更せずに軸の位置を変更する場合)のみ必要です。私は交換を探すつもりはありません。最後に、軸位置プロパティ自体にundocumented property listenerを設定します。ここでは重要なトリックが1つあります。オブジェクトが削除されると(またはスコープを残して)、コールバックが削除されるため、handle.listenerオブジェクトのハンドルを保持する必要があります。 Axesオブジェクト自体のプロパティーは、多くの場合それを隠すのに最適な場所です。UserData私はデフォルトのコールバックのイベント引数を破棄し、代わりに匿名関数内で問題になっている軸をキャプチャするために選択したすべてのこれらのケースでは

hax = handle(ax); 
hprop = findprop(hax,'Position'); 
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax)); 
set(ax,'UserData',h); 

。これらの異なるコールバックシナリオを介して伝播するさまざまな形式の引数すべてに対処しようとするよりもはるかに便利であることがわかりました。

*また、非常に多くのコールバックソースが飛び回っているので、私は無限ループに終わらないようにmyCallbackFcnの冒頭にrecursion checkを置くことは非常に貴重です。

+2

[公式ドキュメント](http://de.mathworks.com/help/matlab/graphics_transition/why-does-handle-listener-return-an-error-1.html)に従うR2014b現在、 'handle.listener 'はもう働きません。 – embert

関連する問題