Error while trying to use `vtk_to_numpy`

Hi All,

I am trying to run the following example (K3D-jupyter/volume_renderer.ipynb at 3fef1ea419a84a51c8aed56cb285b9fcf0a18c9a · K3D-tools/K3D-jupyter · GitHub) in jupyter notebook.

import k3d
import math
import numpy as np
import nibabel as nib
from k3d.helpers import download
import ipywidgets as widgets
import vtk
from vtkmodules.util import numpy_support
basic_color_maps = [(attr, getattr(k3d.basic_color_maps, attr)) for attr in dir(k3d.basic_color_maps) if
                    not attr.startswith('__')]
paraview_color_maps = [(attr, getattr(k3d.paraview_color_maps, attr)) for attr in dir(k3d.paraview_color_maps) if
                       not attr.startswith('__')]
matplotlib_color_maps = [(attr, getattr(k3d.matplotlib_color_maps, attr)) for attr in dir(k3d.matplotlib_color_maps)
                         if not attr.startswith('__')]
colormaps = basic_color_maps + paraview_color_maps + matplotlib_color_maps

filename = download('https://vedo.embl.es/examples/data/embryo.slc')
reader = vtk.vtkSLCReader()
reader.SetFileName(filename)
reader.Update()
vti = reader.GetOutput()

bounds = vti.GetBounds()
x, y, z = vti.GetDimensions()
img = numpy_support.vtk_to_numpy(vti.GetPointData().GetArray(0)).reshape(-1, y, x)

tf_editor = k3d.transfer_function_editor()
volume = k3d.volume(img.astype(np.float16))

@widgets.interact(x=widgets.Dropdown(options=colormaps, description='ColorMap:'))
def g(x):
    tf_editor.color_map = np.array(x, dtype=np.float32)

plot = k3d.plot()
plot += volume
tf_editor.display()
plot.display()

a = widgets.jslink((tf_editor, 'color_map'), (volume, 'color_map'))
a = widgets.jslink((tf_editor, 'opacity_function'), (volume, 'opacity_function'))

and I get the following error

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [1], in <cell line: 25>()
     23 bounds = vti.GetBounds()
     24 x, y, z = vti.GetDimensions()
---> 25 img = numpy_support.vtk_to_numpy(vti.GetPointData().GetArray(0)).reshape(-1, y, x)
     27 tf_editor = k3d.transfer_function_editor()
     28 volume = k3d.volume(img.astype(np.float16))

File ~\anaconda3\envs\differential_networks\lib\site-packages\vtkmodules\util\numpy_support.py:215, in vtk_to_numpy(vtk_array)
    200 def vtk_to_numpy(vtk_array):
    201     """Converts a VTK data array to a numpy array.
    202 
    203     Given a subclass of vtkDataArray, this function returns an
   (...)
    213 
    214     """
--> 215     typ = vtk_array.GetDataType()
    216     assert typ in get_vtk_to_numpy_typemap().keys(), \
    217            "Unsupported array type %s"%typ
    218     assert typ != vtkConstants.VTK_BIT, 'Bit arrays are not supported.'

AttributeError: 'NoneType' object has no attribute 'GetDataType'

I am not sure how to fix this error. Suggestions will be really helpful.

From the error, it looks like vtk_to_numpy() received None as its argument.

This means that the dataset returned by the reader is probably empty. Which means that the download() function was probably unable to download the data. There were probably warnings about the data that you did not see (maybe jupyter didn’t show them?)

Try downloading the data manually, by entering the ‘https://vedo.embl.es/examples/data/embryo.slc’ into your web browser.

1 Like

Could you please have a look at
Model class 'TransferFunctionModel' from module 'k3d' is loaded but can not be instantiated ?

1 Like