vtk-ruby 5.0.4.0-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/VTK/common.rb +7 -0
- data/lib/VTK/common.rb.rule +1 -0
- data/lib/VTK/filtering.rb +7 -0
- data/lib/VTK/filtering.rb.rule +1 -0
- data/lib/VTK/genericfiltering.rb +7 -0
- data/lib/VTK/genericfiltering.rb.rule +1 -0
- data/lib/VTK/graphics.rb +7 -0
- data/lib/VTK/graphics.rb.rule +1 -0
- data/lib/VTK/gtk.rb +5 -0
- data/lib/VTK/gtk.rb.rule +1 -0
- data/lib/VTK/gtk/GtkGLExtVTKRenderWindow.rb +635 -0
- data/lib/VTK/gtk/GtkGLExtVTKRenderWindow.rb.rule +1 -0
- data/lib/VTK/gtk/GtkGLExtVTKRenderWindowInteractor.rb +355 -0
- data/lib/VTK/gtk/GtkGLExtVTKRenderWindowInteractor.rb.rule +1 -0
- data/lib/VTK/gtk/GtkVTKRenderWindow.rb +615 -0
- data/lib/VTK/gtk/GtkVTKRenderWindow.rb.rule +1 -0
- data/lib/VTK/gtk/GtkVTKRenderWindowInteractor.rb +336 -0
- data/lib/VTK/gtk/GtkVTKRenderWindowInteractor.rb.rule +1 -0
- data/lib/VTK/hybrid.rb +7 -0
- data/lib/VTK/hybrid.rb.rule +1 -0
- data/lib/VTK/imaging.rb +7 -0
- data/lib/VTK/imaging.rb.rule +1 -0
- data/lib/VTK/io.rb +7 -0
- data/lib/VTK/io.rb.rule +1 -0
- data/lib/VTK/parallel.rb +7 -0
- data/lib/VTK/parallel.rb.rule +1 -0
- data/lib/VTK/rendering.rb +7 -0
- data/lib/VTK/rendering.rb.rule +1 -0
- data/lib/VTK/tk.rb +4 -0
- data/lib/VTK/tk.rb.rule +1 -0
- data/lib/VTK/tk/vtkLoadRubyTkWidgets.rb +54 -0
- data/lib/VTK/tk/vtkLoadRubyTkWidgets.rb.rule +1 -0
- data/lib/VTK/tk/vtkTkImageViewerWidget.rb +377 -0
- data/lib/VTK/tk/vtkTkImageViewerWidget.rb.rule +1 -0
- data/lib/VTK/tk/vtkTkPhotoImage.rb +28 -0
- data/lib/VTK/tk/vtkTkPhotoImage.rb.rule +1 -0
- data/lib/VTK/tk/vtkTkRenderWidget.rb +486 -0
- data/lib/VTK/tk/vtkTkRenderWidget.rb.rule +1 -0
- data/lib/VTK/tk/vtkTkRenderWindowInteractor.rb +394 -0
- data/lib/VTK/tk/vtkTkRenderWindowInteractor.rb.rule +1 -0
- data/lib/VTK/util.rb +6 -0
- data/lib/VTK/util.rb.rule +1 -0
- data/lib/VTK/util/colors.rb +223 -0
- data/lib/VTK/util/colors.rb.rule +1 -0
- data/lib/VTK/util/misc.rb +68 -0
- data/lib/VTK/util/misc.rb.rule +1 -0
- data/lib/VTK/util/vtkConstants.rb +123 -0
- data/lib/VTK/util/vtkConstants.rb.rule +1 -0
- data/lib/VTK/util/vtkImageExportToArray.rb +96 -0
- data/lib/VTK/util/vtkImageExportToArray.rb.rule +1 -0
- data/lib/VTK/util/vtkImageImportFromArray.rb +116 -0
- data/lib/VTK/util/vtkImageImportFromArray.rb.rule +1 -0
- data/lib/VTK/volumerendering.rb +7 -0
- data/lib/VTK/volumerendering.rb.rule +1 -0
- data/lib/VTK/vtkCommon.dll +0 -0
- data/lib/VTK/vtkCommon.exp +0 -0
- data/lib/VTK/vtkCommon.lib +0 -0
- data/lib/VTK/vtkCommonRuby.dll +0 -0
- data/lib/VTK/vtkCommonRuby.exp +0 -0
- data/lib/VTK/vtkCommonRuby.lib +0 -0
- data/lib/VTK/vtkCommonRubyD.dll +0 -0
- data/lib/VTK/vtkCommonRubyD.exp +0 -0
- data/lib/VTK/vtkCommonRubyD.lib +0 -0
- data/lib/VTK/vtkDICOMParser.dll +0 -0
- data/lib/VTK/vtkDICOMParser.exp +0 -0
- data/lib/VTK/vtkDICOMParser.lib +0 -0
- data/lib/VTK/vtkFiltering.dll +0 -0
- data/lib/VTK/vtkFiltering.exp +0 -0
- data/lib/VTK/vtkFiltering.lib +0 -0
- data/lib/VTK/vtkFilteringRuby.dll +0 -0
- data/lib/VTK/vtkFilteringRuby.exp +0 -0
- data/lib/VTK/vtkFilteringRuby.lib +0 -0
- data/lib/VTK/vtkFilteringRubyD.dll +0 -0
- data/lib/VTK/vtkFilteringRubyD.exp +0 -0
- data/lib/VTK/vtkFilteringRubyD.lib +0 -0
- data/lib/VTK/vtkGenericFiltering.dll +0 -0
- data/lib/VTK/vtkGenericFiltering.exp +0 -0
- data/lib/VTK/vtkGenericFiltering.lib +0 -0
- data/lib/VTK/vtkGenericFilteringRuby.dll +0 -0
- data/lib/VTK/vtkGenericFilteringRuby.exp +0 -0
- data/lib/VTK/vtkGenericFilteringRuby.lib +0 -0
- data/lib/VTK/vtkGenericFilteringRubyD.dll +0 -0
- data/lib/VTK/vtkGenericFilteringRubyD.exp +0 -0
- data/lib/VTK/vtkGenericFilteringRubyD.lib +0 -0
- data/lib/VTK/vtkGraphics.dll +0 -0
- data/lib/VTK/vtkGraphics.exp +0 -0
- data/lib/VTK/vtkGraphics.lib +0 -0
- data/lib/VTK/vtkGraphicsRuby.dll +0 -0
- data/lib/VTK/vtkGraphicsRuby.exp +0 -0
- data/lib/VTK/vtkGraphicsRuby.lib +0 -0
- data/lib/VTK/vtkGraphicsRubyD.dll +0 -0
- data/lib/VTK/vtkGraphicsRubyD.exp +0 -0
- data/lib/VTK/vtkGraphicsRubyD.lib +0 -0
- data/lib/VTK/vtkHybrid.dll +0 -0
- data/lib/VTK/vtkHybrid.exp +0 -0
- data/lib/VTK/vtkHybrid.lib +0 -0
- data/lib/VTK/vtkHybridRuby.dll +0 -0
- data/lib/VTK/vtkHybridRuby.exp +0 -0
- data/lib/VTK/vtkHybridRuby.lib +0 -0
- data/lib/VTK/vtkHybridRubyD.dll +0 -0
- data/lib/VTK/vtkHybridRubyD.exp +0 -0
- data/lib/VTK/vtkHybridRubyD.lib +0 -0
- data/lib/VTK/vtkIO.dll +0 -0
- data/lib/VTK/vtkIO.exp +0 -0
- data/lib/VTK/vtkIO.lib +0 -0
- data/lib/VTK/vtkIORuby.dll +0 -0
- data/lib/VTK/vtkIORuby.exp +0 -0
- data/lib/VTK/vtkIORuby.lib +0 -0
- data/lib/VTK/vtkIORubyD.dll +0 -0
- data/lib/VTK/vtkIORubyD.exp +0 -0
- data/lib/VTK/vtkIORubyD.lib +0 -0
- data/lib/VTK/vtkImaging.dll +0 -0
- data/lib/VTK/vtkImaging.exp +0 -0
- data/lib/VTK/vtkImaging.lib +0 -0
- data/lib/VTK/vtkImagingRuby.dll +0 -0
- data/lib/VTK/vtkImagingRuby.exp +0 -0
- data/lib/VTK/vtkImagingRuby.lib +0 -0
- data/lib/VTK/vtkImagingRubyD.dll +0 -0
- data/lib/VTK/vtkImagingRubyD.exp +0 -0
- data/lib/VTK/vtkImagingRubyD.lib +0 -0
- data/lib/VTK/vtkNetCDF.dll +0 -0
- data/lib/VTK/vtkNetCDF.exp +0 -0
- data/lib/VTK/vtkNetCDF.lib +0 -0
- data/lib/VTK/vtkParallel.dll +0 -0
- data/lib/VTK/vtkParallel.exp +0 -0
- data/lib/VTK/vtkParallel.lib +0 -0
- data/lib/VTK/vtkParallelRuby.dll +0 -0
- data/lib/VTK/vtkParallelRuby.exp +0 -0
- data/lib/VTK/vtkParallelRuby.lib +0 -0
- data/lib/VTK/vtkParallelRubyD.dll +0 -0
- data/lib/VTK/vtkParallelRubyD.exp +0 -0
- data/lib/VTK/vtkParallelRubyD.lib +0 -0
- data/lib/VTK/vtkParseOGLExt.exe +0 -0
- data/lib/VTK/vtkRendering.dll +0 -0
- data/lib/VTK/vtkRendering.exp +0 -0
- data/lib/VTK/vtkRendering.lib +0 -0
- data/lib/VTK/vtkRenderingRuby.dll +0 -0
- data/lib/VTK/vtkRenderingRuby.exp +0 -0
- data/lib/VTK/vtkRenderingRuby.lib +0 -0
- data/lib/VTK/vtkRenderingRubyD.dll +0 -0
- data/lib/VTK/vtkRenderingRubyD.exp +0 -0
- data/lib/VTK/vtkRenderingRubyD.lib +0 -0
- data/lib/VTK/vtkVREncodeString.exe +0 -0
- data/lib/VTK/vtkVolumeRendering.dll +0 -0
- data/lib/VTK/vtkVolumeRendering.exp +0 -0
- data/lib/VTK/vtkVolumeRendering.lib +0 -0
- data/lib/VTK/vtkVolumeRenderingRuby.dll +0 -0
- data/lib/VTK/vtkVolumeRenderingRuby.exp +0 -0
- data/lib/VTK/vtkVolumeRenderingRuby.lib +0 -0
- data/lib/VTK/vtkVolumeRenderingRubyD.dll +0 -0
- data/lib/VTK/vtkVolumeRenderingRubyD.exp +0 -0
- data/lib/VTK/vtkVolumeRenderingRubyD.lib +0 -0
- data/lib/VTK/vtkWidgets.dll +0 -0
- data/lib/VTK/vtkWidgets.exp +0 -0
- data/lib/VTK/vtkWidgets.lib +0 -0
- data/lib/VTK/vtkWidgetsRuby.dll +0 -0
- data/lib/VTK/vtkWidgetsRuby.exp +0 -0
- data/lib/VTK/vtkWidgetsRuby.lib +0 -0
- data/lib/VTK/vtkWidgetsRubyD.dll +0 -0
- data/lib/VTK/vtkWidgetsRubyD.exp +0 -0
- data/lib/VTK/vtkWidgetsRubyD.lib +0 -0
- data/lib/VTK/vtkWrapRuby.exe +0 -0
- data/lib/VTK/vtkWrapRubyInit.exe +0 -0
- data/lib/VTK/vtk_dummy.rb +3 -0
- data/lib/VTK/vtkexoIIc.dll +0 -0
- data/lib/VTK/vtkexoIIc.exp +0 -0
- data/lib/VTK/vtkexoIIc.lib +0 -0
- data/lib/VTK/vtkexpat.dll +0 -0
- data/lib/VTK/vtkexpat.exp +0 -0
- data/lib/VTK/vtkexpat.lib +0 -0
- data/lib/VTK/vtkfreetype.dll +0 -0
- data/lib/VTK/vtkfreetype.exp +0 -0
- data/lib/VTK/vtkfreetype.lib +0 -0
- data/lib/VTK/vtkftgl.dll +0 -0
- data/lib/VTK/vtkftgl.exp +0 -0
- data/lib/VTK/vtkftgl.lib +0 -0
- data/lib/VTK/vtkjpeg.dll +0 -0
- data/lib/VTK/vtkjpeg.exp +0 -0
- data/lib/VTK/vtkjpeg.lib +0 -0
- data/lib/VTK/vtkpng.dll +0 -0
- data/lib/VTK/vtkpng.exp +0 -0
- data/lib/VTK/vtkpng.lib +0 -0
- data/lib/VTK/vtkruby.exe +0 -0
- data/lib/VTK/vtksys.dll +0 -0
- data/lib/VTK/vtksys.exp +0 -0
- data/lib/VTK/vtksys.lib +0 -0
- data/lib/VTK/vtksysEncodeExecutable.exe +0 -0
- data/lib/VTK/vtksysProcessFwd9x.exe +0 -0
- data/lib/VTK/vtktiff.dll +0 -0
- data/lib/VTK/vtktiff.exp +0 -0
- data/lib/VTK/vtktiff.lib +0 -0
- data/lib/VTK/vtkzlib.dll +0 -0
- data/lib/VTK/vtkzlib.exp +0 -0
- data/lib/VTK/vtkzlib.lib +0 -0
- data/lib/VTK/widgets.rb +7 -0
- data/lib/VTK/widgets.rb.rule +1 -0
- data/lib/setup.rb +104 -0
- data/lib/vtk.rb +35 -0
- data/lib/vtk_dummy.rb +3 -0
- metadata +256 -0
@@ -0,0 +1 @@
|
|
1
|
+
# generated from CMake
|
@@ -0,0 +1,377 @@
|
|
1
|
+
=begin
|
2
|
+
A vtkTkImageViewerWidget for ruby, which is based on the
|
3
|
+
vtkTkImageWindowWidget.
|
4
|
+
|
5
|
+
Specify double=1 to get a double-buffered window.
|
6
|
+
|
7
|
+
=end
|
8
|
+
|
9
|
+
require 'tk'
|
10
|
+
require 'vtk'
|
11
|
+
require 'vtk/tk/vtkLoadRubyTkWidgets'
|
12
|
+
|
13
|
+
|
14
|
+
class VtkTkImageViewerWidget < TkWindow
|
15
|
+
=begin
|
16
|
+
A vtkTkImageViewerWidget for Ruby.
|
17
|
+
|
18
|
+
Use GetImageViewer() to get the vtkImageViewer.
|
19
|
+
|
20
|
+
Create with the keyword double=1 in order to generate a
|
21
|
+
double-buffered viewer.
|
22
|
+
|
23
|
+
Create with the keyword focus_on_enter=1 to enable
|
24
|
+
focus-follows-mouse. The default is for a click-to-focus mode.
|
25
|
+
=end
|
26
|
+
TkCommandNames = ['vtkTkImageViewerWidget'.freeze].freeze
|
27
|
+
|
28
|
+
def initialize(master, kw={})
|
29
|
+
=begin
|
30
|
+
Constructor.
|
31
|
+
|
32
|
+
Keyword arguments:
|
33
|
+
|
34
|
+
iv -- Use passed image viewer instead of creating a new one.
|
35
|
+
|
36
|
+
double -- If True, generate a double-buffered viewer.
|
37
|
+
Defaults to False.
|
38
|
+
|
39
|
+
focus_on_enter -- If True, use a focus-follows-mouse mode.
|
40
|
+
Defaults to False where the widget will use a click-to-focus
|
41
|
+
mode.
|
42
|
+
=end
|
43
|
+
# load the necessary extensions into tk
|
44
|
+
vtkLoadRubyTkWidgets()
|
45
|
+
|
46
|
+
_symbolkey2str(kw)
|
47
|
+
|
48
|
+
if kw['iv']
|
49
|
+
@ImageViewer = kw['iv']
|
50
|
+
else
|
51
|
+
@ImageViewer = Vtk::ImageViewer.new
|
52
|
+
end
|
53
|
+
|
54
|
+
doubleBuffer = 0
|
55
|
+
if kw['double']
|
56
|
+
doubleBuffer = 1
|
57
|
+
kw.delete('double')
|
58
|
+
end
|
59
|
+
|
60
|
+
# check if focus should follow mouse
|
61
|
+
if kw['focus_on_enter']
|
62
|
+
@FocusOnEnter = 1
|
63
|
+
else
|
64
|
+
@FocusOnEnter = 0
|
65
|
+
end
|
66
|
+
|
67
|
+
kw['iv'] = @ImageViewer.GetAddressAsString("vtkImageViewer")
|
68
|
+
kw['widgetname'] = 'vtkTkImageViewerWidget'
|
69
|
+
super(master, kw)
|
70
|
+
|
71
|
+
if doubleBuffer
|
72
|
+
@ImageViewer.GetRenderWindow.DoubleBufferOn
|
73
|
+
end
|
74
|
+
|
75
|
+
self.BindTkImageViewer
|
76
|
+
end
|
77
|
+
|
78
|
+
def GetImageViewer
|
79
|
+
return @ImageViewer
|
80
|
+
end
|
81
|
+
|
82
|
+
def Render
|
83
|
+
@ImageViewer.Render
|
84
|
+
end
|
85
|
+
|
86
|
+
def BindTkImageViewer
|
87
|
+
imager = @ImageViewer.GetRenderer
|
88
|
+
|
89
|
+
# stuff for window level text.
|
90
|
+
mapper = Vtk::TextMapper.new
|
91
|
+
mapper.SetInput("none")
|
92
|
+
t_prop = mapper.GetTextProperty
|
93
|
+
t_prop.SetFontFamilyToTimes
|
94
|
+
t_prop.SetFontSize(18)
|
95
|
+
t_prop.BoldOn
|
96
|
+
t_prop.ShadowOn
|
97
|
+
|
98
|
+
@LevelMapper = mapper
|
99
|
+
|
100
|
+
actor = Vtk::Actor2D.new
|
101
|
+
actor.SetMapper(mapper)
|
102
|
+
actor.SetLayerNumber(1)
|
103
|
+
actor.GetPositionCoordinate.SetValue(4,22)
|
104
|
+
actor.GetProperty.SetColor(1,1,0.5)
|
105
|
+
actor.SetVisibility(0)
|
106
|
+
imager.AddActor2D(actor)
|
107
|
+
|
108
|
+
@LevelActor = actor
|
109
|
+
|
110
|
+
mapper = Vtk::TextMapper.new
|
111
|
+
mapper.SetInput("none")
|
112
|
+
t_prop = mapper.GetTextProperty
|
113
|
+
t_prop.SetFontFamilyToTimes
|
114
|
+
t_prop.SetFontSize(18)
|
115
|
+
t_prop.BoldOn
|
116
|
+
t_prop.ShadowOn
|
117
|
+
|
118
|
+
@WindowMapper = mapper
|
119
|
+
|
120
|
+
actor = Vtk::Actor2D.new
|
121
|
+
actor.SetMapper(mapper)
|
122
|
+
actor.SetLayerNumber(1)
|
123
|
+
actor.GetPositionCoordinate.SetValue(4,4)
|
124
|
+
actor.GetProperty.SetColor(1,1,0.5)
|
125
|
+
actor.SetVisibility(0)
|
126
|
+
imager.AddActor2D(actor)
|
127
|
+
|
128
|
+
@WindowActor = actor
|
129
|
+
|
130
|
+
@LastX = 0
|
131
|
+
@LastY = 0
|
132
|
+
@OldFocus = 0
|
133
|
+
@InExpose = 0
|
134
|
+
|
135
|
+
# bindings
|
136
|
+
# window level
|
137
|
+
self.bind("ButtonPress-1"){|e,s| s||s=self; s.StartWindowLevelInteraction(e.x,e.y) }
|
138
|
+
self.bind("B1-Motion"){|e,s| s||s=self; s.UpdateWindowLevelInteraction(e.x,e.y) }
|
139
|
+
self.bind("ButtonRelease-1"){|e,s| s||s=self; s.EndWindowLevelInteraction }
|
140
|
+
|
141
|
+
# Get the value
|
142
|
+
self.bind("ButtonPress-3"){|e,s| s||s=self; s.StartQueryInteraction(e.x,e.y) }
|
143
|
+
self.bind("B3-Motion"){|e,s| s||s=self; s.UpdateQueryInteraction(e.x,e.y) }
|
144
|
+
self.bind("ButtonRelease-3"){|e,s| s||s=self; s.EndQueryInteraction }
|
145
|
+
|
146
|
+
self.bind("Expose"){|e,s| s||s=self; s.ExposeTkImageViewer }
|
147
|
+
self.bind("Enter"){|e,s| s||s=self; s.EnterTkViewer }
|
148
|
+
self.bind("Leave"){|e,s| s||s=self; s.LeaveTkViewer }
|
149
|
+
self.bind("KeyPress-e"){|e,s| s||s=self; exit }
|
150
|
+
self.bind("KeyPress-r"){|e,s| s||s=self; s.ResetTkImageViewer }
|
151
|
+
end
|
152
|
+
|
153
|
+
def GetImageViewer
|
154
|
+
return @ImageViewer
|
155
|
+
end
|
156
|
+
|
157
|
+
def Render
|
158
|
+
return @ImageViewer.Render
|
159
|
+
end
|
160
|
+
|
161
|
+
def _GrabFocus
|
162
|
+
@OldFocus = self.focus
|
163
|
+
self.focus
|
164
|
+
end
|
165
|
+
|
166
|
+
def EnterTkViewer
|
167
|
+
if @FocusOnEnter
|
168
|
+
self._GrabFocus
|
169
|
+
end
|
170
|
+
return nil
|
171
|
+
end
|
172
|
+
|
173
|
+
def LeaveTkViewer
|
174
|
+
if @FocusOnEnter && @OldFocus != nil
|
175
|
+
@OldFocus.focus
|
176
|
+
end
|
177
|
+
return nil
|
178
|
+
end
|
179
|
+
|
180
|
+
def ExposeTkImageViewer
|
181
|
+
if @InExpose == 0
|
182
|
+
@InExpose = 1
|
183
|
+
self.update()
|
184
|
+
@ImageViewer.Render()
|
185
|
+
@InExpose = 0
|
186
|
+
end
|
187
|
+
return nil
|
188
|
+
end
|
189
|
+
|
190
|
+
def StartWindowLevelInteraction(x,y)
|
191
|
+
if ! @FocusOnEnter
|
192
|
+
_GrabFocus
|
193
|
+
end
|
194
|
+
viewer = @ImageViewer
|
195
|
+
@LastX = x
|
196
|
+
@LastY = y
|
197
|
+
@Window = viewer.GetColorWindow.to_f
|
198
|
+
@Level = viewer.GetColorLevel.to_f
|
199
|
+
|
200
|
+
# make the window level text visible
|
201
|
+
@LevelActor.SetVisibility(1)
|
202
|
+
@WindowActor.SetVisibility(1)
|
203
|
+
|
204
|
+
self.UpdateWindowLevelInteraction(x,y)
|
205
|
+
return nil
|
206
|
+
end
|
207
|
+
|
208
|
+
def EndWindowLevelInteraction
|
209
|
+
# make the window level text invisible
|
210
|
+
@LevelActor.SetVisibility(0)
|
211
|
+
@WindowActor.SetVisibility(0)
|
212
|
+
self.Render
|
213
|
+
end
|
214
|
+
|
215
|
+
def UpdateWindowLevelInteraction(x,y)
|
216
|
+
# compute normalized delta
|
217
|
+
dx = 4.0*(x - @LastX)/self.winfo_width*@Window
|
218
|
+
dy = 4.0*(@LastY - y)/self.winfo_height*@Level
|
219
|
+
|
220
|
+
# abs so that direction does not flip
|
221
|
+
if @Window < 0.0
|
222
|
+
dx = -dx
|
223
|
+
end
|
224
|
+
if @Level < 0.0
|
225
|
+
dy = -dy
|
226
|
+
end
|
227
|
+
|
228
|
+
# compute new window level
|
229
|
+
window = @Window + dx
|
230
|
+
if window < 0.0
|
231
|
+
level = @Level + dy
|
232
|
+
else
|
233
|
+
level = @Level - dy
|
234
|
+
end
|
235
|
+
|
236
|
+
viewer = @ImageViewer
|
237
|
+
viewer.SetColorWindow(window)
|
238
|
+
viewer.SetColorLevel(level)
|
239
|
+
|
240
|
+
@WindowMapper.SetInput("Window: %g" % window)
|
241
|
+
@LevelMapper.SetInput("Level: %g" % level)
|
242
|
+
|
243
|
+
self.Render
|
244
|
+
end
|
245
|
+
|
246
|
+
def ResetTkImageViewer
|
247
|
+
# Reset: Set window level to show all values
|
248
|
+
viewer = @ImageViewer
|
249
|
+
input = viewer.GetInput
|
250
|
+
if input == nil
|
251
|
+
return nil
|
252
|
+
end
|
253
|
+
|
254
|
+
# Get the extent in viewer
|
255
|
+
z = viewer.GetZSlice
|
256
|
+
|
257
|
+
input.SetUpdateExtent(-99999,99999,-99999,99999,z,z)
|
258
|
+
input.Update
|
259
|
+
|
260
|
+
low,high = input.GetScalarRange
|
261
|
+
|
262
|
+
viewer.SetColorWindow(high - low)
|
263
|
+
viewer.SetColorLevel((high + low) * 0.5)
|
264
|
+
|
265
|
+
self.Render
|
266
|
+
end
|
267
|
+
|
268
|
+
def StartQueryInteraction(x,y)
|
269
|
+
if ! @FocusOnEnter
|
270
|
+
_GrabFocus()
|
271
|
+
end
|
272
|
+
# Query PixleValue stuff
|
273
|
+
@WindowActor.SetVisibility(1)
|
274
|
+
self.UpdateQueryInteraction(x,y)
|
275
|
+
end
|
276
|
+
|
277
|
+
def EndQueryInteraction
|
278
|
+
@WindowActor.SetVisibility(0)
|
279
|
+
self.Render
|
280
|
+
end
|
281
|
+
|
282
|
+
def UpdateQueryInteraction(x,y)
|
283
|
+
viewer = @ImageViewer
|
284
|
+
input = viewer.GetInput
|
285
|
+
z = viewer.GetZSlice
|
286
|
+
|
287
|
+
# y is flipped upside down
|
288
|
+
y = self.winfo_height - y
|
289
|
+
|
290
|
+
# make sure point is in the whole extent of the image.
|
291
|
+
xMin,xMax,yMin,yMax,zMin,zMax = input.GetWholeExtent
|
292
|
+
if (x < xMin || x > xMax || y < yMin || y > yMax || z < zMin || z > zMax)
|
293
|
+
return nil
|
294
|
+
end
|
295
|
+
|
296
|
+
input.SetUpdateExtent(x,x,y,y,z,z)
|
297
|
+
input.Update
|
298
|
+
numComps = input.GetNumberOfScalarComponents
|
299
|
+
text = ""
|
300
|
+
for i in 0...numComps
|
301
|
+
val = input.GetScalarComponentAsDouble(x,y,z,i)
|
302
|
+
text = "#{text} #{"%.1f"%val}"
|
303
|
+
end
|
304
|
+
|
305
|
+
@WindowMapper.SetInput("(#{"%d"%x}, #{"%d"%y}): #{text}")
|
306
|
+
|
307
|
+
self.Render
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
312
|
+
#-----------------------------------------------------------------------------
|
313
|
+
# an example of how to use this widget
|
314
|
+
if $0 == __FILE__
|
315
|
+
canvas = Vtk::ImageCanvasSource2D.new
|
316
|
+
canvas.SetNumberOfScalarComponents(3)
|
317
|
+
canvas.SetScalarType(3)
|
318
|
+
canvas.SetExtent(0,511,0,511,0,0)
|
319
|
+
canvas.SetDrawColor(100,100,0)
|
320
|
+
canvas.FillBox(0,511,0,511)
|
321
|
+
canvas.SetDrawColor(200,0,200)
|
322
|
+
canvas.FillBox(32,511,100,500)
|
323
|
+
canvas.SetDrawColor(100,0,0)
|
324
|
+
canvas.FillTube(550,20,30,400,5)
|
325
|
+
canvas.SetDrawColor(255,255,255)
|
326
|
+
canvas.DrawSegment3D(10,20,0,90,510,0)
|
327
|
+
canvas.SetDrawColor(200,50,50)
|
328
|
+
canvas.DrawSegment3D(510,90,0,10,20,0)
|
329
|
+
|
330
|
+
# Check segment clipping
|
331
|
+
canvas.SetDrawColor(0,200,0)
|
332
|
+
canvas.DrawSegment(-10,30,30,-10)
|
333
|
+
canvas.DrawSegment(-10,481,30,521)
|
334
|
+
canvas.DrawSegment(481,-10,521,30)
|
335
|
+
canvas.DrawSegment(481,521,521,481)
|
336
|
+
|
337
|
+
# Check Filling a triangle
|
338
|
+
canvas.SetDrawColor(20,200,200)
|
339
|
+
canvas.FillTriangle(-100,100,190,150,40,300)
|
340
|
+
|
341
|
+
# Check drawing a circle
|
342
|
+
canvas.SetDrawColor(250,250,10)
|
343
|
+
canvas.DrawCircle(350,350,200.0)
|
344
|
+
|
345
|
+
# Check drawing a point
|
346
|
+
canvas.SetDrawColor(250,250,250)
|
347
|
+
canvas.DrawPoint(350,350)
|
348
|
+
canvas.DrawPoint(350,550)
|
349
|
+
|
350
|
+
# Test filling functionality
|
351
|
+
canvas.SetDrawColor(55,0,0)
|
352
|
+
canvas.DrawCircle(450,350,80.0)
|
353
|
+
canvas.SetDrawColor(100,255,100)
|
354
|
+
canvas.FillPixel(450,350)
|
355
|
+
|
356
|
+
# Create the GUI: two renderer widgets and a quit button
|
357
|
+
|
358
|
+
frame = TkFrame.new
|
359
|
+
|
360
|
+
widget = VtkTkImageViewerWidget.new(frame,'width'=>512,'height'=>512,'double'=>1)
|
361
|
+
viewer = widget.GetImageViewer
|
362
|
+
viewer.SetInput(canvas.GetOutput)
|
363
|
+
viewer.SetColorWindow(256)
|
364
|
+
viewer.SetColorLevel(127.5)
|
365
|
+
|
366
|
+
button = TkButton.new(frame){
|
367
|
+
text "Quit"
|
368
|
+
command { exit }
|
369
|
+
}
|
370
|
+
|
371
|
+
widget.pack('side'=>'top','padx'=>3,'pady'=>3,'fill'=>'both','expand'=>true)
|
372
|
+
frame.pack('fill'=>'both','expand'=>true)
|
373
|
+
button.pack('fill'=>'x')
|
374
|
+
|
375
|
+
frame.mainloop
|
376
|
+
|
377
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# generated from CMake
|
@@ -0,0 +1,28 @@
|
|
1
|
+
=begin
|
2
|
+
A subclass of Tkinter.PhotoImage that connects a
|
3
|
+
vtkImageData to a photo widget.
|
4
|
+
=end
|
5
|
+
|
6
|
+
require 'tk'
|
7
|
+
require 'vtk'
|
8
|
+
require 'vtk/tk/vtkLoadRubyTkWidgets'
|
9
|
+
|
10
|
+
class Vtk::TkPhotoImage < TkPhotoImage
|
11
|
+
=begin
|
12
|
+
A subclass of PhotoImage with helper functions
|
13
|
+
A subend
|
14
|
+
for displaying vtkImageData
|
15
|
+
=end
|
16
|
+
def initialize( kw={} )
|
17
|
+
# Caller the superclass
|
18
|
+
super( kw )
|
19
|
+
Vtk.LoadRubyTkWidgets
|
20
|
+
end
|
21
|
+
def PutImageSlice ( image, z, options={} )
|
22
|
+
default_options = { 'orientation'=>'transverse', 'window'=>256, 'level'=>128 }
|
23
|
+
default_options.update( options )
|
24
|
+
options = default_options
|
25
|
+
t = "_"+image.GetAddressAsString('vtkImageData')[5..-1]+"_"+image.GetClassName
|
26
|
+
Tk.tk_call("vtkImageDataToTkPhoto", t, @path, "%d"%z, options['orientation'], "%d"%options['window'], "%d"%options['level'])
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# generated from CMake
|
@@ -0,0 +1,486 @@
|
|
1
|
+
=begin
|
2
|
+
A simple vtkTkRenderWidget for Tk.
|
3
|
+
|
4
|
+
|
5
|
+
A few important notes:
|
6
|
+
|
7
|
+
This class is meant to be used as a base-class widget for
|
8
|
+
doing VTK rendering in Ruby
|
9
|
+
|
10
|
+
In VTK (and C++) there is a very important distinction between
|
11
|
+
public ivars (attributes in rubyspeak), protected ivars, &&
|
12
|
+
private ivars. When you write a ruby class that you want
|
13
|
+
to 'look && feel' like a VTK class, you should follow these rules.
|
14
|
+
|
15
|
+
1) Attributes should never be public. Attributes should always be
|
16
|
+
either protected (prefixed with a single underscore) || private
|
17
|
+
(prefixed with a double underscore). You can provide access to
|
18
|
+
attributes through public Set/Get methods (same as VTK).
|
19
|
+
|
20
|
+
2) Use a single underscore to denote a protected attribute, e.g.
|
21
|
+
@RenderWindow is protected (can be accessed from this
|
22
|
+
class || a derived class).
|
23
|
+
|
24
|
+
3) Use a double underscore to denote a private attribute, e.g.
|
25
|
+
@InExpose can not be accessed outside of this class.
|
26
|
+
|
27
|
+
All attributes should be 'declared' in the __init__ function
|
28
|
+
i.e. set to some initial value. Don't forget that 'nil' means
|
29
|
+
'NULL' - the ruby/vtk wrappers guarantee their equivalence.
|
30
|
+
=end
|
31
|
+
|
32
|
+
require 'tk'
|
33
|
+
require 'vtk'
|
34
|
+
require 'vtk/tk/vtkLoadRubyTkWidgets'
|
35
|
+
|
36
|
+
|
37
|
+
class Vtk::TkRenderWidget < TkWindow
|
38
|
+
=begin
|
39
|
+
A vtkTkRenderWidget for Ruby
|
40
|
+
|
41
|
+
Use GetRenderWindow to get the vtkRenderWindow.
|
42
|
+
|
43
|
+
Create with the keyword stereo=1 in order to generate a
|
44
|
+
stereo-capable window.
|
45
|
+
|
46
|
+
Create with the keyword focus_on_enter=1 to enable
|
47
|
+
focus-follows-mouse. The default is for a click-to-focus mode.
|
48
|
+
=end
|
49
|
+
TkCommandNames = ['vtkTkRenderWidget'.freeze].freeze
|
50
|
+
|
51
|
+
def initialize( master, kw={} )
|
52
|
+
=begin
|
53
|
+
Constructor.
|
54
|
+
|
55
|
+
Keyword arguments:
|
56
|
+
|
57
|
+
rw -- Use passed render window instead of creating a new one.
|
58
|
+
|
59
|
+
stereo -- If True, generate a stereo-capable window.
|
60
|
+
Defaults to False.
|
61
|
+
|
62
|
+
focus_on_enter -- If True, use a focus-follows-mouse mode.
|
63
|
+
Defaults to False where the widget will use a click-to-focus
|
64
|
+
mode.
|
65
|
+
=end
|
66
|
+
# load the necessary extensions into tk
|
67
|
+
Vtk.LoadRubyTkWidgets
|
68
|
+
|
69
|
+
_symbolkey2str(kw)
|
70
|
+
|
71
|
+
if kw['rw']
|
72
|
+
renderWindow = kw['rw']
|
73
|
+
else
|
74
|
+
renderWindow = Vtk::RenderWindow.new
|
75
|
+
end
|
76
|
+
|
77
|
+
if kw['stereo']
|
78
|
+
renderWindow.StereoCapableWindowOn
|
79
|
+
kw.delete('stereo')
|
80
|
+
end
|
81
|
+
|
82
|
+
# check if focus should follow mouse
|
83
|
+
if kw['focus_on_enter']
|
84
|
+
@FocusOnEnter = true
|
85
|
+
kw.delete('focus_on_enter')
|
86
|
+
else
|
87
|
+
@FocusOnEnter = false
|
88
|
+
end
|
89
|
+
|
90
|
+
kw['rw'] = renderWindow.GetAddressAsString("vtkRenderWindow")
|
91
|
+
kw['widgetname'] = 'vtkTkRenderWidget'
|
92
|
+
super(master, kw)
|
93
|
+
renderWindow.UnRegister(nil)
|
94
|
+
|
95
|
+
@CurrentRenderer = nil
|
96
|
+
@CurrentCamera = nil
|
97
|
+
@CurrentZoom = 1.0
|
98
|
+
@CurrentLight = nil
|
99
|
+
|
100
|
+
@ViewportCenterX = 0
|
101
|
+
@ViewportCenterY = 0
|
102
|
+
|
103
|
+
@Picker = Vtk::CellPicker.new
|
104
|
+
@PickedAssembly = nil
|
105
|
+
@PickedProperty = Vtk::Property.new
|
106
|
+
@PickedProperty.SetColor(1,0,0)
|
107
|
+
@PrePickedProperty = nil
|
108
|
+
|
109
|
+
@OldFocus = nil
|
110
|
+
|
111
|
+
# used by the LOD actors
|
112
|
+
@DesiredUpdateRate = 15
|
113
|
+
@StillUpdateRate = 0.0001
|
114
|
+
|
115
|
+
# these record the previous mouse position
|
116
|
+
@LastX = 0
|
117
|
+
@LastY = 0
|
118
|
+
|
119
|
+
# private attributes
|
120
|
+
@InExpose = false
|
121
|
+
|
122
|
+
# create the Tk bindings
|
123
|
+
self.BindTkRenderWidget
|
124
|
+
end
|
125
|
+
|
126
|
+
def BindTkRenderWidget
|
127
|
+
=begin
|
128
|
+
Bind some default actions.
|
129
|
+
=end
|
130
|
+
self.bind("ButtonPress"){|e,s| s||s=self; s.StartMotion(e.x,e.y) }
|
131
|
+
self.bind("ButtonRelease"){|e,s| s||s=self; s.EndMotion(e.x,e.y) }
|
132
|
+
self.bind("B1-Motion"){|e,s| s||s=self; s.Rotate(e.x,e.y) }
|
133
|
+
self.bind("B2-Motion"){|e,s| s||s=self; s.Pan(e.x,e.y) }
|
134
|
+
self.bind("B3-Motion"){|e,s| s||s=self; s.Zoom(e.x,e.y) }
|
135
|
+
self.bind("Shift-B1-Motion"){|e,s| s||s=self; s.Pan(e.x,e.y) }
|
136
|
+
self.bind("KeyPress-r"){|e,s| s||s=self; s.Reset(e.x,e.y) }
|
137
|
+
self.bind("KeyPress-u"){|e,s| s||s=self; s.deiconify }
|
138
|
+
self.bind("KeyPress-w"){|e,s| s||s=self; s.Wireframe }
|
139
|
+
self.bind("KeyPress-s"){|e,s| s||s=self; s.Surface }
|
140
|
+
self.bind("KeyPress-p"){|e,s| s||s=self; s.PickActor(e.x,e.y) }
|
141
|
+
if @FocusOnEnter
|
142
|
+
self.bind("Enter"){|e,s| s||s=self; s.Enter(e.x,e.y) }
|
143
|
+
self.bind("Leave"){|e,s| s||s=self; s.Leave(e.x,e.y) }
|
144
|
+
else
|
145
|
+
self.bind("ButtonPress"){|e,s| s||s=self; s.Enter(e.x,e.y) }
|
146
|
+
self.bind("Expose"){|e,s| s||s=self; s.Expose }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def GetZoomFactor
|
151
|
+
return @CurrentZoom
|
152
|
+
end
|
153
|
+
|
154
|
+
def SetDesiredUpdateRate(rate)
|
155
|
+
=begin
|
156
|
+
Mirrors the method with the same name in
|
157
|
+
vtkRenderWindowInteractor.
|
158
|
+
=end
|
159
|
+
@DesiredUpdateRate = rate
|
160
|
+
end
|
161
|
+
|
162
|
+
def GetDesiredUpdateRate
|
163
|
+
=begin
|
164
|
+
Mirrors the method with the same name in
|
165
|
+
vtkRenderWindowInteractor.
|
166
|
+
=end
|
167
|
+
return @DesiredUpdateRate
|
168
|
+
end
|
169
|
+
|
170
|
+
def SetStillUpdateRate(rate)
|
171
|
+
=begin
|
172
|
+
Mirrors the method with the same name in
|
173
|
+
vtkRenderWindowInteractor.
|
174
|
+
=end
|
175
|
+
@StillUpdateRate = rate
|
176
|
+
end
|
177
|
+
|
178
|
+
def GetStillUpdateRate
|
179
|
+
=begin
|
180
|
+
Mirrors the method with the same name in
|
181
|
+
vtkRenderWindowInteractor.
|
182
|
+
=end
|
183
|
+
return @StillUpdateRate
|
184
|
+
end
|
185
|
+
|
186
|
+
def GetRenderWindow
|
187
|
+
addr = Tk.tk_call(self, 'GetRenderWindow')[5..-1]
|
188
|
+
renderWindow = Vtk::RenderWindow.new('_%s_vtkRenderWindow_p' % addr)
|
189
|
+
renderWindow.UnRegister(nil)
|
190
|
+
return renderWindow
|
191
|
+
end
|
192
|
+
|
193
|
+
def GetPicker
|
194
|
+
return @Picker
|
195
|
+
end
|
196
|
+
|
197
|
+
def Expose
|
198
|
+
if ! @InExpose
|
199
|
+
@InExpose = true
|
200
|
+
self.update
|
201
|
+
self.GetRenderWindow.Render
|
202
|
+
@InExpose = false
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def Render
|
207
|
+
if (@CurrentLight)
|
208
|
+
light = @CurrentLight
|
209
|
+
light.SetPosition(@CurrentCamera.GetPosition)
|
210
|
+
light.SetFocalPoint(@CurrentCamera.GetFocalPoint)
|
211
|
+
end
|
212
|
+
|
213
|
+
self.GetRenderWindow.Render
|
214
|
+
end
|
215
|
+
|
216
|
+
def UpdateRenderer(x,y)
|
217
|
+
=begin
|
218
|
+
UpdateRenderer will identify the renderer under the mouse && set
|
219
|
+
up _CurrentRenderer, _CurrentCamera, && _CurrentLight.
|
220
|
+
=end
|
221
|
+
windowX = self.winfo_width
|
222
|
+
windowY = self.winfo_height
|
223
|
+
|
224
|
+
renderers = self.GetRenderWindow.GetRenderers
|
225
|
+
numRenderers = renderers.GetNumberOfItems
|
226
|
+
|
227
|
+
@CurrentRenderer = nil
|
228
|
+
renderers.InitTraversal
|
229
|
+
for i in 0...numRenderers
|
230
|
+
renderer = renderers.GetNextItem
|
231
|
+
vx,vy = [0,0]
|
232
|
+
if (windowX > 1)
|
233
|
+
vx = x.to_f/(windowX-1)
|
234
|
+
end
|
235
|
+
if (windowY > 1)
|
236
|
+
vy = (windowY-y.to_f-1)/(windowY-1)
|
237
|
+
end
|
238
|
+
vpxmin,vpymin,vpxmax,vpymax = renderer.GetViewport
|
239
|
+
|
240
|
+
if (vx >= vpxmin && vx <= vpxmax && vy >= vpymin && vy <= vpymax)
|
241
|
+
@CurrentRenderer = renderer
|
242
|
+
@ViewportCenterX = windowX.to_f*(vpxmax-vpxmin)/2.0 +vpxmin
|
243
|
+
@ViewportCenterY = windowY.to_f*(vpymax-vpymin)/2.0 +vpymin
|
244
|
+
@CurrentCamera = @CurrentRenderer.GetActiveCamera
|
245
|
+
lights = @CurrentRenderer.GetLights
|
246
|
+
lights.InitTraversal
|
247
|
+
@CurrentLight = lights.GetNextItem
|
248
|
+
break
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
@LastX = x
|
253
|
+
@LastY = y
|
254
|
+
end
|
255
|
+
|
256
|
+
def GetCurrentRenderer
|
257
|
+
return @CurrentRenderer
|
258
|
+
end
|
259
|
+
|
260
|
+
def Enter(x,y)
|
261
|
+
@OldFocus = self.focus
|
262
|
+
self.focus
|
263
|
+
self.StartMotion(x, y)
|
264
|
+
end
|
265
|
+
|
266
|
+
def Leave(x,y)
|
267
|
+
if (@OldFocus != nil)
|
268
|
+
@OldFocus.focus
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def StartMotion(x,y)
|
273
|
+
self.GetRenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
|
274
|
+
self.UpdateRenderer(x,y)
|
275
|
+
end
|
276
|
+
|
277
|
+
def EndMotion(x,y)
|
278
|
+
self.GetRenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
|
279
|
+
if @CurrentRenderer
|
280
|
+
self.Render
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def Rotate(x,y)
|
285
|
+
if @CurrentRenderer
|
286
|
+
|
287
|
+
@CurrentCamera.Azimuth(@LastX - x)
|
288
|
+
@CurrentCamera.Elevation(y - @LastY)
|
289
|
+
@CurrentCamera.OrthogonalizeViewUp
|
290
|
+
|
291
|
+
@LastX = x
|
292
|
+
@LastY = y
|
293
|
+
|
294
|
+
@CurrentRenderer.ResetCameraClippingRange
|
295
|
+
self.Render
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
def Pan(x,y)
|
300
|
+
if @CurrentRenderer
|
301
|
+
|
302
|
+
renderer = @CurrentRenderer
|
303
|
+
camera = @CurrentCamera
|
304
|
+
pPoint0,pPoint1,pPoint2 = camera.GetPosition
|
305
|
+
fPoint0,fPoint1,fPoint2 = camera.GetFocalPoint
|
306
|
+
|
307
|
+
if (camera.GetParallelProjection)
|
308
|
+
renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
|
309
|
+
renderer.WorldToDisplay
|
310
|
+
fx,fy,fz = renderer.GetDisplayPoint
|
311
|
+
renderer.SetDisplayPoint(fx-x+@LastX,
|
312
|
+
fy+y-@LastY,
|
313
|
+
fz)
|
314
|
+
renderer.DisplayToWorld
|
315
|
+
fx,fy,fz,fw = renderer.GetWorldPoint
|
316
|
+
camera.SetFocalPoint(fx,fy,fz)
|
317
|
+
|
318
|
+
renderer.SetWorldPoint(pPoint0,pPoint1,pPoint2,1.0)
|
319
|
+
renderer.WorldToDisplay
|
320
|
+
fx,fy,fz = renderer.GetDisplayPoint
|
321
|
+
renderer.SetDisplayPoint(fx-x+@LastX,
|
322
|
+
fy+y-@LastY,
|
323
|
+
fz)
|
324
|
+
renderer.DisplayToWorld
|
325
|
+
fx,fy,fz,fw = renderer.GetWorldPoint
|
326
|
+
camera.SetPosition(fx,fy,fz)
|
327
|
+
|
328
|
+
else
|
329
|
+
(fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
|
330
|
+
# Specify a point location in world coordinates
|
331
|
+
renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
|
332
|
+
renderer.WorldToDisplay
|
333
|
+
# Convert world point coordinates to display coordinates
|
334
|
+
dPoint = renderer.GetDisplayPoint
|
335
|
+
focalDepth = dPoint[2]
|
336
|
+
|
337
|
+
aPoint0 = @ViewportCenterX + (x - @LastX)
|
338
|
+
aPoint1 = @ViewportCenterY - (y - @LastY)
|
339
|
+
|
340
|
+
renderer.SetDisplayPoint(aPoint0,aPoint1,focalDepth)
|
341
|
+
renderer.DisplayToWorld
|
342
|
+
|
343
|
+
(rPoint0,rPoint1,rPoint2,rPoint3) = renderer.GetWorldPoint
|
344
|
+
if (rPoint3 != 0.0)
|
345
|
+
rPoint0 = rPoint0/rPoint3
|
346
|
+
rPoint1 = rPoint1/rPoint3
|
347
|
+
rPoint2 = rPoint2/rPoint3
|
348
|
+
end
|
349
|
+
|
350
|
+
camera.SetFocalPoint((fPoint0 - rPoint0) + fPoint0,
|
351
|
+
(fPoint1 - rPoint1) + fPoint1,
|
352
|
+
(fPoint2 - rPoint2) + fPoint2)
|
353
|
+
|
354
|
+
camera.SetPosition((fPoint0 - rPoint0) + pPoint0,
|
355
|
+
(fPoint1 - rPoint1) + pPoint1,
|
356
|
+
(fPoint2 - rPoint2) + pPoint2)
|
357
|
+
end
|
358
|
+
|
359
|
+
@LastX = x
|
360
|
+
@LastY = y
|
361
|
+
|
362
|
+
self.Render
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
def Zoom(x,y)
|
367
|
+
if @CurrentRenderer
|
368
|
+
|
369
|
+
renderer = @CurrentRenderer
|
370
|
+
camera = @CurrentCamera
|
371
|
+
|
372
|
+
zoomFactor = 1.02**(0.5*(@LastY - y))
|
373
|
+
@CurrentZoom = @CurrentZoom * zoomFactor
|
374
|
+
|
375
|
+
if camera.GetParallelProjection != 0
|
376
|
+
parallelScale = camera.GetParallelScale/zoomFactor
|
377
|
+
camera.SetParallelScale(parallelScale)
|
378
|
+
else
|
379
|
+
camera.Dolly(zoomFactor)
|
380
|
+
renderer.ResetCameraClippingRange
|
381
|
+
end
|
382
|
+
|
383
|
+
@LastX = x
|
384
|
+
@LastY = y
|
385
|
+
|
386
|
+
self.Render
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
def Reset(x,y)
|
391
|
+
if @CurrentRenderer
|
392
|
+
@CurrentRenderer.ResetCamera
|
393
|
+
end
|
394
|
+
|
395
|
+
self.Render
|
396
|
+
end
|
397
|
+
|
398
|
+
def Wireframe
|
399
|
+
actors = @CurrentRenderer.GetActors
|
400
|
+
numActors = actors.GetNumberOfItems
|
401
|
+
actors.InitTraversal
|
402
|
+
for i in 0...numActors
|
403
|
+
actor = actors.GetNextItem
|
404
|
+
actor.GetProperty.SetRepresentationToWireframe
|
405
|
+
end
|
406
|
+
|
407
|
+
self.Render
|
408
|
+
end
|
409
|
+
|
410
|
+
def Surface
|
411
|
+
actors = @CurrentRenderer.GetActors
|
412
|
+
numActors = actors.GetNumberOfItems
|
413
|
+
actors.InitTraversal
|
414
|
+
for i in 0...numActors
|
415
|
+
actor = actors.GetNextItem
|
416
|
+
actor.GetProperty.SetRepresentationToSurface
|
417
|
+
end
|
418
|
+
|
419
|
+
self.Render
|
420
|
+
end
|
421
|
+
|
422
|
+
def PickActor(x,y)
|
423
|
+
if @CurrentRenderer
|
424
|
+
|
425
|
+
renderer = @CurrentRenderer
|
426
|
+
picker = @Picker
|
427
|
+
windowY = self.winfo_height
|
428
|
+
picker.Pick(x,(windowY - y - 1),0.0,renderer)
|
429
|
+
assembly = picker.GetAssembly
|
430
|
+
|
431
|
+
if (@PickedAssembly != nil && @PrePickedProperty != nil)
|
432
|
+
@PickedAssembly.SetProperty(@PrePickedProperty)
|
433
|
+
# release hold of the property
|
434
|
+
@PrePickedProperty.UnRegister(@PrePickedProperty)
|
435
|
+
@PrePickedProperty = nil
|
436
|
+
end
|
437
|
+
|
438
|
+
if (assembly != nil)
|
439
|
+
@PickedAssembly = assembly
|
440
|
+
@PrePickedProperty = @PickedAssembly.GetProperty
|
441
|
+
# hold onto the property
|
442
|
+
@PrePickedProperty.Register(@PrePickedProperty)
|
443
|
+
@PickedAssembly.SetProperty(@PickedProperty)
|
444
|
+
end
|
445
|
+
|
446
|
+
self.Render
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
end
|
451
|
+
|
452
|
+
#----------------------------------------------------------------------------
|
453
|
+
def vtkRenderWidgetConeExample
|
454
|
+
=begin
|
455
|
+
Like it says, just a simple example
|
456
|
+
=end
|
457
|
+
# create root window
|
458
|
+
root = TkRoot.new
|
459
|
+
|
460
|
+
# create vtkTkRenderWidget
|
461
|
+
pane = Vtk::TkRenderWidget.new(root,'width'=>300,'height'=>300)
|
462
|
+
|
463
|
+
ren = Vtk::Renderer.new
|
464
|
+
pane.GetRenderWindow.AddRenderer(ren)
|
465
|
+
|
466
|
+
cone = Vtk::ConeSource.new
|
467
|
+
cone.SetResolution(8)
|
468
|
+
|
469
|
+
coneMapper = Vtk::PolyDataMapper.new
|
470
|
+
coneMapper.SetInput(cone.GetOutput)
|
471
|
+
|
472
|
+
coneActor = Vtk::Actor.new
|
473
|
+
coneActor.SetMapper(coneMapper)
|
474
|
+
|
475
|
+
ren.AddActor(coneActor)
|
476
|
+
|
477
|
+
# pack the pane into the tk root
|
478
|
+
pane.pack
|
479
|
+
|
480
|
+
# start the tk mainloop
|
481
|
+
Tk.mainloop
|
482
|
+
end
|
483
|
+
|
484
|
+
if $0 == __FILE__
|
485
|
+
vtkRenderWidgetConeExample
|
486
|
+
end
|