enthought/mayavi — Issue #21: Was picker type=cell ported to Mayavi 4.0.0?
Author: mattions
Created: 2011-12-08 16:04:00+00:00
State: open

I've just upgraded to Mayavi 4.0.0 and I've discovered that the picker type=cell doesn't work.
to be precise is the line:

picker = figure.on_mouse_pick(picker_callback, type='cell')

For example, try to use it with the redball example:

# Author: Gael Varoquaux
# Copyright (c) 2009, Enthought, Inc.
# License: BSD style.

import numpy as np
from mayavi import mlab

################################################################################
# Disable the rendering, to get bring up the figure quicker:
figure = mlab.gcf()
mlab.clf()
figure.scene.disable_render = True

# Creates two set of points using mlab.points3d: red point and
# white points
x1, y1, z1 = np.random.random((3, 10))
red_glyphs = mlab.points3d(x1, y1, z1, color=(1, 0, 0),
resolution=20)

x2, y2, z2 = np.random.random((3, 10))
white_glyphs = mlab.points3d(x2, y2, z2, color=(0.9, 0.9, 0.9),
resolution=20)

# Add an outline to show the selected point and center it on the first
# data point.
outline = mlab.outline(line_width=3)
outline.outline_mode = 'cornered'
outline.bounds = (x1[0]-0.1, x1[0]+0.1,
y1[0]-0.1, y1[0]+0.1,
z1[0]-0.1, z1[0]+0.1)

# Every object has been created, we can reenable the rendering.
figure.scene.disable_render = False
################################################################################

# Here, we grab the points describing the individual glyph, to figure
# out how many points are in an individual glyph.
glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()

def picker_callback(picker):
""" Picker callback: this get called when on pick events.
"""
if picker.actor in red_glyphs.actor.actors:
# Find which data point corresponds to the point picked:
# we have to account for the fact that each data point is
# represented by a glyph with several points
point_id = picker.point_id/glyph_points.shape[0]
# If the no points have been selected, we have '-1'
if point_id != -1:
# Retrieve the coordinnates coorresponding to that data
# point
x, y, z = x1[point_id], y1[point_id], z1[point_id]
# Move the outline to the data point.
outline.bounds = (x-0.1, x+0.1,
y-0.1, y+0.1,
z-0.1, z+0.1)

picker = figure.on_mouse_pick(picker_callback, type='cell')

# Decrease the tolerance, so that we can more easily select a precise
# point.
picker.tolerance = 0.01

mlab.title('Click on red balls')

mlab.show()

I'm getting this error:

mattions@triton:examples(master*)$ python select_red_balls.py
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/mayavi/core/mouse_pick_dispatcher.py", line 168, in on_button_release
picker.pick((x, y, 0), self.scene.scene.renderer)
File "tvtk_classes/abstract_picker.py", line 153, in pick
File "/usr/local/lib/python2.7/dist-packages/tvtk/tvtk_base.py", line 523, in _wrap_call
ret = vtk_method(*args)
TypeError: function takes exactly 4 arguments (2 given)

It worked before with 3.6.0