1#!/usr/bin/env python
2
3##
4# This is an example of how to use the vtkVolumePicker.
5##
6
7import math
8import vtk
9from vtk.util.misc import vtkGetDataRoot
10VTK_DATA_ROOT = vtkGetDataRoot()
11
12#---------------------------------------------------------
13# renderer and interactor
14ren = vtk.vtkRenderer()
15renWin = vtk.vtkRenderWindow()
16renWin.AddRenderer(ren)
17iren = vtk.vtkRenderWindowInteractor()
18iren.SetRenderWindow(renWin)
19
20#---------------------------------------------------------
21# read the volume
22reader = vtk.vtkImageReader2()
23reader.SetDataExtent(0,63,0,63,0,92)
24reader.SetFileNameSliceOffset(1)
25reader.SetDataScalarTypeToUnsignedShort()
26reader.SetDataByteOrderToLittleEndian()
27reader.SetFilePrefix(str(VTK_DATA_ROOT) + "/Data/headsq/quarter")
28reader.SetDataSpacing(3.2,3.2,1.5)
29
30#---------------------------------------------------------
31# set up the volume rendering
32volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
33volumeMapper.SetInputConnection(reader.GetOutputPort())
34volumeMapper.CroppingOn()
35volumeMapper.SetCroppingRegionPlanes((0.0, 141.6, 0.0, 201.6, 0.0, 138.0))
36
37volumeColor = vtk.vtkColorTransferFunction()
38volumeColor.AddRGBPoint(0,0.0,0.0,0.0)
39volumeColor.AddRGBPoint(180,0.3,0.1,0.2)
40volumeColor.AddRGBPoint(1000,1.0,0.7,0.6)
41volumeColor.AddRGBPoint(2000,1.0,1.0,0.9)
42
43volumeScalarOpacity = vtk.vtkPiecewiseFunction()
44volumeScalarOpacity.AddPoint(0,0.0)
45volumeScalarOpacity.AddPoint(180,0.0)
46volumeScalarOpacity.AddPoint(1000,0.2)
47volumeScalarOpacity.AddPoint(2000,0.8)
48
49volumeGradientOpacity = vtk.vtkPiecewiseFunction()
50volumeGradientOpacity.AddPoint(0,0.0)
51volumeGradientOpacity.AddPoint(90,0.5)
52volumeGradientOpacity.AddPoint(100,1.0)
53
54volumeProperty = vtk.vtkVolumeProperty()
55volumeProperty.SetColor(volumeColor)
56volumeProperty.SetScalarOpacity(volumeScalarOpacity)
57volumeProperty.SetGradientOpacity(volumeGradientOpacity)
58volumeProperty.SetInterpolationTypeToLinear()
59volumeProperty.ShadeOff()
60volumeProperty.SetAmbient(0.6)
61volumeProperty.SetDiffuse(0.6)
62volumeProperty.SetSpecular(0.1)
63
64volume = vtk.vtkVolume()
65volume.SetMapper(volumeMapper)
66volume.SetProperty(volumeProperty)
67
68#---------------------------------------------------------
69# Do the surface rendering
70boneExtractor = vtk.vtkMarchingCubes()
71boneExtractor.SetInputConnection(reader.GetOutputPort())
72boneExtractor.SetValue(0,1150)
73
74boneNormals = vtk.vtkPolyDataNormals()
75boneNormals.SetInputConnection(boneExtractor.GetOutputPort())
76boneNormals.SetFeatureAngle(60.0)
77
78boneStripper = vtk.vtkStripper()
79boneStripper.SetInputConnection(boneNormals.GetOutputPort())
80
81boneLocator = vtk.vtkCellLocator()
82boneLocator.SetDataSet(boneExtractor.GetOutput())
83boneLocator.LazyEvaluationOn()
84
85boneMapper = vtk.vtkPolyDataMapper()
86boneMapper.SetInputConnection(boneStripper.GetOutputPort())
87boneMapper.ScalarVisibilityOff()
88
89boneProperty = vtk.vtkProperty()
90boneProperty.SetColor(1.0,1.0,0.9)
91
92bone = vtk.vtkActor()
93bone.SetMapper(boneMapper)
94bone.SetProperty(boneProperty)
95
96#---------------------------------------------------------
97# Create an image actor
98table = vtk.vtkLookupTable()
99table.SetRange(0,2000)
100table.SetRampToLinear()
101table.SetValueRange(0,1)
102table.SetHueRange(0,0)
103table.SetSaturationRange(0,0)
104
105mapToColors = vtk.vtkImageMapToColors()
106mapToColors.SetInputConnection(reader.GetOutputPort())
107mapToColors.SetLookupTable(table)
108mapToColors.Update()
109
110imageActor = vtk.vtkImageActor()
111imageActor.GetMapper().SetInputConnection(mapToColors.GetOutputPort())
112imageActor.SetDisplayExtent(32,32,0,63,0,92)
113
114#---------------------------------------------------------
115# make a transform and some clipping planes
116transform = vtk.vtkTransform()
117transform.RotateWXYZ(-20,0.0,-0.7,0.7)
118
119volume.SetUserTransform(transform)
120bone.SetUserTransform(transform)
121imageActor.SetUserTransform(transform)
122
123c = volume.GetCenter()
124
125volumeClip = vtk.vtkPlane()
126volumeClip.SetNormal(0,1,0)
127volumeClip.SetOrigin(c[0],c[1],c[2])
128
129boneClip = vtk.vtkPlane()
130boneClip.SetNormal(1,0,0)
131boneClip.SetOrigin(c[0],c[1],c[2])
132
133volumeMapper.AddClippingPlane(volumeClip)
134boneMapper.AddClippingPlane(boneClip)
135
136#---------------------------------------------------------
137ren.AddViewProp(volume)
138ren.AddViewProp(bone)
139ren.AddViewProp(imageActor)
140
141camera = ren.GetActiveCamera()
142camera.SetFocalPoint(c[0],c[1],c[2])
143camera.SetPosition(c[0] + 500,c[1] - 100,c[2] - 100)
144camera.SetViewUp(0,0,-1)
145
146renWin.Render()
147
148#---------------------------------------------------------
149# the cone points along the -x axis
150coneSource = vtk.vtkConeSource()
151coneSource.CappingOn()
152coneSource.SetHeight(12)
153coneSource.SetRadius(5)
154coneSource.SetResolution(31)
155coneSource.SetCenter(6,0,0)
156coneSource.SetDirection(-1,0,0)
157
158coneMapper = vtk.vtkDataSetMapper()
159coneMapper.SetInputConnection(coneSource.GetOutputPort())
160
161redCone = vtk.vtkActor()
162redCone.PickableOff()
163redCone.SetMapper(coneMapper)
164redCone.GetProperty().SetColor(1,0,0)
165
166greenCone = vtk.vtkActor()
167greenCone.PickableOff()
168greenCone.SetMapper(coneMapper)
169greenCone.GetProperty().SetColor(0,1,0)
170
171# Add the two cones (or just one, if you want)
172ren.AddViewProp(redCone)
173ren.AddViewProp(greenCone)
174
175#---------------------------------------------------------
176# the picker
177picker = vtk.vtkVolumePicker()
178picker.SetTolerance(1e-6)
179picker.SetVolumeOpacityIsovalue(0.1)
180# locator is optional, but improves performance for large polydata
181picker.AddLocator(boneLocator)
182
183# A function to point an actor along a vector
184def PointCone(actor,nx,ny,nz):
185    actor.SetOrientation(0.0, 0.0, 0.0)
186    n = math.sqrt(nx**2 + ny**2 + nz**2)
187    if (nx < 0.0):
188        actor.RotateWXYZ(180, 0, 1, 0)
189        n = -n
190    actor.RotateWXYZ(180, (nx+n)*0.5, ny*0.5, nz*0.5)
191
192# A function to move the cursor with the mouse
193def MoveCursor(iren,event=""):
194    renWin.HideCursor()
195    x,y = iren.GetEventPosition()
196    picker.Pick(x, y, 0, ren)
197    p = picker.GetPickPosition()
198    n = picker.GetPickNormal()
199    redCone.SetPosition(p[0],p[1],p[2])
200    PointCone(redCone,n[0],n[1],n[2])
201    greenCone.SetPosition(p[0],p[1],p[2])
202    PointCone(greenCone,-n[0],-n[1],-n[2])
203    iren.Render()
204
205#---------------------------------------------------------
206# custom interaction
207iren.AddObserver("MouseMoveEvent", MoveCursor)
208
209iren.Start()
210