[Yt-svn] yt: Adding a callback for changing of the viewport, not just cha...

hg at spacepope.org hg at spacepope.org
Wed Mar 24 17:25:42 PDT 2010


hg Repository: yt
details:   yt/rev/c467a9ccc6ac
changeset: 1478:c467a9ccc6ac
user:      Matthew Turk <matthewturk at gmail.com>
date:
Wed Mar 24 17:25:36 2010 -0700
description:
Adding a callback for changing of the viewport, not just changing the buffer.
This allows us to have a pan and scan widget on a controller node that sends
viewport information to backend renderers.  It works using the Chaco widget,
even.  More information will be forthcoming, but launching an ipcontroller, 4
ipengine processes and running:

http://paste.enzotools.org/show/387/

will get you started!

diffstat:

 yt/extensions/image_panner/vm_panner.py |  34 ++++++++++++++++++++++------------
 1 files changed, 22 insertions(+), 12 deletions(-)

diffs (90 lines):

diff -r 3b3d5cfe2ce8 -r c467a9ccc6ac yt/extensions/image_panner/vm_panner.py
--- a/yt/extensions/image_panner/vm_panner.py	Wed Mar 24 16:37:34 2010 -0700
+++ b/yt/extensions/image_panner/vm_panner.py	Wed Mar 24 17:25:36 2010 -0700
@@ -27,27 +27,28 @@
 from yt.lagos import data_object_registry, AMRProjBase, AMRSliceBase, \
                      x_dict, y_dict
 
-class SourceTypeException(Exception):
-    def __init__(self, source):
-        self.source = source
-
-    def __repr__(self):
-        return "Wrong type: %s, %s" % (self.source, type(self.source))
-
 class VariableMeshPanner(object):
     _buffer = None
 
-    def __init__(self, source, size, field, callback = None):
+    def __init__(self, source, size, field, callback = None,
+                 viewport_callback = None):
         if not isinstance(source, (AMRProjBase, AMRSliceBase)):
-            print "PROBLEM WITH SOURCE", source, type(source)
+            raise RuntimeError
         if callback is None:
             callback = lambda a: None
         self.callback = callback
+        if viewport_callback is None:
+            viewport_callback = lambda a, b: None
+        self.viewport_callback = viewport_callback
         self.size = size
         self.source = source
         self.field = field
         self.xlim, self.ylim = self.bounds
 
+    def _run_callbacks(self):
+        self.callback(self.buffer)
+        self.viewport_callback(self.xlim, self.ylim)
+
     @property
     def bounds(self):
         DLE, DRE = self.pf["DomainLeftEdge"], self.pf["DomainRightEdge"]
@@ -70,12 +71,12 @@
         nWx, nWy = Wx/factor, Wy/factor
         self.xlim = (centerx - nWx*0.5, centerx + nWx*0.5)
         self.ylim = (centery - nWy*0.5, centery + nWy*0.5)
-        self.callback(self.buffer)
+        self._run_callbacks(self.buffer)
 
     def pan(self, deltas):
         self.xlim = (self.xlim[0] + deltas[0], self.xlim[1] + deltas[0])
         self.ylim = (self.ylim[0] + deltas[1], self.ylim[1] + deltas[1])
-        self.callback(self.buffer)
+        self._run_callbacks()
 
     def pan_x(self, delta):
         self.pan( (delta, 0.0) )
@@ -120,8 +121,14 @@
         print "Returning buffer with extrema",
         print mi, ma
         b = (b - mi)/(ma - mi)
+        self._run_callbacks()
         return b
 
+    def set_limits(self, xlim, ylim):
+        self.xlim = xlim
+        self.ylim = ylim
+        self._run_callbacks()
+
 data_object_registry["image_panner"] = VariableMeshPanner
 
 class WindowedVariableMeshPanner(VariableMeshPanner):
@@ -169,6 +176,9 @@
     def pan_rel_y(self, delta):
         for w in self.windows: w.pan_rel_y(delta)
 
+    def set_limits(self, xlim, ylim):
+        for w in self.windows: w.set_limits(xlim, ylim)
+
 class RemoteWindowedVariableMeshController(MultipleWindowVariableMeshPanner):
     def __init__(self, source, mec = None):
         if mec is None:
@@ -207,7 +217,7 @@
 data_object_registry["remote_image_panner"] = RemoteWindowedVariableMeshController
 
 _wrapped_methods = ["zoom", "pan", "pan_x", "pan_y", "pan_rel",
-                     "pan_rel_x", "pan_rel_y", "set_low_high"]
+                     "pan_rel_x", "pan_rel_y", "set_limits"]
 
 class WindowedVariableMeshPannerProxy(object):
     class __metaclass__(type):



More information about the yt-svn mailing list