In [ ]:
import vtk
In [ ]:
from IPython.display import Image
def vtk_show(renderer, width=600, height=450):
    """
    Takes vtkRenderer instance and returns an IPython Image with the rendering.
    """
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetOffScreenRendering(1)
    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(width, height)
    renderWindow.Render()
     
    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renderWindow)
    windowToImageFilter.Update()
     
    writer = vtk.vtkPNGWriter()
    writer.SetWriteToMemory(1)
    writer.SetInputConnection(windowToImageFilter.GetOutputPort())
    writer.Write()
    data = str(buffer(writer.GetResult()))
    
    return Image(data)

Hola mundo

In [ ]:
coneSource = vtk.vtkConeSource()
coneSource.SetResolution(10)

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(coneSource.GetOutputPort())

actor = vtk.vtkActor()
actor.SetMapper(mapper)
 
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)

renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)

renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
 

renderWindow.Render()
renderWindowInteractor.Start()
In [ ]:
vtk_show(renderer)

Ejercicio 1

  • Aumenta la resolución del cono hasta 20 caras
  • Pinta el actor con SetDiffuseColor
  • Rota el actor 30 grados en X, y -45 en Y
  • Pon el background del renderer azul oscuro
  • Aumenta el zoom de la ActiveCamera en 1.5

Ejercicio 2

  • Utiliza un Cilindro como Source
  • Cambiando las propiedades de color del actor consigue una imágen como la siguiente

Ejercicio 3

  • Cambia el estilo de interacción a

    vtkInteractorStyleTrackballCamera
  • Añade un observer al interactor que escuche por 'LeftButtonPressEvent' y cambie el color del cilindro a uno aleatorio

Ejercicio 4

  • Carga las posiciones, conexiones y radio de los átomos y píntalos todos como en la figura
  • Crea un vtkPolyData y rellenalo con los datos leídos
    • SetPoints para los átomos
    • SetLines para las conexiones
    • GetPointData().SetScalars para los radios
  • Combina vtkSphereSource y vtkGlyph3D para generar todas las esferas
  • Colorea las esferas según su radio con vtkColorTransferFunction
  • Pinta las conexiones con vtkTubeFilter
  • Calcula el boundingBox con vtkOutlineFilter y píntalo junto con los demás actores

Ejercicio 5

  • Carga el archivo Wind.vtk con vtkStructuredPointsReader
  • Con vtkLookupTable mapea los escalares a la saturación y fja el Hue y el Value
  • Utiliza un PlaneSource colocado en un extremo del prisma como SourceConnection del vtkStreamLine
  • En el PolyDataMapper utiliza los rangos que devuelve GetScalarRange() de los datos leídos
  • Añade el bounding box con vtkOutlineFilter

Ejercicio 6

  • Carga el dataset "asymmetric.tiff". Es un labelmap con el background a 0 y un número correlativo por objeto
  • Con GetScalarRange() obten el rango de etiquetas en el labelmap
  • Haz un renderizado volumétrico utilizando las clases:
    • vtkPiecewiseFunction
    • vtkColorTransferFunction
    • vtkVolumeProperty
    • vtkVolumeRayCastCompositeFunction
  • Añade el volúmen a un mapper y este a su vez a un actor (vtkVolume)
  • Disminuye el SampeDistance en el mapper para obtener un mejor resultado

Ejercicio 7

  • Renderiza el "One-third_resolution_stack.tif" como el widget vtkImagePlaneWidget
  • Pon su orientazón al Eje Z
  • Añadele el Interactor y muéstalo con EnabledOn

Ejercicio 8

  • Renderiza el mismo dataset esta vez convirtiendo a malla el labelmap utilizando Marching Cubes
  • Haz lo mismo con "asymmetric.tif"
  • Colorea todos los objetos de symmetric de rojo y los de asymmetric de verde
In [ ]: