mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
176 lines
4.9 KiB
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 .
|
|
|