[vtkusers] vtkCellPicker failing to pick vtkPolyLine (using Python and wx)

David Gobbi david.gobbi at gmail.com
Tue Dec 11 13:26:55 EST 2012


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]
> 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



More information about the vtkusers mailing list