Files
ThirdParty-6/ParaView-5.0.1/VTK/Examples/ImageProcessing/Tcl/ImageSlicing.tcl

176 lines
4.9 KiB
Tcl

package require vtk
package require vtkinteraction
# This example shows how to load a 3D image into VTK and then reformat
# that image into a different orientation for viewing. It uses
# vtkImageReslice for reformatting the image, and uses vtkImageActor
# and vtkInteractorStyleImage to display the image. This InteractorStyle
# forces the camera to stay perpendicular to the XY plane.
# Start by loading some data.
vtkImageReader2 reader
reader SetFilePrefix "$VTK_DATA_ROOT/Data/headsq/quarter"
reader SetDataExtent 0 63 0 63 1 93
reader SetDataSpacing 3.2 3.2 1.5
reader SetDataOrigin 0.0 0.0 0.0
reader SetDataScalarTypeToUnsignedShort
reader UpdateWholeExtent
# Calculate the center of the volume
reader Update
set extent [[reader GetExecutive] GetWholeExtent [reader GetOutputInformation 0]]
set spacing [[reader GetOutput] GetSpacing]
set origin [[reader GetOutput] GetOrigin]
set xMin [lindex $extent 0]
set xMax [lindex $extent 1]
set yMin [lindex $extent 2]
set yMax [lindex $extent 3]
set zMin [lindex $extent 4]
set zMax [lindex $extent 5]
set xSpacing [lindex $spacing 0]
set ySpacing [lindex $spacing 1]
set zSpacing [lindex $spacing 2]
set x0 [lindex $origin 0]
set y0 [lindex $origin 1]
set z0 [lindex $origin 2]
set xCenter [expr $x0 + $xSpacing * 0.5 * ($xMin + $xMax)]
set yCenter [expr $y0 + $ySpacing * 0.5 * ($yMin + $yMax)]
set zCenter [expr $z0 + $zSpacing * 0.5 * ($zMin + $zMax)]
# Matrices for axial, coronal, sagittal, oblique view orientations
vtkMatrix4x4 axial
set elements { 1 0 0 $xCenter
0 1 0 $yCenter
0 0 1 $zCenter
0 0 0 1}
for {set i 0} {$i < 16} {incr i} {
axial SetElement [expr $i / 4] [expr $i % 4] [expr [lindex $elements $i]]
}
vtkMatrix4x4 coronal
set elements { 1 0 0 $xCenter
0 0 1 $yCenter
0 -1 0 $zCenter
0 0 0 1}
for {set i 0} {$i < 16} {incr i} {
coronal SetElement [expr $i / 4] [expr $i % 4] [expr [lindex $elements $i]]
}
vtkMatrix4x4 sagittal
set elements { 0 0 -1 $xCenter
1 0 0 $yCenter
0 -1 0 $zCenter
0 0 0 1}
for {set i 0} {$i < 16} {incr i} {
sagittal SetElement [expr $i / 4] [expr $i % 4] [expr [lindex $elements $i]]
}
vtkMatrix4x4 oblique
set elements { 1 0 0 $xCenter
0 0.866025 -0.5 $yCenter
0 0.5 0.866025 $zCenter
0 0 0 1 }
for {set i 0} {$i < 16} {incr i} {
oblique SetElement [expr $i / 4] [expr $i % 4] [expr [lindex $elements $i]]
}
# Extract a slice in the desired orientation
vtkImageReslice reslice
reslice SetInputConnection [reader GetOutputPort]
reslice SetOutputDimensionality 2
reslice SetResliceAxes sagittal
reslice SetInterpolationModeToLinear
# Create a greyscale lookup table
vtkLookupTable table
table SetTableRange 0 2000
table SetValueRange 0.0 1.0
table SetSaturationRange 0.0 0.0
table SetRampToLinear
table Build
# Map the image through the lookup table
vtkImageMapToColors color
color SetLookupTable table
color SetInputConnection [reslice GetOutputPort]
# Display the image
vtkImageActor actor
[actor GetMapper] SetInputConnection [color GetOutputPort]
vtkRenderer renderer
renderer AddActor actor
vtkRenderWindow window
window AddRenderer renderer
# Set up the interaction
vtkInteractorStyleImage imageStyle
vtkRenderWindowInteractor interactor
interactor SetInteractorStyle imageStyle
window SetInteractor interactor
window Render
# Create callbacks for slicing the image
global action
set action ""
proc ButtonPressCallback {} {
global action
set action "Slicing"
}
proc ButtonReleaseCallback {} {
global action
set action ""
}
proc MouseMoveCallback {} {
set lastPos [interactor GetLastEventPosition]
set currPos [interactor GetEventPosition]
global action
if {$action == "Slicing"} {
set deltaY [expr [lindex $currPos 1] - [lindex $lastPos 1]]
reslice Update
set spacing [[reslice GetOutput] GetSpacing]
set sliceSpacing [lindex $spacing 2]
set matrix [reslice GetResliceAxes]
# move the center point that we are slicing through
set center [$matrix MultiplyPoint 0 0 [expr $sliceSpacing * $deltaY] 1]
$matrix SetElement 0 3 [lindex $center 0]
$matrix SetElement 1 3 [lindex $center 1]
$matrix SetElement 2 3 [lindex $center 2]
window Render
} else {
imageStyle OnMouseMove
}
}
imageStyle AddObserver MouseMoveEvent MouseMoveCallback
imageStyle AddObserver LeftButtonPressEvent ButtonPressCallback
imageStyle AddObserver LeftButtonReleaseEvent ButtonReleaseCallback
interactor AddObserver UserEvent {wm deiconify .vtkInteract}
interactor AddObserver ExitEvent {exit}
interactor Initialize
#
# Hide the default . widget
#
wm withdraw .
interactor Start
#
# You only need this line if you run this script from a Tcl shell
# (tclsh) instead of a Tk shell (wish)
#
tkwait window .