OSDN Git Service

FIRST REPOSITORY
[eos/hostdependOTHERS.git] / I686LINUX / util / I686LINUX / lib / vtk / tcl / vtkinteraction / bindings-iw.tcl
1 namespace eval ::vtk {
2
3     namespace export *
4
5     # -------------------------------------------------------------------
6     # Specific vtkTkImageViewerWidget bindings
7
8     # Create a 2d text actor that can be used to display infos
9     # like window/level, pixel picking, etc
10     
11     proc cb_vtkiw_create_text1 {vtkiw} {
12         set mapper [::vtk::get_widget_variable_value $vtkiw text1_mapper]
13         if {$mapper == ""} {
14             set mapper \
15                   [::vtk::new_widget_object $vtkiw vtkTextMapper text1_mapper]
16             $mapper SetInput "none"
17             set tprop [$mapper GetTextProperty]
18             $tprop SetFontFamilyToArial
19             $tprop SetFontSize 12
20             $tprop BoldOn
21             $tprop ShadowOn
22             $tprop SetColor 1 1 0.5
23         }
24         set actor [::vtk::get_widget_variable_value $vtkiw text1_actor]
25         if {$actor == ""} {
26             set 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
33         }
34     }
35
36     # Show/Hide the 2d text actor
37     # Ensure that it stays in the upper left corner of the window
38     
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]
45             $pos SetValue \
46                     [lindex $value 0] [expr $height - 15] [lindex $value 2]
47             $actor VisibilityOn
48         }
49     }
50
51     proc cb_vtkiw_hide_text1 {vtkiw} {
52         set actor [::vtk::get_widget_variable_value $vtkiw text1_actor]
53         if {[$actor GetVisibility]} {
54             $actor VisibilityOff
55         }
56     }
57
58     # -------------------------------------------------------------------
59     # vtkInteractorStyleImage callbacks/observers
60     #   istyle: interactor style
61     #   vtkiw: vtkTkImageRenderWindget
62
63     # StartWindowLevelEvent observer.
64     # Create the text actor, show it
65
66     proc cb_istyleimg_start_window_level_event {istyle vtkiw} {
67         ::vtk::cb_vtkiw_create_text1 $vtkiw
68         ::vtk::cb_vtkiw_show_text1 $vtkiw
69     }
70
71     # EndWindowLevelEvent observer.
72     # Hide the text actor.
73
74     proc cb_istyleimg_end_window_level_event {istyle vtkiw} {
75         ::vtk::cb_vtkiw_hide_text1 $vtkiw
76         $vtkiw Render
77     }
78
79     # WindowLevelEvent observer.
80     # Update the text actor with the current window/level values.
81
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]]
87     }
88
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
93     # compatibility).
94
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
99     }
100
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
105     }
106
107     # StartPickEvent observer.
108     # Create the text actor, show it
109
110     proc cb_istyleimg_start_pick_event {istyle vtkiw} {
111         ::vtk::cb_vtkiw_create_text1 $vtkiw
112         ::vtk::cb_vtkiw_show_text1 $vtkiw
113     }
114
115     # EndPickEvent observer.
116     # Hide the text actor.
117
118     proc cb_istyleimg_end_pick_event {istyle vtkiw} {
119         ::vtk::cb_vtkiw_hide_text1 $vtkiw
120         $vtkiw Render
121     }
122
123     # PickEvent observer.
124     # Update the text actor with the current value of the picked pixel.
125
126     proc cb_istyleimg_pick_event {istyle vtkiw} {
127
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]
134
135         # Y is flipped upside down
136
137         set height [lindex [$vtkiw configure -height] 4]
138         set y [expr $height - $y]
139
140         # Make sure point is in the whole extent of the image.
141
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} {
147            return
148         }
149
150         $input SetUpdateExtent $x $x $y $y $z $z
151         $input Update
152
153         set num_comps [$input GetNumberOfScalarComponents]
154         set str "($x, $y):"
155         for {set idx 0} {$idx < $num_comps} {incr idx} {
156             set str [format "%s %.0f" $str \
157                     [$input GetScalarComponentAsFloat $x $y $z $idx]]
158         }
159
160         set mapper [::vtk::get_widget_variable_value $vtkiw text1_mapper]
161         $mapper SetInput "$str"
162         $vtkiw Render
163     }
164
165     # -------------------------------------------------------------------
166     # Create vtkTkImageViewerWidget bindings, setup observers
167
168     proc bind_tk_imageviewer_widget {vtkiw} {
169
170         bind_tk_widget $vtkiw [[$vtkiw GetImageViewer] GetRenderWindow]
171
172         set viewer [$vtkiw GetImageViewer]
173         set iren [[$viewer GetRenderWindow] GetInteractor]
174
175         # Ask the viewer to setup an image style interactor
176
177         $viewer SetupInteractor $iren
178         set istyle [$iren GetInteractorStyle]
179
180         # Window/Level observers
181
182         ::vtk::set_widget_variable_value $istyle StartWindowLevelEventTag \
183                 [$istyle AddObserver StartWindowLevelEvent \
184                 "::vtk::cb_istyleimg_start_window_level_event $istyle $vtkiw"]
185
186         ::vtk::set_widget_variable_value $istyle WindowLevelEventTag \
187                 [$istyle AddObserver WindowLevelEvent \
188                 "::vtk::cb_istyleimg_window_level_event $istyle $vtkiw"]
189
190         ::vtk::set_widget_variable_value $istyle EndWindowLevelEventTag \
191                 [$istyle AddObserver EndWindowLevelEvent \
192                 "::vtk::cb_istyleimg_end_window_level_event $istyle $vtkiw"]
193
194         # Picking observers
195
196         ::vtk::set_widget_variable_value $istyle RightButtonPressEventTag \
197                 [$istyle AddObserver RightButtonPressEvent \
198                 "::vtk::cb_istyleimg_right_button_press_event $istyle"]
199
200         ::vtk::set_widget_variable_value $istyle RightButtonReleaseEventTag \
201                 [$istyle AddObserver RightButtonReleaseEvent \
202                 "::vtk::cb_istyleimg_right_button_release_event $istyle"]
203
204         ::vtk::set_widget_variable_value $istyle StartPickEventTag \
205                 [$istyle AddObserver StartPickEvent \
206                 "::vtk::cb_istyleimg_start_pick_event $istyle $vtkiw"]
207
208         ::vtk::set_widget_variable_value $istyle EndPickEventTag \
209                 [$istyle AddObserver EndPickEvent \
210                 "::vtk::cb_istyleimg_end_pick_event $istyle $vtkiw"]
211         
212         ::vtk::set_widget_variable_value $istyle PickEventTag \
213                 [$istyle AddObserver PickEvent \
214                 "::vtk::cb_istyleimg_pick_event $istyle $vtkiw"]
215     }
216 }
217
218 # Handle deprecated calls
219
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
223 }