-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIsosurface.py
107 lines (88 loc) · 3.39 KB
/
Isosurface.py
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
#!/usr/bin/env python
from __future__ import print_function
import vtk
#Interactor style that handles mouse and keyboard events
class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
isovalue=0.5
def __init__(self,parent=None):
self.parent = vtk.vtkRenderWindowInteractor()
if(parent is not None):
self.parent = parent
self.AddObserver("KeyPressEvent",self.keyPress)
##############################
### QUESTION 2 - ISOVALUES ###
##############################
def keyPress(self,obj,event):
key = self.parent.GetKeySym()
if(key == "Up"):
#TODO: have this increase the isovalue
MyInteractorStyle.isovalue = MyInteractorStyle.isovalue +0.05 #Change isovalue
hydrogen.SetValue(0,MyInteractorStyle.isovalue) #Add isovalue to the object
self.parent.Render()#Update display
print("Up ", MyInteractorStyle.isovalue)
if(key == "Down"):
#TODO: have this decrease the isovalue
MyInteractorStyle.isovalue = MyInteractorStyle.isovalue-0.05
hydrogen.SetValue(0,MyInteractorStyle.isovalue)
self.parent.Render()
print("Down ", MyInteractorStyle.isovalue)
#Loader for our structured dataset
imageReader = vtk.vtkStructuredPointsReader()
imageReader.SetFileName("./data/hydrogen.vtk")
imageReader.Update()
#Print dimensions and range of the 3d image
dims = imageReader.GetOutput().GetDimensions()
print("Dimensions of image: " + str(dims[0]) + " x "
+ str(dims[1]) + " x " + str(dims[2]))
range = imageReader.GetOutput().GetScalarRange();
print("Range of image: " + str(range[0]) + " to " + str(range[1]))
#create an outline that shows the bounds of our dataset
outline = vtk.vtkOutlineFilter();
outline.SetInputConnection(imageReader.GetOutputPort());
#mapper to push the outline geometry to the graphics library
outlineMapper = vtk.vtkPolyDataMapper();
outlineMapper.SetInputConnection(outline.GetOutputPort());
#actor for the outline to add to our renderer
outlineActor = vtk.vtkActor();
outlineActor.SetMapper(outlineMapper);
outlineActor.GetProperty().SetLineWidth(2.0);
#TODO:
#
#Insert isosurfacing, scalebar, and text code here
#
##############################
### QUESTION 1 -ISOSURFACE ###
##############################
#Source
hydrogen=vtk.vtkMarchingCubes()
hydrogen.SetInputConnection(imageReader.GetOutputPort())
hydrogen.SetValue(0, 0.5) #Could this be hydrogen.SetValue(0, 0.1)?
hydrogen.ComputeNormalsOn()
#Mapper
hydrogenMapper=vtk.vtkPolyDataMapper()
hydrogenMapper.SetInputConnection(hydrogen.GetOutputPort())
#Actor
hydrogenActor=vtk.vtkActor()
hydrogenActor.SetMapper(hydrogenMapper)
##############################
##############################
#### QUESTION 3 - TEXT #######
##############################
##############################
#A renderer that renders our geometry into the render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(0.1, 0.1, 0.3)
#Add actors to our renderer
renderer.AddActor(outlineActor)
#TODO: You'll probably need to add additional actors to the scene
renderer.AddActor(hydrogenActor)
#The render window
renwin = vtk.vtkRenderWindow()
renwin.SetSize( 512, 512);
renwin.AddRenderer(renderer)
#Interactor to handle mouse and keyboard events
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetInteractorStyle(MyInteractorStyle(parent = interactor))
interactor.SetRenderWindow(renwin)
interactor.Initialize()
interactor.Start()