[vtkusers] vtkPicker + Tk problems solved.

Kevin Teich kteich at nmr.mgh.harvard.edu
Wed Sep 18 15:45:51 EDT 2002

In case anybody else was wondering about the same thing, I'm posting my
solution to my problems with vtkPicker. As a recap, I was trying to get
x,y coordinates from a texture mapped plane.

First it was suggested that I use a vtkCellPicker. This did what I 
wanted to get a 'pixel' out of the plane. Make the plane the same 
resolution as your texture and use modulus and regular division on the 
picked cell ID to get the x,y coordinates. In the picker call back (my 
resolution here is 256x256):

    set cellId [$picker GetCellId]
    if { $cellId >= 0 } {
	puts "coord: [expr $cellId % 256],[expr $cellId / 256]"

This worked, but only if I was using a vtkInteractor. Onto problem two.

I wanted to use BindTkRenderWidget function so I could use my own Tk
bindings, and this is where I was running into problems, as it seemed to
be picking the wrong cell. Turns out, the picker bound by the
BindTkRenderWidget flips the y coordinate before sending it to the picker.  
You can use the following code to bind your own picker. First, bind your
pre-pick function to a key in your widget.

bind $rwRender <KeyPress-b> "PickCell %W %x %y"

You pre-pick function needs to do the y flip and then call the picker:

proc PickCell { widget x y } {
    global picker
    global renderer
    set WindowY [lindex [$widget configure -height] 4]
    picker Pick $x [expr $WindowY - $y - 1] 0.0 renderer

(This is almost straight out of 
VTK/Wrapping/Tcl/vtkinteraction/TkInteractor.tcl.) Then your picker 
callback function is called with the proper coordinates.

Thanks for your help!

Kevin Teich

More information about the vtkusers mailing list