[vtkusers] Python: numpy array->vtkImage->paraview

David Gobbi david.gobbi at gmail.com
Fri Mar 9 12:33:52 EST 2012


Hi Justin,

You don't need to convert the array to a string, the VTK importer can
access the numpy array directly.  So instead of doing this:

data_string = data_matrix.tostring()
dataImporter.CopyImportVoidPointer(data_string, len(data_string))

you can do this:

dataImporter.CopyImportVoidPointer(data_matrix, data_matrix.nbytes)

or you can avoid the copy of the data altogether, though this is a bit
dangerous because the importer will need to be able to access the
numpy array's memory each time the importer executes:

dataImporter.SetImportVoidPointer(data_matrix)


About the writer, the vtkImageWriter is for writing raw, unformatted
data.  It doesn't write .vtk files.  Try using vtkDataSetWriter
instead, which writes in the .vtk format, or vtkXMLImageDataWriter,
which writes in the newer XML format.

 - David

On Fri, Mar 9, 2012 at 10:17 AM, Justin Weber <onlyjus at gmail.com> wrote:
> Greetings,
>
> The story: I started using python/numpy to perform data manipulation (3D
> connected components, etc..) and processing of 3D arrays. Next I managed to
> use vtk to perform volume rendering etc. to visualize the data. Now, I want
> to save the vtk data to a format that can be used in paraview so that a side
> by side comparison with CFD simulations can be performed. I am having
> trouble with saving the vtk data to a file to be used in paraview.
>
> System: Windows 7, Python 2.7, vtkVersion:04859120.
>
> 1) Numpy array to vtk (example here) works fine:
>
> data=np.array() #sum numpy array dim=20x20x40
> dataImporter = vtk.vtkImageImport()
> data_string = data_matrix.tostring()
> dataImporter.CopyImportVoidPointer(data_string, len(data_string))
> dataImporter.SetDataScalarTypeToUnsignedChar()
> dataImporter.SetNumberOfScalarComponents(1)
> dataImporter.SetDataExtent(0, 20, 0, 20, 0, 40)
> dataImporter.SetWholeExtent(0, 20, 0, 20, 0, 40)
>
> 2) Displaying the volume (example here) works fine:
> # This class describes how the volume is rendered (through ray tracing).
> compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
> # We can finally create our volume. We also have to specify the data for it,
> as well as how the data will be rendered.
> volumeMapper = vtk.vtkVolumeRayCastMapper()
> volumeMapper.SetVolumeRayCastFunction(compositeFunction)
> volumeMapper.SetInputConnection(dataImporter.GetOutputPort())
>
> # The class vtkVolume is used to pair the preaviusly declared volume as well
> as the properties to be used when rendering that volume.
> volume = vtk.vtkVolume()
> volume.SetMapper(volumeMapper)
> volume.SetProperty(volumeProperty)
>
> etc....
>
> 3) Writing data to some vtk file (can't figure out how to do this):
> writer=vtk.vtkImageWriter()
> writer.SetInputConnection(dataImporter.GetOutputPort())
> writer.SetFileName('./test.vtk')
> writer.Update()
> writer.Write()
>
> When i try opening the test.vtk file with paraview, there is no information
> in it.
>
> Any help would be much appreciated!
>
> Thanks
> Justin



More information about the vtkusers mailing list