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

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

import os 

import vtkAll as vtk 

from shallowCopy import shallowCopy 

import shelve 

import os.path 

 

def readPolyData(filename, computeNormals=False): 

 

    ext = os.path.splitext(filename)[1].lower() 

 

    readers = { 

            '.vtp' : vtk.vtkXMLPolyDataReader, 

            '.vtk' : vtk.vtkPolyDataReader, 

            '.ply' : vtk.vtkPLYReader, 

            '.obj' : vtk.vtkOBJReader, 

            '.stl' : vtk.vtkSTLReader, 

              } 

 

    try: 

        readers['.pcd'] = vtk.vtkPCDReader 

    except AttributeError: 

        pass 

 

    if ext not in readers: 

        raise Exception('Unknown file extension in readPolyData: %s' % filename) 

 

    reader = readers[ext]() 

    reader.SetFileName(filename) 

    reader.Update() 

    polyData = shallowCopy(reader.GetOutput()) 

 

    if computeNormals: 

        return _computeNormals(polyData) 

    else: 

        return polyData 

 

 

def readMultiBlock(filename): 

    '''Reads a .vtm file and returns a list of vtkPolyData objects''' 

 

    reader = vtk.vtkXMLMultiBlockDataReader() 

    reader.SetFileName(filename) 

    reader.Update() 

 

    polyDataList = [] 

    mb = reader.GetOutput() 

    for i in xrange(mb.GetNumberOfBlocks()): 

        polyData = vtk.vtkPolyData.SafeDownCast(mb.GetBlock(i)) 

        if polyData and polyData.GetNumberOfPoints(): 

            polyDataList.append(shallowCopy(polyData)) 

 

    return polyDataList 

 

 

def readImage(filename): 

 

    ext = os.path.splitext(filename)[1].lower() 

 

    readers = { 

            '.png' : vtk.vtkPNGReader, 

            '.jpg' : vtk.vtkJPEGReader, 

            '.vti' : vtk.vtkXMLImageDataReader, 

              } 

 

    if ext not in readers: 

        raise Exception('Unknown file extension in readImage: %s' % filename) 

 

    reader = readers[ext]() 

    reader.SetFileName(filename) 

    reader.Update() 

    image = shallowCopy(reader.GetOutput()) 

    return image 

 

 

def readVrml(filename): 

    ''' 

    Returns list of vtkPolyData meshes and a list of colors as 3-tuples 

    ''' 

    l = vtk.vtkVRMLImporter() 

    l.SetFileName(filename) 

    l.Read() 

    w = l.GetRenderWindow() 

    ren = w.GetRenderers().GetItemAsObject(0) 

    actors = ren.GetActors() 

    actors = [actors.GetItemAsObject(i) for i in xrange(actors.GetNumberOfItems())] 

    meshes = [a.GetMapper().GetInput() for a in actors] 

    colors = [ac.GetProperty().GetColor() for ac in actors] 

    return meshes, colors 

 

 

def writePolyData(polyData, filename): 

 

    ext = os.path.splitext(filename)[1].lower() 

 

    writers = { 

            '.vtp' : vtk.vtkXMLPolyDataWriter, 

            '.vtk' : vtk.vtkPolyDataWriter, 

            '.ply' : vtk.vtkPLYWriter, 

            '.stl' : vtk.vtkSTLWriter, 

              } 

 

    if ext not in writers: 

        raise Exception('Unknown file extension in writePolyData: %s' % filename) 

 

    writer = writers[ext]() 

 

    if ext in ('.ply', '.stl'): 

        polyData = _triangulate(polyData) 

        writer.SetFileTypeToASCII() 

 

    if ext in ('.ply'): 

        if polyData.GetPointData().GetArray('RGB255'): 

            writer.SetArrayName('RGB255') 

 

    writer.SetFileName(filename) 

    writer.SetInput(polyData) 

    writer.Update() 

 

def writeImage(image, filename): 

 

    ext = os.path.splitext(filename)[1].lower() 

 

    writers = { 

            '.png' : vtk.vtkPNGWriter, 

            '.jpg' : vtk.vtkJPEGWriter, 

            '.pnm' : vtk.vtkPNMWriter, 

            '.tiff' : vtk.vtkTIFFWriter, 

            '.bmp' : vtk.vtkBMPWriter, 

            '.vti' : vtk.vtkXMLImageDataWriter, 

              } 

 

    if ext not in writers: 

        raise Exception('Unknown file extension in writePolyData: %s' % filename) 

 

    writer = writers[ext]() 

    writer.SetFileName(filename) 

    writer.SetInput(image) 

    writer.Write() 

 

def _computeNormals(polyData): 

    normals = vtk.vtkPolyDataNormals() 

    normals.SetFeatureAngle(45) 

    normals.SetInput(polyData) 

    normals.Update() 

    return shallowCopy(normals.GetOutput()) 

 

def _triangulate(polyData): 

    normals = vtk.vtkTriangleFilter() 

    normals.SetInput(polyData) 

    normals.Update() 

    return shallowCopy(normals.GetOutput()) 

 

def saveDataToFile(filename, dataDict, overwrite=False): 

    if overwrite is False and os.path.isfile(filename): 

        raise ValueError("file already exists, overwrite option was False") 

 

    myShelf = shelve.open(filename,'n') 

    myShelf['dataDict'] = dataDict 

    myShelf.close() 

 

def readDataFromFile(filename): 

    myShelf = shelve.open(filename) 

    dataDict = myShelf['dataDict'] 

    return dataDict