[vtkusers] vtkCellPicker failing to pick vtkPolyLine (using Python and wx)
Craig Henderson
craig.henderson at intelligentultrasound.com
Tue Dec 11 14:12:32 EST 2012
Hi,
Could this be related to the problem I asked about a few days ago? I
haven't had any responses.
http://www.vtk.org/pipermail/vtkusers/2012-December/126783.html
Thanks
Craig
On 11 Dec 2012, at 18:27, David Gobbi <david.gobbi at gmail.com> wrote:
Hi David,
You can get the polyline picking to work by increasing the tolerance:
self.cellPicker.SetTolerance(0.005)
I'll continue looking through the code to see why the new code
behaves differently from the old, though. I suspect there have
been minor changes to the way that tolerances are applied.
- David
On Tue, Dec 11, 2012 at 10:51 AM, David vanEe <david.vanee at convergent.ca>
wrote:
Sure, this version will work with just python/vtk. Thanks for taking a
look.
import vtk
class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self, actorData, actorList):
self.actorData = actorData
self.actorList = actorList
self.cellPicker = vtk.vtkCellPicker()
self.AddObserver("MouseMoveEvent", self.OnMotion)
def OnMotion(self, obj, event):
iren = obj.GetInteractor()
renwin = iren.GetRenderWindow()
ren = renwin.GetRenderers().GetFirstRenderer()
x, y = iren.GetEventPosition()
# invert Y value
actualY = ren.GetSize()[1] - y
# dim all actors
for (index, actor) in enumerate(self.actorList):
(zValue, cellType, dimColor, brightColor) = self.actorData[index]
actor.GetProperty().SetDiffuseColor(*dimColor)
self.cellPicker.Pick(x, actualY, 0, ren)
dataSet = self.cellPicker.GetDataSet()
if dataSet is not None:
# highlight picked actor
for (index, actor) in enumerate(self.actorList):
if actor.GetMapper().GetInput() == dataSet:
(zOffset, cellType, dimColor, brightColor) =
self.actorData[index]
actor.GetProperty().SetDiffuseColor(*brightColor)
renwin.Render()
# simple point coords used by both actors
coords = [(0.0, 0.0),
(1.0, 0.0),
(1.0, 1.0),
(0.0, 1.0)]
actorData = [(1.0, vtk.VTK_POLY_LINE, (0.5,0.0,0.0), (1.0, 0.0, 0.0)),
(0.0, vtk.VTK_QUAD, (0.0, 0.0, 0.5), (0.0, 0.0, 1.0))]
ren = vtk.vtkRenderer()
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(ren)
actorList = []
for data in actorData:
(zValue, cellType, dimColor, brightColor) = data
points = vtk.vtkPoints()
for (pointIndex, coord) in enumerate(coords):
points.InsertPoint(pointIndex, coord[0], coord[1], zValue)
idList = vtk.vtkIdList()
idList.SetNumberOfIds(len(coords))
for pointIndex in range(len(coords)):
idList.SetId(pointIndex, pointIndex)
cells = vtk.vtkCellArray()
cells.InsertNextCell(idList)
grid = vtk.vtkUnstructuredGrid()
grid.SetPoints(points)
grid.SetCells(cellType, cells)
mapper = vtk.vtkDataSetMapper()
mapper.SetInput(grid)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetRepresentation(1)
actor.GetProperty().SetLineWidth(5.0)
actor.GetProperty().SetDiffuseColor(*dimColor)
ren.AddActor(actor)
actorList.append(actor)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetInteractorStyle(MyInteractorStyle(actorData, actorList))
interactor.SetRenderWindow(renwin)
interactor.Initialize()
interactor.Start()
-----Original Message-----
From: David Gobbi [mailto:david.gobbi at gmail.com <david.gobbi at gmail.com>]
Sent: Tuesday, December 11, 2012 9:08 AM
To: David vanEe
Cc: vtkusers at vtk.org
Subject: Re: [vtkusers] vtkCellPicker failing to pick vtkPolyLine (using
Python and wx)
Hi David,
I was the one who made the changes to the vtkCellPicker code, and I'd be
glad to investigate to see why the behavior changed.
Can you send me an example that uses just python, i.e. no wx?
- David
On Tue, Dec 11, 2012 at 9:26 AM, David vanEe <david.vanee at convergent.ca>
wrote:
Hi all,
I've recently updated my VTK from 5.4 to 5.10.1, and some old
vtkCellPicker code isn't doing what I want anymore. This 'simple'
example works fine in
5.4 (both the blue and red actor highlight when you mouse-over them),
but in
5.10.1 only the blue (quad) actor works. The only difference between
the two actors (aside from coordinates and colors) is the cellType of
vtk.VTK_POLY_LINE vs vtk.VTK_QUAD.
I've tried looking for changes in the pick routine, but
vtkCellPicker.cxx has undergone substantial changes and I was unable
to locate the cause. Any suggestions for getting the picker to pick the
polyline?
Thanks in advance,
Dave
import wx
import vtk
from vtk.wx.wxVTKRenderWindowInteractor import
wxVTKRenderWindowInteractor
class myVTKInteractor(wxVTKRenderWindowInteractor):
def __init__(self, parent):
wxVTKRenderWindowInteractor.__init__(self, parent, -1)
self.Enable(1)
self.AddObserver("ExitEvent", lambda o,e,f=self: f.Close())
self.ren = vtk.vtkRenderer()
self.GetRenderWindow().AddRenderer(self.ren)
# simple point coords used by both actors
coords = [(0.0, 0.0),
(1.0, 0.0),
(1.0, 1.0),
(0.0, 1.0)]
self.actorData = [(1.0, vtk.VTK_POLY_LINE, (0.5,0.0,0.0),
(1.0, 0.0, 0.0)),
(0.0, vtk.VTK_QUAD, (0.0, 0.0, 0.5), (0.0,
0.0, 1.0))]
self.actorList = []
for data in self.actorData:
(zValue, cellType, dimColor, brightColor) = data
points = vtk.vtkPoints()
for (pointIndex, coord) in enumerate(coords):
points.InsertPoint(pointIndex, coord[0], coord[1],
zValue)
idList = vtk.vtkIdList()
idList.SetNumberOfIds(len(coords))
for pointIndex in range(len(coords)):
idList.SetId(pointIndex, pointIndex)
cells = vtk.vtkCellArray()
cells.InsertNextCell(idList)
grid = vtk.vtkUnstructuredGrid()
grid.SetPoints(points)
grid.SetCells(cellType, cells)
mapper = vtk.vtkDataSetMapper()
mapper.SetInput(grid)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetRepresentation(1)
actor.GetProperty().SetLineWidth(5.0)
actor.GetProperty().SetDiffuseColor(*dimColor)
self.ren.AddActor(actor)
self.actorList.append(actor)
self.cellPicker = vtk.vtkCellPicker()
def OnMotion(self, event):
# invert Y value
actualY = self.ren.GetSize()[1] - event.GetY()
# dim all actors
for (index, actor) in enumerate(self.actorList):
(zValue, cellType, dimColor, brightColor) =
self.actorData[index]
actor.GetProperty().SetDiffuseColor(*dimColor)
self.cellPicker.Pick(event.GetX(), actualY, 0, self.ren)
dataSet = self.cellPicker.GetDataSet()
if dataSet is not None:
# highlight picked actor
for (index, actor) in enumerate(self.actorList):
if actor.GetMapper().GetInput() == dataSet:
(zOffset, cellType, dimColor, brightColor) =
self.actorData[index]
actor.GetProperty().SetDiffuseColor(*brightColor)
self.Render()
def wxVTKRenderWindowInteractorExample():
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "wxVTKRenderWindowInteractor",
size=(400,400))
widget = myVTKInteractor(frame)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(widget, 1, wx.EXPAND)
frame.SetSizer(sizer)
frame.Layout()
frame.Show()
app.MainLoop()
if __name__ == "__main__":
wxVTKRenderWindowInteractorExample()
--
David A. Van Ee, BASc, EIT
Convergent Manufacturing Technologies Inc.
6190 Agronomy Rd, Suite 403
Vancouver BC Canada V6T 1Z3
Email: david.vanee at convergent.ca | Tel: 604-822-9682 x103
WWW: http://www.convergent.ca | Fax: 604-822-9659
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the VTK FAQ at:
http://www.vtk.org/Wiki/VTK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.vtk.org/mailman/listinfo/vtkusers
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20121211/b7010505/attachment.htm>
More information about the vtkusers
mailing list