5 # -------------------------------------------------------------------
6 # Specific vtkTkImageViewerWidget bindings
8 # Create a 2d text actor that can be used to display infos
9 # like window/level, pixel picking, etc
11 proc cb_vtkiw_create_text1 {vtkiw} {
12 set mapper [::vtk::get_widget_variable_value $vtkiw text1_mapper]
15 [::vtk::new_widget_object $vtkiw vtkTextMapper text1_mapper]
16 $mapper SetInput "none"
17 set tprop [$mapper GetTextProperty]
18 $tprop SetFontFamilyToArial
22 $tprop SetColor 1 1 0.5
24 set actor [::vtk::get_widget_variable_value $vtkiw text1_actor]
27 [::vtk::new_widget_object $vtkiw vtkActor2D text1_actor]
28 $actor SetMapper $mapper
29 $actor SetLayerNumber 1
30 [$actor GetPositionCoordinate] SetValue 5 4 0
31 $actor SetVisibility 0
32 [[$vtkiw GetImageViewer] GetRenderer] AddActor2D $actor
36 # Show/Hide the 2d text actor
37 # Ensure that it stays in the upper left corner of the window
39 proc cb_vtkiw_show_text1 {vtkiw} {
40 set actor [::vtk::get_widget_variable_value $vtkiw text1_actor]
41 if {![$actor GetVisibility]} {
42 set height [lindex [$vtkiw configure -height] 4]
43 set pos [$actor GetPositionCoordinate]
44 set value [$pos GetValue]
46 [lindex $value 0] [expr $height - 15] [lindex $value 2]
51 proc cb_vtkiw_hide_text1 {vtkiw} {
52 set actor [::vtk::get_widget_variable_value $vtkiw text1_actor]
53 if {[$actor GetVisibility]} {
58 # -------------------------------------------------------------------
59 # vtkInteractorStyleImage callbacks/observers
60 # istyle: interactor style
61 # vtkiw: vtkTkImageRenderWindget
63 # StartWindowLevelEvent observer.
64 # Create the text actor, show it
66 proc cb_istyleimg_start_window_level_event {istyle vtkiw} {
67 ::vtk::cb_vtkiw_create_text1 $vtkiw
68 ::vtk::cb_vtkiw_show_text1 $vtkiw
71 # EndWindowLevelEvent observer.
72 # Hide the text actor.
74 proc cb_istyleimg_end_window_level_event {istyle vtkiw} {
75 ::vtk::cb_vtkiw_hide_text1 $vtkiw
79 # WindowLevelEvent observer.
80 # Update the text actor with the current window/level values.
82 proc cb_istyleimg_window_level_event {istyle vtkiw} {
83 set mapper [::vtk::get_widget_variable_value $vtkiw text1_mapper]
84 set viewer [$vtkiw GetImageViewer]
85 $mapper SetInput [format "W/L: %.0f/%.0f" \
86 [$viewer GetColorWindow] [$viewer GetColorLevel]]
89 # RightButtonPressEvent observer.
90 # Invert the 'shift' key. The usual vtkInteractorStyleImage
91 # behaviour is to enable picking mode with "Shift+Right button",
92 # whereas we want picking mode to be "Right button" (for backward
95 proc cb_istyleimg_right_button_press_event {istyle} {
96 set iren [$istyle GetInteractor]
97 $iren SetShiftKey [expr [$iren GetShiftKey] ? 0 : 1]
98 $istyle OnRightButtonDown
101 proc cb_istyleimg_right_button_release_event {istyle} {
102 set iren [$istyle GetInteractor]
103 $iren SetShiftKey [expr [$iren GetShiftKey] ? 0 : 1]
104 $istyle OnRightButtonUp
107 # StartPickEvent observer.
108 # Create the text actor, show it
110 proc cb_istyleimg_start_pick_event {istyle vtkiw} {
111 ::vtk::cb_vtkiw_create_text1 $vtkiw
112 ::vtk::cb_vtkiw_show_text1 $vtkiw
115 # EndPickEvent observer.
116 # Hide the text actor.
118 proc cb_istyleimg_end_pick_event {istyle vtkiw} {
119 ::vtk::cb_vtkiw_hide_text1 $vtkiw
123 # PickEvent observer.
124 # Update the text actor with the current value of the picked pixel.
126 proc cb_istyleimg_pick_event {istyle vtkiw} {
128 set viewer [$vtkiw GetImageViewer]
129 set input [$viewer GetInput]
130 set pos [[$istyle GetInteractor] GetEventPosition]
131 set x [lindex $pos 0]
132 set y [lindex $pos 1]
133 set z [$viewer GetZSlice]
135 # Y is flipped upside down
137 set height [lindex [$vtkiw configure -height] 4]
138 set y [expr $height - $y]
140 # Make sure point is in the whole extent of the image.
142 scan [$input GetWholeExtent] "%d %d %d %d %d %d" \
143 xMin xMax yMin yMax zMin zMax
144 if {$x < $xMin || $x > $xMax || \
145 $y < $yMin || $y > $yMax || \
146 $z < $zMin || $z > $zMax} {
150 $input SetUpdateExtent $x $x $y $y $z $z
153 set num_comps [$input GetNumberOfScalarComponents]
155 for {set idx 0} {$idx < $num_comps} {incr idx} {
156 set str [format "%s %.0f" $str \
157 [$input GetScalarComponentAsFloat $x $y $z $idx]]
160 set mapper [::vtk::get_widget_variable_value $vtkiw text1_mapper]
161 $mapper SetInput "$str"
165 # -------------------------------------------------------------------
166 # Create vtkTkImageViewerWidget bindings, setup observers
168 proc bind_tk_imageviewer_widget {vtkiw} {
170 bind_tk_widget $vtkiw [[$vtkiw GetImageViewer] GetRenderWindow]
172 set viewer [$vtkiw GetImageViewer]
173 set iren [[$viewer GetRenderWindow] GetInteractor]
175 # Ask the viewer to setup an image style interactor
177 $viewer SetupInteractor $iren
178 set istyle [$iren GetInteractorStyle]
180 # Window/Level observers
182 ::vtk::set_widget_variable_value $istyle StartWindowLevelEventTag \
183 [$istyle AddObserver StartWindowLevelEvent \
184 "::vtk::cb_istyleimg_start_window_level_event $istyle $vtkiw"]
186 ::vtk::set_widget_variable_value $istyle WindowLevelEventTag \
187 [$istyle AddObserver WindowLevelEvent \
188 "::vtk::cb_istyleimg_window_level_event $istyle $vtkiw"]
190 ::vtk::set_widget_variable_value $istyle EndWindowLevelEventTag \
191 [$istyle AddObserver EndWindowLevelEvent \
192 "::vtk::cb_istyleimg_end_window_level_event $istyle $vtkiw"]
196 ::vtk::set_widget_variable_value $istyle RightButtonPressEventTag \
197 [$istyle AddObserver RightButtonPressEvent \
198 "::vtk::cb_istyleimg_right_button_press_event $istyle"]
200 ::vtk::set_widget_variable_value $istyle RightButtonReleaseEventTag \
201 [$istyle AddObserver RightButtonReleaseEvent \
202 "::vtk::cb_istyleimg_right_button_release_event $istyle"]
204 ::vtk::set_widget_variable_value $istyle StartPickEventTag \
205 [$istyle AddObserver StartPickEvent \
206 "::vtk::cb_istyleimg_start_pick_event $istyle $vtkiw"]
208 ::vtk::set_widget_variable_value $istyle EndPickEventTag \
209 [$istyle AddObserver EndPickEvent \
210 "::vtk::cb_istyleimg_end_pick_event $istyle $vtkiw"]
212 ::vtk::set_widget_variable_value $istyle PickEventTag \
213 [$istyle AddObserver PickEvent \
214 "::vtk::cb_istyleimg_pick_event $istyle $vtkiw"]
218 # Handle deprecated calls
220 proc BindTkImageViewer {widget} {
221 puts stderr "BindTkImageViewer is deprecated. Please use ::vtk::bind_tk_imageviewer_widget instead"
222 ::vtk::bind_tk_imageviewer_widget $widget