There is vtk.vtkImageActor
and vtk.vtkActor
in the vtkRenderer
. I want to pick the actor in the mouse move event with vtkCellPicker
. I can pick vtkImageActor
, but it is failed to pick vtkActor
. The completed code is:
import vtk
from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk
import numpy as np
def numpyToVTK(data):
if len(data.shape) == 2:
data = data[:, :, np.newaxis]
flat_data_array = data.transpose(2,1,0).flatten()
vtk_data = numpy_to_vtk(num_array=flat_data_array, deep=True, array_type=vtk.VTK_FLOAT)
shape = data.shape
img = vtk.vtkImageData()
img.GetPointData().SetScalars(vtk_data)
img.SetDimensions(shape[0], shape[1], shape[2])
return img
img = np.zeros(shape=[512, 512])
img[0:256, 0:256] = 0
img[0:256, 256:] = 64
img[256:, 0:256] = 128
img[256:, 256:] = 255
img = numpyToVTK(img)
imgActor = vtk.vtkImageActor()
imgActor.SetInputData(img)
lineSource = vtk.vtkLineSource()
lineSource.SetPoint1(0, 0, 0)
lineSource.SetPoint2(512, 512, 0)
lineSource.Update()
lineMapper = vtk.vtkPolyDataMapper()
lineMapper.SetInputData(lineSource.GetOutput())
lineActor = vtk.vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(255, 0, 0)
lineActor.GetProperty().SetLineWidth(5)
# lineActor.GetProperty().EdgeVisibilityOn() ############################ it make difference
renderer = vtk.vtkRenderer()
renderer.AddActor(imgActor)
renderer.AddActor(lineActor)
renderer.SetBackground(0.4, 0.5, 0.6)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.Render()
def mousemove(iren, even):
pos = iren.GetEventPosition()
picker = vtk.vtkCellPicker()
picker.Pick(pos[0], pos[1], 0, renderer)
actor = picker.GetProp3D()
# print(pos)
if isinstance(actor, vtk.vtkImageActor):
print('Picture actor')
elif isinstance(actor, vtk.vtkActor):
print("line actor")
else:
print('none actor')
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.AddObserver("MouseMoveEvent", mousemove)
style = vtk.vtkInteractorStyleImage()
renderWindowInteractor.SetInteractorStyle(style)
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.Initialize()
renderWindowInteractor.Start()
In thte mousemove
function, I print the picked actor. But it only print Picture actor
. Is there anything wrong with vtkCellPicker
?
def mousemove(iren, even):
pos = iren.GetEventPosition()
picker = vtk.vtkCellPicker()
picker.Pick(pos[0], pos[1], 0, renderer)
actor = picker.GetProp3D()
# print(pos)
if isinstance(actor, vtk.vtkImageActor):
print('Picture actor')
elif isinstance(actor, vtk.vtkActor):
print("line actor")
else:
print('none actor')