.. AUTO-GENERATED FILE -- DO NOT EDIT!

.. _example_viz_surfaces:


==================
Visualize surfaces
==================

Here is a simple tutorial that shows how to visualize surfaces using dipy_. It
also shows how to load/save, get/set and update ``vtkPolyData`` and show
surfaces.

``vtkPolyData`` is a structure used by VTK to represent surfaces and other data
structures. Here we show how to visualize a simple cube but the same idea
should apply for any surface.

::
  
  import numpy as np
  

Import useful functions from ``dipy.viz.utils``

::
  
  import dipy.io.vtk as io_vtk
  import dipy.viz.utils as ut_vtk
  from dipy.viz import window
  
  # Conditional import machinery for vtk
  # Allow import, but disable doctests if we don't have vtk
  from dipy.utils.optpkg import optional_package
  vtk, have_vtk, setup_module = optional_package('vtk')
  

Create an empty ``vtkPolyData``

::
  
  my_polydata = vtk.vtkPolyData()
  

Create a cube with vertices and triangles as numpy arrays

::
  
  my_vertices = np.array([[0.0,  0.0,  0.0],
                         [0.0,  0.0,  1.0],
                         [0.0,  1.0,  0.0],
                         [0.0,  1.0,  1.0],
                         [1.0,  0.0,  0.0],
                         [1.0,  0.0,  1.0],
                         [1.0,  1.0,  0.0],
                         [1.0,  1.0,  1.0]])
  # the data type for vtk is needed to mention here, numpy.int64
  my_triangles = np.array([[0,  6,  4],
                           [0,  2,  6],
                           [0,  3,  2],
                           [0,  1,  3],
                           [2,  7,  6],
                           [2,  3,  7],
                           [4,  6,  7],
                           [4,  7,  5],
                           [0,  4,  5],
                           [0,  5,  1],
                           [1,  5,  7],
                           [1,  7,  3]],dtype='i8')
  
  

Set vertices and triangles in the ``vtkPolyData``

::
  
  ut_vtk.set_polydata_vertices(my_polydata, my_vertices)
  ut_vtk.set_polydata_triangles(my_polydata, my_triangles)
  

Save the ``vtkPolyData``

::
  
  file_name = "my_cube.vtk"
  io_vtk.save_polydata(my_polydata, file_name)
  print("Surface saved in " + file_name)
  

Load the ``vtkPolyData``

::
  
  cube_polydata = io_vtk.load_polydata(file_name)
  

add color based on vertices position

::
  
  cube_vertices = ut_vtk.get_polydata_vertices(cube_polydata)
  colors = cube_vertices * 255
  ut_vtk.set_polydata_colors(cube_polydata, colors)
  
  print("new surface colors")
  print(ut_vtk.get_polydata_colors(cube_polydata))
  

Visualize surfaces

::
  
  # get vtkActor
  cube_actor = ut_vtk.get_actor_from_polydata(cube_polydata)
  
  # renderer and scene
  renderer = window.Renderer()
  renderer.add(cube_actor)
  renderer.set_camera(position=(10, 5, 7), focal_point=(0.5, 0.5, 0.5))
  renderer.zoom(3)
  
  # display
  # window.show(renderer, size=(600, 600), reset_camera=False)
  window.record(renderer, out_path='cube.png', size=(600, 600))
  

.. figure:: cube.png
   :align: center

   An example of a simple surface visualized with DIPY.

.. include:: ../links_names.inc


        
.. admonition:: Example source code

   You can download :download:`the full source code of this example <./viz_surfaces.py>`.
   This same script is also included in the dipy source distribution under the
   :file:`doc/examples/` directory.

