2011-02-09 69 views
15

Trong Matlab, tôi muốn cập nhật dữ liệu được vẽ trong một tập hợp các trục khi người dùng phóng to vào cửa sổ lô. Ví dụ, giả sử tôi muốn vẽ một hàm cụ thể được định nghĩa một cách phân tích. Tôi muốn cập nhật cửa sổ lô với dữ liệu bổ sung khi người dùng phóng to các dấu vết để họ có thể kiểm tra chức năng với độ phân giải tùy ý.Matlab có thực hiện gọi lại khi một ô được phóng to/thu nhỏ/vẽ lại không?

Matlab có cung cấp móc để cập nhật dữ liệu khi chế độ xem thay đổi không? (Hoặc đơn giản là khi nó được vẽ lại?)

Trả lời

9

Có, nó có. Đối tượng chế độ ZOOM có các số gọi lại sau đây:

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

Hai thứ hai được thực hiện ngay trước hoặc ngay sau chức năng thu phóng. Bạn có thể thiết lập chức năng cập nhật của bạn trong ActionPostCallback, nơi bạn muốn cập nhật cốt truyện theo giới hạn trục mới (tay cầm cho trục được chuyển làm đối số đầu vào thứ hai cho cuộc gọi lại).

+0

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm! Có cũng gọi lại redraw chung? – nibot

+0

@nibot: Ý của bạn là, như ['refresh'] (http://www.mathworks.com/help/techdoc/ref/refresh.html)? Ngoài ra, 'drawnow' xóa hàng đợi. – Jonas

+1

Tôi có nghĩa là, có một số cách để làm cho Matlab gọi một chức năng mà tôi chỉ định bất cứ khi nào nó vẽ lại hình? – nibot

16

Trong khi tôi chưa tìm thấy một gọi lại chung "redraw" để giải quyết câu hỏi này, tôi đã quản lý để cobble cùng một nhóm bốn callbacks * mà dường như đạt được mục tiêu này trong (gần như?) Tất cả các tình huống. Đối với một trục cho đối tượng ax = gca(),

1. Thiết lập các zoom callback function theo chỉ dẫn by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2. Thiết lập một pan callback function:
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3. Thiết lập một figure resize callback function:
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. Chỉnh sửa: cái này không còn hoạt động trong R2014b, nhưng chỉ cần nếu bạn thêm, ví dụ: thanh màu cho hình (thay đổi vị trí trục mà không thay đổi kích thước hình hoặc thu phóng trục/pan). Tôi đã không tìm kiếm một sự thay thế. Cuối cùng, thiết lập một undocumented property listener cho chính thuộc tính vị trí trục. Có một thủ thuật quan trọng ở đây: Chúng ta phải giữ tay cầm đối tượng handle.listener như một khi nó bị xóa (hoặc rời khỏi phạm vi), nó loại bỏ gọi lại. Các tài sản UserData của các đối tượng trục chính nó là một nơi tốt đẹp để stash nó trong nhiều trường hợp.

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

Trong tất cả các trường hợp này, tôi đã chọn loại bỏ đối số sự kiện gọi lại mặc định và thay vào đó chụp trục được đề cập trong một hàm ẩn danh. Tôi đã tìm thấy điều này hữu ích hơn nhiều so với việc cố gắng đối phó với tất cả các dạng đối số khác nhau truyền bá thông qua các tình huống gọi lại khác nhau này.

* Ngoài ra, với rất nhiều nguồn gọi lại khác nhau bay xung quanh, tôi thấy vô giá khi có recursion check ở đầu số myCallbackFcn để đảm bảo rằng tôi không kết thúc trong vòng lặp vô hạn.

+2

Theo R2014b theo [tài liệu chính thức] (http://de.mathworks.com/help/matlab/graphics_transition/why-does-handle-listener-return-an-error-1.html) 'handle.listener 'sẽ không hoạt động nữa. – embert

Các vấn đề liên quan