Pan/zoom interferes with user-specified right button callback.

Hi,

I have written a simple image viewing tool with window/level controls linked to the right mouse, which generally works okay.

But when I use the pan/zoom button, clicking and dragging the right mouse button changes the zoom as intended, but also affects the window/level too which is undesirable.

How to change the callback so that the pan/zoom mode doesn't affect window/level?

The code is attached.

If there are better image viewing tools using matplotlib, I can upgrade, but I couldn't find them on a quick search. The goal is to add some plotting capability ( plot row, col on user-specified coordinates) and some ROI drawing capability. ( See my other post for those questions. )

Matplotlib: 0.87.7, python: 2.5 ubuntu 7.04

Thanks,
Venkat.

imgutils.py (2.11 KB)

If anyone faces a similar issue, there is a solution here.

http://scipy.org/Cookbook/Matplotlib/Interactive_Plotting

Essentially, we should also check for "toolbar.mode"

Thanks,
Venkat.

Venkat Ramanan wrote:

···

Hi,

I have written a simple image viewing tool with window/level controls linked to the right mouse, which generally works okay.

But when I use the pan/zoom button, clicking and dragging the right mouse button changes the zoom as intended, but also affects the window/level too which is undesirable.

How to change the callback so that the pan/zoom mode doesn't affect window/level?

The code is attached.

If there are better image viewing tools using matplotlib, I can upgrade, but I couldn't find them on a quick search. The goal is to add some plotting capability ( plot row, col on user-specified coordinates) and some ROI drawing capability. ( See my other post for those questions. )

Matplotlib: 0.87.7, python: 2.5 ubuntu 7.04

Thanks,
Venkat.

------------------------------------------------------------------------

#!/usr/bin/env python
import scipy
import pylab
from pylab import cos, sqrt, arctan2, sqrt,pi,cm, clim, get_current_fig_manager
import sys
# Displaying an image with window/level controls
# from matplotlib

pylab.ion()

xstart = 0;
ystart = 0;
win = 0;
lev = 0;
vmax_orig = 0;
vmin_orig = 0;

def on_click(event):
  #get the x and y coords, flip y from top to bottom
  global win,lev
  win = im.norm.vmax - im.norm.vmin;
  lev = (im.norm.vmax + im.norm.vmin)/2;
  x, y = event.x, event.y;
  if event.button==3:
    if event.inaxes is not None:
      global xstart,ystart
      xstart = event.xdata;
      ystart = event.ydata;
      #print 'click:data coords', event.xdata, event.ydata;

def on_move(event):
  #get the x and y pixel coords
  x, y = event.x, event.y
  scale = 10;
  if event.button==3:
    if event.inaxes is not None:
      xdelta = event.xdata - xstart;
      ydelta = event.ydata - ystart;
      xratio = xdelta / (im.get_extent()[1]-im.get_extent()[0]);
      yratio = ydelta / (im.get_extent()[3]-im.get_extent()[2]);

      new_win = xratio*scale + win;
      new_lev = yratio*scale + lev;
      if new_win < 0: new_win = 0;
            clim_high = new_lev + new_win/2;
      clim_low = new_lev - new_win/2;
      clim(clim_low,clim_high);

      #print 'move:deltas', xdelta, ydelta
      #print 'clim_low: ', clim_low, 'clim_high: ', clim_high

def on_release(event):
  global win,lev
  x, y = event.x, event.y
  if event.button==2:
    if event.inaxes is not None:
      clim(vmin_orig,vmax_orig);
      print 'release: vmin: ',im.norm.vmin,'vmax: ',im.norm.vmax

def viewimage(imdata):
  global im,vmax_orig,vmin_orig
  im=pylab.imshow(imdata,origin='lower',cmap=cm.gray);
  vmax_orig = im.norm.vmax;
  vmin_orig = im.norm.vmin;
  binding_id = pylab.connect('motion_notify_event', on_move)
  pylab.connect('button_press_event', on_click)
  pylab.connect('button_release_event', on_release)
  pylab.show();

def main():
  # Creating the grid of coordinates x,y x,y = scipy.ogrid[-1.:1.:.01, -1.:1.:.01]
  z = 3*y*(3*x**2-y**2)/4 + .5*cos(6*pi * sqrt(x**2 +y**2) + arctan2(x,y))
  viewimage(z);

if __name__ == '__main__':
    main()
  ------------------------------------------------------------------------

-------------------------------------------------------------------------
SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

You may also want to look at the widget lock variable, which the
toolbar manages and user code can acquire or view the lock, eg
examples/lasso_demo.py. This is somewhat more robust than using the
toolbar mode string because it will allow other code, not part of the
toolbar, to share and use the lock.

    def callback(self, verts):
        ind = nonzero(points_inside_poly(self.xys, verts))[0]
        for i in range(self.Nxy):
            if i in ind:
                self.facecolors[i] = Datum.colorin
            else:
                self.facecolors[i] = Datum.colorout

        self.canvas.draw_idle()
        self.canvas.widgetlock.release(self.lasso)
        del self.lasso

    def onpress(self, event):
        if self.canvas.widgetlock.locked(): return
        if event.inaxes is None: return
        self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata),
self.callback)
        # acquire a lock on the widget drawing
        self.canvas.widgetlock(self.lasso)

···

On Dec 10, 2007 11:53 AM, Venkat Ramanan <venkat@...1806...> wrote:

If anyone faces a similar issue, there is a solution here.

http://scipy.org/Cookbook/Matplotlib/Interactive_Plotting

Essentially, we should also check for "toolbar.mode"