Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

174 lines
5.0 KiB

# Creates a meta object which clips a region of the input, and
# draws a histogram for the data.
# Create a histogram object
proc vtkHistogramWidget {widget {width 512} {height 192}} {
set clip [::vtk::new_widget_object $widget vtkImageClip Clip]
set accumulate \
[::vtk::new_widget_object $widget vtkImageAccumulate Accumulate]
$accumulate SetInputConnection [$clip GetOutputPort]
set canvas [::vtk::new_widget_object $widget vtkImageCanvasSource2D Canvas]
$canvas SetScalarTypeToUnsignedChar
$canvas SetNumberOfScalarComponents 3
set viewer [::vtk::new_widget_object $widget vtkImageViewer Viewer]
$viewer SetInputConnection [$canvas GetOutputPort]
$viewer SetColorWindow 256
$viewer SetColorLevel 127
vtkTkImageViewerWidget $widget \
-width $width \
-height $height \
-iv $viewer
return $widget
}
# Set the input
proc HistogramWidgetSetInput {widget input} {
set clip [::vtk::get_widget_variable_value $widget Clip]
$clip SetInput $input
}
# Set the extent
proc HistogramWidgetSetExtent {widget x1 x2 y1 y2 z1 z2} {
set clip [::vtk::get_widget_variable_value $widget Clip]
$clip SetOutputWholeExtent $x1 $x2 $y1 $y2 $z1 $z2
}
# Render
proc HistogramWidgetRender {widget} {
# Get the size of the histogram window
set width [lindex [$widget configure -width] 4]
set height [lindex [$widget configure -height] 4]
# Setup the bins of the accumulate filter from the range of input data
set accumulate [::vtk::get_widget_variable_value $widget Accumulate]
set numBins [expr $width / 2]
set data [$accumulate GetInput]
$data Update
set inputRange [[[$data GetPointData] GetScalars] GetRange]
set origin [lindex $inputRange 0]
set spacing [expr 1.0 * ([lindex $inputRange 1] - $origin) / $numBins]
$accumulate SetComponentExtent 0 [expr $numBins - 1] 0 0 0 0
$accumulate SetComponentOrigin $origin 0.0 0.0
$accumulate SetComponentSpacing $spacing 1.0 1.0
# Initialize the canvas
set canvas [::vtk::get_widget_variable_value $widget Canvas]
$canvas SetExtent 0 [expr $width - 1] 0 [expr $height - 1] 0 0
$canvas SetDrawColor 255
$canvas SetDrawColor 172 174 241
$canvas FillBox 0 [expr $width - 1] 0 [expr $height - 1]
$canvas SetDrawColor 0
$canvas SetDrawColor 137 28 28
# Get the histogram data
set data [$accumulate GetOutput]
$data Update
# Scale the histogram max to fit the window
set histRange [[[$data GetPointData] GetScalars] GetRange]
set scale [expr 0.9 * $height / [lindex $histRange 1]]
for {set idx 0} {$idx < $numBins} {incr idx} {
set y [$data GetScalarComponentAsDouble $idx 0 0 0]
set y1 [expr $y * $scale]
set y2 [lindex [split $y1 .] 0]
set x [expr $idx * 2]
$canvas DrawSegment $x 0 $x $y2
}
$widget Render
}
# Set the bindings
proc HistogramWidgetBind {widget} {
# The usual vtkTkImageRenderWidget bindings
::vtk::bind_tk_imageviewer_widget $widget
set iren [[[$widget GetImageViewer] GetRenderWindow] GetInteractor]
# Remove the usual ConfigureEvent and ExposeEvent observers and
# use ours
$iren RemoveObservers ConfigureEvent
$iren RemoveObservers ExposeEventTag
$iren AddObserver ExposeEvent \
[list HistogramWidgetRender $widget]
# Remove the usual PickEvent and use ours for probing
set istyle [$iren GetInteractorStyle]
$istyle RemoveObservers PickEvent
$istyle AddObserver PickEvent \
[list HistogramWidgetUpdateInteraction $widget]
# Bind the left button so that it acts like the right button
$istyle RemoveObservers LeftButtonPressEvent
$istyle AddObserver LeftButtonPressEvent \
"::vtk::cb_istyleimg_right_button_press_event $istyle"
$istyle RemoveObservers LeftButtonReleaseEvent
$istyle AddObserver LeftButtonReleaseEvent \
"::vtk::cb_istyleimg_right_button_release_event $istyle"
}
# Probe the histogram
proc HistogramWidgetUpdateInteraction {widget} {
set pos [[[[$widget GetImageViewer] GetRenderWindow] GetInteractor] GetEventPosition]
set x [lindex $pos 0]
set y [lindex $pos 1]
# Compute the bin selected by the mouse
set x [expr $x / 2]
set accumulate [::vtk::get_widget_variable_value $widget Accumulate]
set origin [lindex [$accumulate GetComponentOrigin] 0]
set spacing [lindex [$accumulate GetComponentSpacing] 0]
set binMin [expr $origin + $spacing * $x]
set binMax [expr $binMin + $spacing]
# Now get the height of the histogram
set data [$accumulate GetOutput]
$data Update
# Make sure value is in extent
set max [lindex [$data GetExtent] 1]
if {$x < 0 || $x > $max} {
return
}
set y [$data GetScalarComponentAsDouble $x 0 0 0]
# Display the value
set mapper [::vtk::get_widget_variable_value $widget text1_mapper]
$mapper SetInput [format "\[%.1f, %.1f): %d" $binMin $binMax $y]
$widget Render
}