Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

import vtkAll as vtk 

from shallowCopy import shallowCopy 

import numpy as np 

 

try: 

    from vtk.util import numpy_support 

except ImportError: 

    from paraview import numpy_support 

 

def numpyToPolyData(pts, pointData=None, createVertexCells=False): 

    pd = vtk.vtkPolyData() 

    pd.SetPoints(vtk.vtkPoints()) 

    # Makes a deep copy 

    pd.GetPoints().SetData(getVtkFromNumpy(pts.copy())) 

 

    if pointData is not None: 

        for key, value in pointData.iteritems(): 

            addNumpyToVtk(pd, value.copy(), key) 

 

    if createVertexCells: 

        cellIds = vtk.vtkIdList() 

        cellIds.SetNumberOfIds(pd.GetNumberOfPoints()) 

        for i in range(pd.GetNumberOfPoints()): 

            cellIds.SetId(i, i) 

        cells = vtk.vtkCellArray() 

        cells.InsertNextCell(cellIds) 

        pd.SetVerts(cells) 

 

    return pd 

 

def getNumpyFromVtk(dataObj, arrayName='Points'): 

    if arrayName == 'Points': 

        vtkArray = dataObj.GetPoints().GetData() 

    else: 

        vtkArray = dataObj.GetPointData().GetArray(arrayName) 

 

    if not vtkArray: 

        raise KeyError('Array not found') 

 

    return numpy_support.vtk_to_numpy(vtkArray) 

 

 

def getVtkPointsFromNumpy(numpyArray): 

 

    points = vtk.vtkPoints() 

    points.SetData(getVtkFromNumpy(numpyArray)) 

    return points 

 

 

def getVtkPolyDataFromNumpyPoints(points): 

    ''' 

    Given an Nx3 array of xyz points 

    Return a new vtkPolyData containing points and vertex cells. 

    If the input points is not float64 it will be converted first. 

    ''' 

 

    if points.dtype != np.float64: 

        points = points.astype(np.float64) 

 

    polyData = vtk.vtkPolyData() 

    polyData.SetPoints(getVtkPointsFromNumpy(points)) 

    vtk.vtkPCLConversions.AddVertexCells(polyData) 

    return polyData 

 

 

def getVtkFromNumpy(numpyArray): 

 

    def MakeCallback(numpyArray): 

        def Closure(caller, event): 

            closureArray = numpyArray 

        return Closure 

 

    vtkArray = numpy_support.numpy_to_vtk(numpyArray) 

    vtkArray.AddObserver('DeleteEvent', MakeCallback(numpyArray)) 

    return vtkArray 

 

 

def addNumpyToVtk(dataObj, numpyArray, arrayName): 

    assert dataObj.GetNumberOfPoints() == numpyArray.shape[0] 

 

    vtkArray = getVtkFromNumpy(numpyArray) 

    vtkArray.SetName(arrayName) 

    dataObj.GetPointData().AddArray(vtkArray)