2011-02-09 5 views
15

W Matlab, chciałbym zaktualizować dane wykreślone w zestawie osi, kiedy użytkownik przybliża się do okna wykresu. Załóżmy na przykład, że chcę wykreślić konkretną funkcję, która jest zdefiniowana analitycznie. Chciałbym zaktualizować okno wykresu o dodatkowe dane, gdy użytkownik przybliży ślady, aby mogli zbadać funkcję z dowolną rozdzielczością.Czy Matlab wykonuje wywołanie zwrotne, gdy wykres jest powiększany/zmniejszany/skalowany?

Czy Matlab udostępnia haki do aktualizacji danych po zmianie widoku? (Lub po prostu kiedy jest przerysowany?)

Odpowiedz

9

Tak, robi. ZOOM tryb obiekt ma następujące wywołania zwrotne:

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

Te dwie ostatnie są wykonywane albo tuż przed lub tuż po funkcję zoom. Możesz ustawić swoją funkcję aktualizacji w ActionPostCallback, gdzie będziesz aktualizował wykres zgodnie z nowymi limitami osi (uchwyt do osi jest przekazywany jako drugi argument wejściowy do wywołania zwrotnego).

+0

Dzięki, właśnie tego szukałem! Czy istnieje również ogólne oddzwanianie? – nibot

+0

@nibot: Masz na myśli coś takiego jak "odśwież" (http://www.mathworks.com/help/techdoc/ref/refresh.html)? Alternatywnie, 'drawnow' opróżnia kolejkę. – Jonas

+1

Mam na myśli, czy jest jakiś sposób, aby Matlab wywoływał funkcję, którą określam za każdym razem, gdy przerysowuje figurę? – nibot

16

Podczas gdy jeszcze nie znalazłem jednego ogólnego wywołania zwrotnego, aby rozwiązać to pytanie, udało mi się spleść grupę czterech wywołań zwrotnych *, które zdają się osiągać ten cel w (prawie?) Wszystkich sytuacjach. Dla danej osi obiektu ax = gca(),

1. Setup zoom callback function jako skierowane by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2. skonfigurować pan callback function:
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3. skonfigurować figure resize callback function:
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. Edycja: ten już nie działa w R2014b, ale jest potrzebny tylko wtedy, gdy dodasz, na przykład, pasek kolorów do figury (która zmienia położenie osi bez zmiany rozmiaru figury lub powiększenia/przesunięcia osi). Nie szukałem zastępstwa. Na koniec ustaw wartość undocumented property listener dla samej właściwości pozycji osi. Jest tu jedna ważna sztuczka: musimy przytrzymać uchwyt obiektu handle.listener, ponieważ po jego usunięciu (lub opuszczeniu zakresu), usuwa wywołanie zwrotne. Właściwość UserData samych obiektów osi jest miłym miejscem do przechowywania w wielu przypadkach.

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

We wszystkich tych przypadkach zdecydowałem się odrzucić argumenty zdarzeń domyślny zwrotnych i zamiast uchwycić oś, w terminie anonimowej funkcji. Stwierdziłem, że jest to o wiele bardziej przydatne niż próba radzenia sobie ze wszystkimi różnymi formami argumentów, które propagują się przez te odmienne scenariusze wywołania zwrotnego.

* Także przy tak wielu różnych źródłach oddzwonienia uważam za nieocenione posiadanie recursion check na początku myCallbackFcn, aby zapewnić, że nie skończę w nieskończonej pętli.

+2

Od wersji R2014b zgodnie z [oficjalnymi dokumentami] (http://de.mathworks.com/help/matlab/graphics_transition/why-does-handle-listener-return-an-error-1.html) 'handle.listener 'nie będzie już działać. – embert

Powiązane problemy