Test interaction

How can you simulate mouse and button presses correctly to test custom interaction? I would like to output an image, simulate mouse/buttons etc., then output another image so I can test that custom interaction commands are working.

#!/usr/bin/env python
import vtk

# Create a Cube
cube = vtk.vtkCubeSource()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(cube.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)

# Renderer
renderer = vtk.vtkRenderer()
renderer.AddViewProp(actor)

# Window and Interactor
window = vtk.vtkRenderWindow()
window.AddRenderer(renderer)
window.SetSize(600, 600)

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)
interactor.Initialize()

# Create a timer
def manipulate(*args):
    print("manipulate")
    writer = vtk.vtkPNGWriter()
    window_to_image = vtk.vtkWindowToImageFilter()
    window_to_image.SetInput(window)
    writer.SetInputData(window_to_image.GetOutput())

    # Save the un-changed rendering
    window.Render()
    window_to_image.Update()
    writer.SetFileName("before.png")
    writer.Write()

    # I NEED HELP HERE, PLEASE
    # How to manipulate the scene? For example click such that the cube rotates;
    # on MacOS just clicking down on the cube causes it to rotate, how can that be mimiced here?
    interactor.SetEventPosition(50, 50)
    interactor.LongTapEvent()

    # Save the the manipulated rendering
    window.Render()
    window_to_image.Update()
    writer.SetFileName("after.png")
    writer.Write()

# Call the above function after the window shows up
interactor.CreateOneShotTimer(1000)
interactor.AddObserver(vtk.vtkCommand.TimerEvent, manipulate)

# Show the result
window.Render()
interactor.Start()
1 Like

The FURY project does this by recording/replaying an interaction with vtkInteractorEventRecorder. See the code here.

1 Like