You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.3 KiB
149 lines
4.3 KiB
"""
|
|
vtkImageImportFromArray: a NumPy front-end to vtkImageImport
|
|
|
|
Load a Numeric Python array into a VTK image.
|
|
To use this class, you must have the LLNL Numeric Python distribution
|
|
(http://numpy.sf.net)
|
|
|
|
Methods:
|
|
|
|
GetOutput() -- connect to VTK image pipeline
|
|
SetArray() -- set the array to load in
|
|
|
|
Convert python 'Int' to VTK_UNSIGNED_SHORT:
|
|
(python doesn't support unsigned short, so this might be necessary)
|
|
|
|
SetConvertIntToUnsignedShort(yesno)
|
|
ConvertIntToUnsignedShortOn()
|
|
ConvertIntToUnsignedShortOff()
|
|
|
|
Methods from vtkImageImport:
|
|
(if you don't set these, sensible defaults will be used)
|
|
|
|
SetDataExtent()
|
|
SetDataSpacing()
|
|
SetDataOrigin()
|
|
"""
|
|
|
|
import Numeric
|
|
from vtk import vtkImageImport
|
|
from vtkConstants import *
|
|
|
|
_NEW_NUMERIC = 0
|
|
try:
|
|
val = float(Numeric.__version__)
|
|
except ValueError:
|
|
_NEW_NUMERIC = 0
|
|
else:
|
|
if val > 20.0:
|
|
_NEW_NUMERIC = 1
|
|
else:
|
|
_NEW_NUMERIC = 0
|
|
|
|
|
|
class vtkImageImportFromArray:
|
|
def __init__(self):
|
|
self.__import = vtkImageImport()
|
|
self.__ConvertIntToUnsignedShort = 0
|
|
self.__Array = None
|
|
|
|
# type dictionary: note that python doesn't support
|
|
# unsigned integers properly!
|
|
__typeDict = {'c':VTK_UNSIGNED_CHAR,
|
|
'b':VTK_UNSIGNED_CHAR,
|
|
'1':VTK_CHAR,
|
|
's':VTK_SHORT,
|
|
'i':VTK_INT,
|
|
'l':VTK_LONG,
|
|
'f':VTK_FLOAT,
|
|
'd':VTK_DOUBLE,
|
|
'F':VTK_FLOAT,
|
|
'D':VTK_DOUBLE }
|
|
|
|
__sizeDict = { VTK_CHAR:1,
|
|
VTK_UNSIGNED_CHAR:1,
|
|
VTK_SHORT:2,
|
|
VTK_UNSIGNED_SHORT:2,
|
|
VTK_INT:4,
|
|
VTK_FLOAT:4,
|
|
VTK_DOUBLE:8 }
|
|
|
|
# convert 'Int32' to 'unsigned short'
|
|
def SetConvertIntToUnsignedShort(self,yesno):
|
|
self.__ConvertIntToUnsignedShort = yesno
|
|
|
|
def GetConvertIntToUnsignedShort(self):
|
|
return self.__ConvertIntToUnsignedShort
|
|
|
|
def ConvertIntToUnsignedShortOn(self):
|
|
self.__ConvertIntToUnsignedShort = 1
|
|
|
|
def ConvertIntToUnsignedShortOff(self):
|
|
self.__ConvertIntToUnsignedShort = 0
|
|
|
|
# get the output
|
|
def GetOutput(self):
|
|
return self.__import.GetOutput()
|
|
|
|
# import an array
|
|
def SetArray(self,imArray):
|
|
self.__Array = imArray
|
|
numComponents = 1
|
|
dim = imArray.shape
|
|
|
|
if (len(dim) == 4):
|
|
numComponents = dim[3]
|
|
dim = (dim[0],dim[1],dim[2])
|
|
|
|
type = self.__typeDict[imArray.typecode()]
|
|
|
|
if (imArray.typecode() == 'F' or imArray.typecode == 'D'):
|
|
numComponents = numComponents * 2
|
|
|
|
if (self.__ConvertIntToUnsignedShort and imArray.typecode() == 'i'):
|
|
if _NEW_NUMERIC:
|
|
imTmpArr = imArray.astype(Numeric.Int16).flat
|
|
else:
|
|
imTmpArr = imArray.astype(Numeric.Int16).tostring()
|
|
type = VTK_UNSIGNED_SHORT
|
|
else:
|
|
if _NEW_NUMERIC:
|
|
imTmpArr = imArray.flat
|
|
else:
|
|
imTmpArr = imArray.tostring()
|
|
|
|
size = len(imTmpArr)*self.__sizeDict[type]
|
|
self.__import.CopyImportVoidPointer(imTmpArr, size)
|
|
self.__import.SetDataScalarType(type)
|
|
self.__import.SetNumberOfScalarComponents(numComponents)
|
|
extent = self.__import.GetDataExtent()
|
|
self.__import.SetDataExtent(extent[0],extent[0]+dim[2]-1,
|
|
extent[2],extent[2]+dim[1]-1,
|
|
extent[4],extent[4]+dim[0]-1)
|
|
self.__import.SetWholeExtent(extent[0],extent[0]+dim[2]-1,
|
|
extent[2],extent[2]+dim[1]-1,
|
|
extent[4],extent[4]+dim[0]-1)
|
|
|
|
def GetArray(self):
|
|
return self.__Array
|
|
|
|
# a whole bunch of methods copied from vtkImageImport
|
|
|
|
def SetDataExtent(self,extent):
|
|
self.__import.SetDataExtent(extent)
|
|
|
|
def GetDataExtent(self):
|
|
return self.__import.GetDataExtent()
|
|
|
|
def SetDataSpacing(self,spacing):
|
|
self.__import.SetDataSpacing(spacing)
|
|
|
|
def GetDataSpacing(self):
|
|
return self.__import.GetDataSpacing()
|
|
|
|
def SetDataOrigin(self,origin):
|
|
self.__import.SetDataOrigin(origin)
|
|
|
|
def GetDataOrigin(self):
|
|
return self.__import.GetDataOrigin()
|
|
|
|
|