Guest User

Untitled

a guest
Jan 22nd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3.  
  4. import vtk
  5. from vtk.util import numpy_support
  6. from importlib import reload
  7. import numpy as np
  8. import os
  9. import mathutils
  10.  
  11. try:
  12. import bpy
  13. inside_blender = True
  14. except:
  15. inside_blender = False
  16.  
  17. if (inside_blender):
  18. import VTKBlender
  19. reload(VTKBlender)
  20.  
  21. # Global, persistent data
  22. #save_frames = True
  23. frame_change = None
  24. dataRoot = '/mydata/'
  25. dataFile = 'testData.mha'
  26.  
  27.  
  28. def main():
  29. print('Starting Main Function...')
  30. if (not inside_blender):
  31. return
  32. old_pre_count = len(bpy.app.handlers.frame_change_pre)
  33. for i in range(old_pre_count):
  34. print('Removing frame_change_pre handle {}'.format(i))
  35. bpy.app.handlers.frame_change_pre.pop()
  36. bpy.app.handlers.frame_change_pre.append(frame_change_pre)
  37.  
  38. def frame_change_pre(scene):
  39. print('My frame change pre function')
  40. global frame_change, npdata
  41. if (frame_change == None):
  42. print('initializing new frame changer')
  43. frame_change = FrameChange(scene, dataFile)
  44. else:
  45. print('using old FrameChange Object')
  46. frame_change.update(scene)
  47.  
  48. class FrameChange:
  49. def __init__(self, scene, dataFile):
  50. self.vtkDataReader = vtk.vtkMetaImageReader()
  51. self.vtkDataReader.SetFileName( os.path.join(dataRoot, dataFile) )
  52. self.vtkDataReader.Update()
  53.  
  54. self.level = 1
  55. self.contours = vtk.vtkContourFilter()
  56. self.stlWriter = vtk.vtkSTLWriter()
  57.  
  58. self.init_frame(scene)
  59. self.init_lut()
  60. self.init_mapper()
  61. self.init_mesh(scene)
  62. print('Initialized Frame Changern' + 15*'-')
  63.  
  64.  
  65. def update(self, scene):
  66. print('Updating scene')
  67. global save_frames
  68. self.init_frame(scene)
  69. self.update_contours()
  70. self.mapper.Update()
  71. #if save_frames == True:
  72. #self.stlWriter.SetFileName(os.path.join(dataRoot, 'tmp',str(self.level) + '_contour.stl'))
  73. #print('file to write: {}'.format(self.stlWriter.GetFileName()))
  74. #self.contours.Update()
  75. #self.stlWriter.SetInputConnection( self.contours.GetOutputPort() )
  76. #self.stlWriter.Write()
  77. VTKBlender.PolyDataMapperToBlender.convert(self.mapper, self.me)
  78. self.me.update(calc_edges = True)
  79. bpy.ops.object.mode_set(mode='EDIT')
  80. bpy.ops.mesh.remove_doubles()
  81. bpy.ops.mesh.normals_make_consistent(inside=False)
  82. bpy.ops.object.mode_set(mode='OBJECT')
  83.  
  84. self.smooth_faces()
  85.  
  86. def init_frame(self, scene):
  87. print('Initializing frame')
  88. self.level +=1
  89.  
  90.  
  91. def smooth_faces(self):
  92. print ('Smoothing polygon faces')
  93. for face in self.me.polygons:
  94. face.use_smooth = True
  95.  
  96. def init_mapper(self):
  97. print('Initializing mapper')
  98. self.contours.SetInputData( self.vtkDataReader.GetOutput() )
  99. self.update_contours()
  100. #self.mapper = get_basic_mapper(self.contours, self.lut)
  101. #self.stlWriter.SetFileName(os.path.join(dataRoot,'tmp',str(self.level) + '_contour.stl'))
  102. #print('file to write: {}'.format(self.stlWriter.GetFileName()))
  103. #self.contours.Update()
  104. #self.stlWriter.SetInputConnection( self.contours.GetOutputPort() )
  105. #self.stlWriter.Write()
  106.  
  107. def update_contours(self):
  108. print('Updating isosurfaces level')
  109. self.contours.GenerateValues(2, self.level, self.level+0.5 )
  110.  
  111.  
  112. def init_mesh(self,scene):
  113. print('Initializing mesh')
  114. self.me = bpy.data.meshes.new('mySurface')
  115. self.object = bpy.data.objects.new("mySurface",self.me)
  116. self.object.location = mathutils.Vector((0, 0, 0))
  117. scene.objects.link(self.object)
  118. VTKBlender.PolyDataMapperToBlender.convert(self.mapper, self.me)
  119. self.me.update(calc_edges = True)
  120. scene.objects.active = self.object
  121. bpy.ops.object.mode_set(mode='EDIT')
  122. bpy.ops.mesh.remove_doubles()
  123. bpy.ops.mesh.normals_make_consistent(inside=False)
  124. bpy.ops.object.mode_set(mode='OBJECT')
  125.  
  126.  
  127. def init_lut(self):
  128. print('Initializing lut')
  129. self.lut = vtk.vtkLookupTable()
  130. self.lut.SetNumberOfColors( 10 )
  131. self.lut.SetHueRange(0.667,0.0);
  132. self.lut.Build()
  133.  
  134.  
  135. def get_basic_mapper(ob, lut):
  136. mapper = vtk.vtkPolyDataMapper()
  137. mapper.SetInputConnection(ob.GetOutputPort())
  138. mapper.SetLookupTable(lut)
  139. return mapper
  140.  
  141. main()
Add Comment
Please, Sign In to add comment