VTK Python Binding

VTK Python Binding in MeVisLab

MeVisLab comes with a complete Python binding for the VTK library. This means that you can use any Python/VTK example and run them inside of MeVisLab, with minor adoptions to redirect the rendering to a MeVisLab MDL control.

Getting Started

To get started, just open a script console in MeVisLab and do:

import vtk

Now you can instantiate any of the wrapped VTK objects. You can grab most of the Python/VTK examples that are provided with VTK and run them using execfile(path/to/the/example).

NOTE: The examples do not integrate deeply into MeVisLab, since a vtkRenderWindow will show its own native window and will start its own event loop. For deep integration of VTK visualizations into MeVisLab, read the next chapter.

Integrating VTK Visualizations into the MDL

There are several ways to integrate your VTK visualizations into a MeVisLab GUI. The most common way is to add a vtkRenderWidget (or vtkRenderWidgetGL) to your MDL GUI:

Window {
  Vertical {
    vtkRenderWidget {
      name = view
      initCommand = initViewer
    }
  }
}

In the Python script of your module you can then attach the vtkRenderer to the vtkRenderWidget:

from vtk import *

def initViewer(viewer):
  # Create the VTK scene and renderer:
  renderer = createVTKRenderer()
  # Attach the renderer to the MDL vtkRenderWidget:
  viewer.setRenderer(renderer)

def createVTKRenderer():
  # Create a sphere
  sphereSource = vtkSphereSource();
  sphereSource.SetCenter(0.0, 0.0, 0.0);
  sphereSource.SetRadius(10);
  sphereSource.Update();

  # Create a mapper and actor
  mapper = vtkPolyDataMapper ();
  mapper.SetInputConnection(sphereSource.GetOutputPort());

  actor = vtkActor();
  actor.SetMapper(mapper);

  camera = vtkCamera ();
  camera.SetPosition(0, 0,100);
  camera.SetFocalPoint(0, 0, 0);

  # Create a renderer
  renderer = vtkRenderer();
  renderer.SetActiveCamera(camera);

  # Add the actor to the scene
  renderer.AddActor(actor);
  renderer.SetBackground(1,1,1); # Background color white

  return renderer

The difference between vtkRenderWidget and vtkRenderWidgetGL is that vtkRenderWidgetGL is based on Qt’s OpenGL support (using QVTKWidget2), while vtkRenderWidget uses the VTK GL support (using QVTKWidget).

Remote rendering VTK scenes

You can either use the VTKRemoteRendering module to remote render a VTK scene, or you can use the GraphicsView.

Integrating VTK Visualizations into the GraphicsView

VTK Visualizations can be integrated into the GraphicsView MDL control. This is done using the MLABVTKGraphicsItem item that is provided via the MLABGraphicsScene.addVTKGraphicsItem call. Have a look at the VTKGraphicsViewExample module, which demonstrates how to add a VTK item to the GraphicsView scene.

Advanced Integration using Qt widgets

The QtVTK Python module offers wrappers for the QVTKWidget, QVTKWidget2 and QVTKGraphicsView, so that own Python based viewers can be written using these classes. It is recommended to prefer the vtkRenderWidget MDL controls instead.

Cooperating with the VTK ML modules

For details on the VTK ML modules, have a look at VTK Algorithms in MeVisLab.

The VTK Python wrappers can be used together with the VTK ML modules. You can get access to the VTK Python object of a MLBase field via field.object() and you can set VTK Python objects on MLBase fields via field.setObject().

For example, if you want to get access to the vtkImageImport of a MLToVTKImage module, you can do:

image = ctx.field("MLToVTKImage.outputImage").object()

and then use the resulting vtkImageImport object as source for other VTK algorithms. Vice versa, you can create a VTK pipeline in Python and set the result as the input of a module, using setObject().

Have a look at the VTKRayCastingExample to see how this can be used.