vtk-ruby 5.0.4.0-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- 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,355 @@
|
|
1
|
+
=begin
|
2
|
+
Description:
|
3
|
+
|
4
|
+
Provides a Gtk vtkRenderWindowInteractor widget. This embeds a
|
5
|
+
vtkRenderWindow inside a GTK widget && uses the
|
6
|
+
vtkGenericRenderWindowInteractor for the event handling. This is
|
7
|
+
vtkGenericRenderWindowInteractor end
|
8
|
+
similar to GtkVTKRenderWindowInteractor.rb.
|
9
|
+
|
10
|
+
The extensions here allow the use of gtkglext rather than gtkgl &&
|
11
|
+
ruby-gtk2 rather than ruby-gtk. It requires ruby-gtk2.0.0 || later.
|
12
|
+
|
13
|
+
There is a working example at the bottom.
|
14
|
+
|
15
|
+
Credits:
|
16
|
+
|
17
|
+
License:
|
18
|
+
|
19
|
+
VTK license.
|
20
|
+
|
21
|
+
=end
|
22
|
+
|
23
|
+
require 'rbconfig'
|
24
|
+
require 'gtk2'
|
25
|
+
require 'gtkglext'
|
26
|
+
require 'vtk'
|
27
|
+
|
28
|
+
class GtkGLExtVTKRenderWindowInteractor < Gtk::DrawingArea
|
29
|
+
=begin
|
30
|
+
Embeds a vtkRenderWindow into a pyGTK widget && uses
|
31
|
+
vtkGenericRenderWindowInteractor for the event handling. This
|
32
|
+
class embeds the RenderWindow correctly. A __getattr__ hook is
|
33
|
+
provided that makes the class behave like a
|
34
|
+
vtkGenericRenderWindowInteractor.
|
35
|
+
=end
|
36
|
+
def initialize
|
37
|
+
super
|
38
|
+
|
39
|
+
glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB|
|
40
|
+
Gdk::GLConfig::MODE_DEPTH)
|
41
|
+
|
42
|
+
set_gl_capability(glconfig)
|
43
|
+
|
44
|
+
@RenderWindow = Vtk::RenderWindow.new
|
45
|
+
|
46
|
+
# private attributes
|
47
|
+
@Created = false
|
48
|
+
@ActiveButton = nil
|
49
|
+
|
50
|
+
@Iren = Vtk::GenericRenderWindowInteractor.new
|
51
|
+
@Iren.SetRenderWindow(@RenderWindow)
|
52
|
+
@Iren.GetInteractorStyle.SetCurrentStyleToTrackballCamera
|
53
|
+
|
54
|
+
createTimer = Proc.new{|obj, event|
|
55
|
+
gtk.timeout_add(10, Proc.new{ @Iren.TimerEvent })
|
56
|
+
}
|
57
|
+
|
58
|
+
destroyTimer = Proc.new{|obj, event|
|
59
|
+
=begin
|
60
|
+
The timer is a one shot timer so will expire automatically.
|
61
|
+
=end
|
62
|
+
return 1
|
63
|
+
}
|
64
|
+
|
65
|
+
@Iren.AddObserver('CreateTimerEvent', createTimer)
|
66
|
+
@Iren.AddObserver('DestroyTimerEvent', destroyTimer)
|
67
|
+
self.ConnectSignals
|
68
|
+
|
69
|
+
# need this to be able to handle key_press events.
|
70
|
+
self.set_flags(Gtk::Window::CAN_FOCUS)
|
71
|
+
end
|
72
|
+
|
73
|
+
def set_size_request(w, h)
|
74
|
+
super(w,h)
|
75
|
+
@RenderWindow.SetSize(w, h)
|
76
|
+
@Iren.SetSize(w, h)
|
77
|
+
@Iren.ConfigureEvent
|
78
|
+
end
|
79
|
+
|
80
|
+
def ConnectSignals
|
81
|
+
self.signal_connect("realize"){|wid,event| OnRealize(wid,event) }
|
82
|
+
self.signal_connect("expose_event"){|wid,event| OnExpose(wid,event) }
|
83
|
+
self.signal_connect("configure_event"){|wid,event| OnConfigure(wid,event) }
|
84
|
+
self.signal_connect("button_press_event"){|wid,event| OnButtonDown(wid,event) }
|
85
|
+
self.signal_connect("button_release_event"){|wid,event| OnButtonUp(wid,event) }
|
86
|
+
self.signal_connect("motion_notify_event"){|wid,event| OnMouseMove(wid,event) }
|
87
|
+
self.signal_connect("enter_notify_event"){|wid,event| OnEnter(wid,event) }
|
88
|
+
self.signal_connect("leave_notify_event"){|wid,event| OnLeave(wid,event) }
|
89
|
+
self.signal_connect("key_press_event"){|wid,event| OnKeyPress(wid,event) }
|
90
|
+
self.signal_connect("delete_event"){|wid,event| OnDestroy(wid,event) }
|
91
|
+
self.add_events(Gdk::Event::EXPOSURE_MASK |
|
92
|
+
Gdk::Event::BUTTON_PRESS_MASK |
|
93
|
+
Gdk::Event::BUTTON_RELEASE_MASK |
|
94
|
+
Gdk::Event::KEY_PRESS_MASK |
|
95
|
+
Gdk::Event::POINTER_MOTION_MASK |
|
96
|
+
Gdk::Event::POINTER_MOTION_HINT_MASK |
|
97
|
+
Gdk::Event::ENTER_NOTIFY_MASK |
|
98
|
+
Gdk::Event::LEAVE_NOTIFY_MASK)
|
99
|
+
end
|
100
|
+
|
101
|
+
def GetRenderWindow
|
102
|
+
return @RenderWindow
|
103
|
+
end
|
104
|
+
|
105
|
+
def Render
|
106
|
+
if @Created
|
107
|
+
@RenderWindow.Render
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def OnRealize(wid, event)
|
112
|
+
unless @Created
|
113
|
+
# you can't get the xid without the window being realized.
|
114
|
+
self.realize
|
115
|
+
if Config::CONFIG["host_os"] =~ /win32/
|
116
|
+
win_id = self.window.handle.to_s
|
117
|
+
else
|
118
|
+
win_id =self.window.xid.to_s
|
119
|
+
end
|
120
|
+
|
121
|
+
@RenderWindow.SetWindowInfo(win_id)
|
122
|
+
# @Iren.Initialize
|
123
|
+
@Created = true
|
124
|
+
end
|
125
|
+
return true
|
126
|
+
end
|
127
|
+
|
128
|
+
def OnConfigure(widget, event)
|
129
|
+
# self.widget=widget
|
130
|
+
@Iren.SetSize(event.width, event.height)
|
131
|
+
@Iren.ConfigureEvent
|
132
|
+
self.Render
|
133
|
+
return true
|
134
|
+
end
|
135
|
+
|
136
|
+
def OnExpose(wid, event)
|
137
|
+
self.Render
|
138
|
+
return true
|
139
|
+
end
|
140
|
+
|
141
|
+
def OnDestroy(wid, event=nil)
|
142
|
+
self.hide
|
143
|
+
@RenderWindow = nil
|
144
|
+
self.destroy
|
145
|
+
return true
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
def _GetCtrlShift(event)
|
150
|
+
ctrl, shift = 0, 0
|
151
|
+
if ((event.state & Gdk::Window::ModifierType::CONTROL_MASK) == Gdk::Window::ModifierType::CONTROL_MASK)
|
152
|
+
ctrl = 1
|
153
|
+
end
|
154
|
+
if ((event.state & Gdk::Window::ModifierType::SHIFT_MASK) == Gdk::Window::ModifierType::SHIFT_MASK)
|
155
|
+
shift = 1
|
156
|
+
end
|
157
|
+
return ctrl, shift
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
public
|
162
|
+
def OnButtonDown(wid, event)
|
163
|
+
=begin
|
164
|
+
Mouse button pressed.
|
165
|
+
=end
|
166
|
+
m = self.pointer
|
167
|
+
ctrl, shift = _GetCtrlShift(event)
|
168
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
|
169
|
+
button = event.button
|
170
|
+
if button == 3
|
171
|
+
@Iren.RightButtonPressEvent
|
172
|
+
return true
|
173
|
+
elsif button == 1
|
174
|
+
@Iren.LeftButtonPressEvent
|
175
|
+
return true
|
176
|
+
elsif button == 2
|
177
|
+
@Iren.MiddleButtonPressEvent
|
178
|
+
return true
|
179
|
+
else
|
180
|
+
return ralse
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def OnButtonUp(wid, event)
|
185
|
+
=begin
|
186
|
+
Mouse button released.
|
187
|
+
=end
|
188
|
+
m = self.pointer
|
189
|
+
ctrl, shift = _GetCtrlShift(event)
|
190
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
|
191
|
+
button = event.button
|
192
|
+
if button == 3
|
193
|
+
@Iren.RightButtonReleaseEvent
|
194
|
+
return true
|
195
|
+
elsif button == 1
|
196
|
+
@Iren.LeftButtonReleaseEvent
|
197
|
+
return true
|
198
|
+
elsif button == 2
|
199
|
+
@Iren.MiddleButtonReleaseEvent
|
200
|
+
return true
|
201
|
+
end
|
202
|
+
|
203
|
+
return false
|
204
|
+
end
|
205
|
+
|
206
|
+
def OnMouseMove(wid, event)
|
207
|
+
=begin
|
208
|
+
Mouse has moved.
|
209
|
+
=end
|
210
|
+
m = self.pointer
|
211
|
+
ctrl, shift = _GetCtrlShift(event)
|
212
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
|
213
|
+
@Iren.MouseMoveEvent
|
214
|
+
return true
|
215
|
+
end
|
216
|
+
|
217
|
+
def OnEnter(wid, event)
|
218
|
+
=begin
|
219
|
+
Entering the vtkRenderWindow.
|
220
|
+
=end
|
221
|
+
self.grab_focus
|
222
|
+
m = self.pointer
|
223
|
+
ctrl, shift = _GetCtrlShift(event)
|
224
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
|
225
|
+
@Iren.EnterEvent
|
226
|
+
return true
|
227
|
+
end
|
228
|
+
|
229
|
+
def OnLeave(wid, event)
|
230
|
+
=begin
|
231
|
+
Leaving the vtkRenderWindow.
|
232
|
+
=end
|
233
|
+
m = self.pointer
|
234
|
+
ctrl, shift = _GetCtrlShift(event)
|
235
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, 0.chr, 0, nil)
|
236
|
+
@Iren.LeaveEvent
|
237
|
+
return true
|
238
|
+
end
|
239
|
+
|
240
|
+
def OnKeyPress(wid, event)
|
241
|
+
=begin
|
242
|
+
Key pressed.
|
243
|
+
=end
|
244
|
+
m = self.pointer
|
245
|
+
ctrl, shift = _GetCtrlShift(event)
|
246
|
+
# keycode, keysym = event.keyval, event.string
|
247
|
+
keycode, keysym = event.keyval, nil
|
248
|
+
key = 0.chr
|
249
|
+
if keycode < 256
|
250
|
+
key = keycode.chr
|
251
|
+
end
|
252
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, key, 0, keysym)
|
253
|
+
@Iren.KeyPressEvent
|
254
|
+
@Iren.CharEvent
|
255
|
+
return true
|
256
|
+
end
|
257
|
+
|
258
|
+
def OnKeyRelease(wid, event)
|
259
|
+
=begin
|
260
|
+
Key released.
|
261
|
+
=end
|
262
|
+
m = self.pointer
|
263
|
+
ctrl, shift = _GetCtrlShift(event)
|
264
|
+
# keycode, keysym = event.keyval, event.string
|
265
|
+
keycode, keysym = event.keyval, nil
|
266
|
+
key = 0.chr
|
267
|
+
if keycode < 256
|
268
|
+
key = keycode.chr
|
269
|
+
end
|
270
|
+
@Iren.SetEventInformationFlipY(m[0], m[1], ctrl, shift, key, 0, keysym)
|
271
|
+
@Iren.KeyReleaseEvent
|
272
|
+
return true
|
273
|
+
end
|
274
|
+
|
275
|
+
def Initialize
|
276
|
+
if @Created
|
277
|
+
@Iren.Initialize
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def Start
|
282
|
+
if @Created
|
283
|
+
@Iren.Start
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def SetPicker(picker)
|
288
|
+
@Iren.SetPicker(picker)
|
289
|
+
end
|
290
|
+
|
291
|
+
def GetPicker(picker)
|
292
|
+
return @Iren.GetPicker
|
293
|
+
end
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
def main
|
298
|
+
|
299
|
+
Gtk.init
|
300
|
+
Gtk::GL.init
|
301
|
+
|
302
|
+
# The main window
|
303
|
+
window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
|
304
|
+
window.set_title("A GtkVTKRenderWindow Demo!")
|
305
|
+
window.signal_connect("destroy"){ gtk.main_quit }
|
306
|
+
window.signal_connect("delete_event"){ gtk.main_quit }
|
307
|
+
window.set_border_width(10)
|
308
|
+
|
309
|
+
# A VBox into which widgets are packed.
|
310
|
+
vbox = Gtk::VBox.new(false, 3)
|
311
|
+
window.add(vbox)
|
312
|
+
vbox.show
|
313
|
+
|
314
|
+
# The GtkVTKRenderWindow
|
315
|
+
gvtk = GtkGLExtVTKRenderWindowInteractor.new
|
316
|
+
#gvtk.SetDesiredUpdateRate(1000)
|
317
|
+
gvtk.set_size_request(400, 400)
|
318
|
+
vbox.pack_start(gvtk)
|
319
|
+
gvtk.show
|
320
|
+
gvtk.Initialize
|
321
|
+
gvtk.Start
|
322
|
+
# prevents 'q' from exiting the app.
|
323
|
+
exit = Proc.new{|obj, event, x|
|
324
|
+
x
|
325
|
+
}
|
326
|
+
# gvtk.AddObserver("ExitEvent", exit)
|
327
|
+
|
328
|
+
# The VTK stuff.
|
329
|
+
cone = Vtk::ConeSource.new
|
330
|
+
cone.SetResolution(80)
|
331
|
+
coneMapper = Vtk::PolyDataMapper.new
|
332
|
+
coneMapper.SetInput(cone.GetOutput)
|
333
|
+
#coneActor = Vtk::LODActor.new
|
334
|
+
coneActor = Vtk::Actor.new
|
335
|
+
coneActor.SetMapper(coneMapper)
|
336
|
+
coneActor.GetProperty.SetColor(0.5, 0.5, 1.0)
|
337
|
+
ren = Vtk::Renderer.new
|
338
|
+
gvtk.GetRenderWindow.AddRenderer(ren)
|
339
|
+
ren.AddActor(coneActor)
|
340
|
+
|
341
|
+
# A simple quit button
|
342
|
+
quit = Gtk::Button.new("Quit!")
|
343
|
+
quit.signal_connect("clicked"){ Gtk.main_quit }
|
344
|
+
vbox.pack_start(quit)
|
345
|
+
quit.show
|
346
|
+
|
347
|
+
# show the main window && start event processing.
|
348
|
+
window.show
|
349
|
+
Gtk.main
|
350
|
+
end
|
351
|
+
|
352
|
+
|
353
|
+
if $0 == __FILE__
|
354
|
+
main
|
355
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# generated from CMake
|
@@ -0,0 +1,615 @@
|
|
1
|
+
=begin
|
2
|
+
Description:
|
3
|
+
|
4
|
+
Provides a simple VTK widget for Gtk. This embeds a
|
5
|
+
vtkRenderWindow inside a GTK widget. This is based on
|
6
|
+
vtkTkRenderWidget.rb. The GtkVTKRenderWindowBase class provides the
|
7
|
+
abstraction necessary for someone to use their own interaction
|
8
|
+
behaviour. The method names are similar to those in
|
9
|
+
vtkInteractorStyle.h.
|
10
|
+
|
11
|
+
The class uses the gtkgl.GtkGLArea widget (gtkglarea). This avoids
|
12
|
+
a lot of problems with flicker.
|
13
|
+
|
14
|
+
There is a working example at the bottom.
|
15
|
+
|
16
|
+
Credits:
|
17
|
+
|
18
|
+
|
19
|
+
Bugs:
|
20
|
+
|
21
|
+
(*) There is a focus related problem. Tkinter has a focus object
|
22
|
+
that handles focus events. I dont know of an equivalent object
|
23
|
+
under GTK. So, when an 'enter_notify_event' is received on the
|
24
|
+
GtkVTKRenderWindow I grab the focus but I dont know what to do when
|
25
|
+
I get a 'leave_notify_event'.
|
26
|
+
|
27
|
+
(*) Will !work under Win32 because it uses the XID of a window in
|
28
|
+
OnRealize. Suggestions to fix this will be appreciated.
|
29
|
+
|
30
|
+
=end
|
31
|
+
|
32
|
+
require 'gtk2'
|
33
|
+
require 'gtkglext'
|
34
|
+
require 'vtk'
|
35
|
+
|
36
|
+
|
37
|
+
class GtkVTKRenderWindowBase < Gtk::GL::Area
|
38
|
+
|
39
|
+
=begin
|
40
|
+
A base class that enables one to embed a vtkRenderWindow into
|
41
|
+
a pyGTK widget. This class embeds the RenderWindow correctly.
|
42
|
+
Provided are some empty methods that can be overloaded to provide
|
43
|
+
a user defined interaction behaviour. The event handling
|
44
|
+
functions have names that are somewhat similar to the ones in the
|
45
|
+
vtkInteractorStyle class included with VTK.
|
46
|
+
=end
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
super
|
50
|
+
|
51
|
+
glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB|
|
52
|
+
Gdk::GLConfig::MODE_DOUBLE)
|
53
|
+
|
54
|
+
set_gl_capability(glconfig)
|
55
|
+
|
56
|
+
|
57
|
+
@RenderWindow = Vtk::RenderWindow.new
|
58
|
+
|
59
|
+
# private attributes
|
60
|
+
@Created = false
|
61
|
+
|
62
|
+
# used by the LOD actors
|
63
|
+
@DesiredUpdateRate = 15
|
64
|
+
@StillUpdateRate = 0.0001
|
65
|
+
|
66
|
+
self.ConnectSignals
|
67
|
+
|
68
|
+
# need this to be able to handle key_press events.
|
69
|
+
self.set_flags(Gtk::Window::CAN_FOCUS)
|
70
|
+
# default size
|
71
|
+
self.set_usize(300, 300)
|
72
|
+
end
|
73
|
+
|
74
|
+
def ConnectSignals
|
75
|
+
self.signal_connect("realize"){|wid, event| OnRealize(wid,event) }
|
76
|
+
self.signal_connect("expose_event"){|wid, event| OnExpose(wid,event) }
|
77
|
+
self.signal_connect("configure_event"){|wid, event| OnConfigure(wid,event) }
|
78
|
+
self.signal_connect("button_press_event"){|wid, event| OnButtonDown(wid,event) }
|
79
|
+
self.signal_connect("button_release_event"){|wid, event| OnButtonUp(wid,event) }
|
80
|
+
self.signal_connect("motion_notify_event"){|wid, event| OnMouseMove(wid,event) }
|
81
|
+
self.signal_connect("enter_notify_event"){|wid, event| OnEnter(wid,event) }
|
82
|
+
self.signal_connect("leave_notify_event"){|wid, event| OnLeave(wid,event) }
|
83
|
+
self.signal_connect("key_press_event"){|wid, event| OnKeyPress(wid,event) }
|
84
|
+
self.signal_connect("delete_event"){|wid, event| OnDestroy(wid,event) }
|
85
|
+
self.add_events(Gdk::Event::EXPOSURE_MASK|
|
86
|
+
Gdk::Event::BUTTON_PRESS_MASK |
|
87
|
+
Gdk::Event::BUTTON_RELEASE_MASK |
|
88
|
+
Gdk::Event::KEY_PRESS_MASK |
|
89
|
+
Gdk::Event::POINTER_MOTION_MASK |
|
90
|
+
Gdk::Event::POINTER_MOTION_HINT_MASK |
|
91
|
+
Gdk::Event::ENTER_NOTIFY_MASK |
|
92
|
+
Gdk::Event::LEAVE_NOTIFY_MASK)
|
93
|
+
end
|
94
|
+
|
95
|
+
def GetRenderWindow
|
96
|
+
return @RenderWindow
|
97
|
+
end
|
98
|
+
|
99
|
+
def GetRenderer
|
100
|
+
@RenderWindow.GetRenderers.InitTraversal
|
101
|
+
return @RenderWindow.GetRenderers.GetNextItem
|
102
|
+
end
|
103
|
+
|
104
|
+
def SetDesiredUpdateRate(rate)
|
105
|
+
=begin
|
106
|
+
Mirrors the method with the same name in vtkRenderWindowInteractor.
|
107
|
+
=end
|
108
|
+
@DesiredUpdateRate = rate
|
109
|
+
end
|
110
|
+
|
111
|
+
def GetDesiredUpdateRate
|
112
|
+
=begin
|
113
|
+
Mirrors the method with the same name in vtkRenderWindowInteractor.
|
114
|
+
=end
|
115
|
+
return @DesiredUpdateRate
|
116
|
+
end
|
117
|
+
|
118
|
+
def SetStillUpdateRate(rate)
|
119
|
+
=begin
|
120
|
+
Mirrors the method with the same name in vtkRenderWindowInteractor.
|
121
|
+
=end
|
122
|
+
@StillUpdateRate = rate
|
123
|
+
end
|
124
|
+
|
125
|
+
def GetStillUpdateRate
|
126
|
+
=begin
|
127
|
+
Mirrors the method with the same name in vtkRenderWindowInteractor.
|
128
|
+
=end
|
129
|
+
return @StillUpdateRate
|
130
|
+
end
|
131
|
+
|
132
|
+
def Render
|
133
|
+
if @Created
|
134
|
+
@RenderWindow.Render
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def OnRealize(wid, event)
|
139
|
+
if @Created == 0
|
140
|
+
# you can't get the xid without the window being realized.
|
141
|
+
self.realize
|
142
|
+
win_id = self.get_window.xid.to_s
|
143
|
+
@RenderWindow.SetWindowInfo(win_id)
|
144
|
+
@Created = true
|
145
|
+
end
|
146
|
+
return true
|
147
|
+
end
|
148
|
+
|
149
|
+
def OnConfigure(wid, event=nil)
|
150
|
+
sz = @RenderWindow.GetSize
|
151
|
+
if (event.width != sz[0]) || (event.height != sz[1])
|
152
|
+
@RenderWindow.SetSize(event.width, event.height)
|
153
|
+
end
|
154
|
+
return true
|
155
|
+
end
|
156
|
+
|
157
|
+
def OnExpose(wid, event)
|
158
|
+
self.Render
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
|
162
|
+
def OnDestroy(wid, event=nil)
|
163
|
+
self.hide
|
164
|
+
@RenderWindow = nil
|
165
|
+
self.destroy
|
166
|
+
return true
|
167
|
+
end
|
168
|
+
|
169
|
+
def OnButtonDown(wid, event)
|
170
|
+
=begin
|
171
|
+
Mouse button pressed.
|
172
|
+
=end
|
173
|
+
@RenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
|
174
|
+
return true
|
175
|
+
end
|
176
|
+
|
177
|
+
def OnButtonUp(wid, event)
|
178
|
+
=begin
|
179
|
+
Mouse button released.
|
180
|
+
=end
|
181
|
+
@RenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
|
182
|
+
return true
|
183
|
+
end
|
184
|
+
|
185
|
+
def OnMouseMove(wid, event)
|
186
|
+
=begin
|
187
|
+
Mouse has moved.
|
188
|
+
=end
|
189
|
+
return true
|
190
|
+
end
|
191
|
+
|
192
|
+
def OnEnter(wid, event)
|
193
|
+
=begin
|
194
|
+
Entering the vtkRenderWindow.
|
195
|
+
=end
|
196
|
+
return true
|
197
|
+
end
|
198
|
+
|
199
|
+
def OnLeave(wid, event)
|
200
|
+
=begin
|
201
|
+
Leaving the vtkRenderWindow.
|
202
|
+
=end
|
203
|
+
return true
|
204
|
+
end
|
205
|
+
|
206
|
+
def OnKeyPress(wid, event)
|
207
|
+
=begin
|
208
|
+
Key pressed.
|
209
|
+
=end
|
210
|
+
return true
|
211
|
+
end
|
212
|
+
|
213
|
+
def OnKeyRelease(wid, event)
|
214
|
+
=begin
|
215
|
+
Key released.
|
216
|
+
=end
|
217
|
+
return true
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
|
222
|
+
class GtkVTKRenderWindow < GtkVTKRenderWindowBase
|
223
|
+
=begin
|
224
|
+
An example of a fully functional GtkVTKRenderWindow that is
|
225
|
+
based on the vtkRenderWidget.py provided with the VTK sources.
|
226
|
+
=end
|
227
|
+
|
228
|
+
def initialize
|
229
|
+
super
|
230
|
+
|
231
|
+
@CurrentRenderer = nil
|
232
|
+
@CurrentCamera = nil
|
233
|
+
@CurrentZoom = 1.0
|
234
|
+
@CurrentLight = nil
|
235
|
+
|
236
|
+
@ViewportCenterX = 0
|
237
|
+
@ViewportCenterY = 0
|
238
|
+
|
239
|
+
@Picker = Vtk::CellPicker.new
|
240
|
+
@PickedAssembly = nil
|
241
|
+
@PickedProperty = Vtk::Property.new
|
242
|
+
@PickedProperty.SetColor(1, 0, 0)
|
243
|
+
@PrePickedProperty = nil
|
244
|
+
|
245
|
+
@OldFocus = nil
|
246
|
+
|
247
|
+
# these record the previous mouse position
|
248
|
+
@LastX = 0
|
249
|
+
@LastY = 0
|
250
|
+
end
|
251
|
+
|
252
|
+
def OnButtonDown(wid, event)
|
253
|
+
@RenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
|
254
|
+
return self.StartMotion(wid, event)
|
255
|
+
end
|
256
|
+
|
257
|
+
def OnButtonUp(wid, event)
|
258
|
+
@RenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
|
259
|
+
return self.EndMotion(wid, event)
|
260
|
+
end
|
261
|
+
|
262
|
+
def OnMouseMove(wid, event=nil)
|
263
|
+
if ((event.state & Gdk::Window::ModifierType::BUTTON1_MASK) == Gdk::Window::ModifierType::BUTTON1_MASK)
|
264
|
+
if ((event.state & Gdk::Window::ModifierType::SHIFT_MASK) == Gdk::Window::ModifierType::SHIFT_MASK)
|
265
|
+
m = self.pointer
|
266
|
+
self.Pan(m[0], m[1])
|
267
|
+
return true
|
268
|
+
else
|
269
|
+
m = self.pointer
|
270
|
+
self.Rotate(m[0], m[1])
|
271
|
+
return true
|
272
|
+
end
|
273
|
+
elsif ((event.state & Gdk::Window::ModifierType::BUTTON2_MASK) == Gdk::Window::ModifierType::BUTTON2_MASK)
|
274
|
+
m = self.pointer
|
275
|
+
self.Pan(m[0], m[1])
|
276
|
+
return true
|
277
|
+
elsif ((event.state & Gdk::Window::ModifierType::BUTTON3_MASK) == Gdk::Window::ModifierType::BUTTON3_MASK)
|
278
|
+
m = self.pointer
|
279
|
+
self.Zoom(m[0], m[1])
|
280
|
+
return true
|
281
|
+
else
|
282
|
+
return false
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def OnEnter(wid, event=nil)
|
287
|
+
self.grab_focus
|
288
|
+
w = self.pointer
|
289
|
+
self.UpdateRenderer(w[0], w[1])
|
290
|
+
return true
|
291
|
+
end
|
292
|
+
|
293
|
+
def OnLeave(wid, event)
|
294
|
+
return true
|
295
|
+
end
|
296
|
+
|
297
|
+
def OnKeyPress(wid, event=nil)
|
298
|
+
if (event.keyval == "r") || (event.keyval == "R")
|
299
|
+
self.Reset
|
300
|
+
return true
|
301
|
+
elsif (event.keyval == "w") || (event.keyval == "W")
|
302
|
+
self.Wireframe
|
303
|
+
return true
|
304
|
+
elsif (event.keyval == "s") || (event.keyval == "S")
|
305
|
+
self.Surface
|
306
|
+
return true
|
307
|
+
elsif (event.keyval == "p") || (event.keyval == "P")
|
308
|
+
m = self.pointer
|
309
|
+
self.PickActor(m[0], m[1])
|
310
|
+
return true
|
311
|
+
else
|
312
|
+
return false
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def GetZoomFactor
|
317
|
+
return @CurrentZoom
|
318
|
+
end
|
319
|
+
|
320
|
+
def SetZoomFactor(zf)
|
321
|
+
@CurrentZoom = zf
|
322
|
+
end
|
323
|
+
|
324
|
+
def GetPicker
|
325
|
+
return @Picker
|
326
|
+
end
|
327
|
+
|
328
|
+
def Render
|
329
|
+
if (@CurrentLight)
|
330
|
+
light = @CurrentLight
|
331
|
+
light.SetPosition(@CurrentCamera.GetPosition)
|
332
|
+
light.SetFocalPoint(@CurrentCamera.GetFocalPoint)
|
333
|
+
end
|
334
|
+
|
335
|
+
GtkVTKRenderWindowBase.Render
|
336
|
+
end
|
337
|
+
|
338
|
+
def UpdateRenderer(x,y)
|
339
|
+
=begin
|
340
|
+
UpdateRenderer will identify the renderer under the mouse && set
|
341
|
+
up _CurrentRenderer, _CurrentCamera, && _CurrentLight.
|
342
|
+
=end
|
343
|
+
windowX = self.get_window.width
|
344
|
+
windowY = self.get_window.height
|
345
|
+
|
346
|
+
renderers = @RenderWindow.GetRenderers
|
347
|
+
numRenderers = renderers.GetNumberOfItems
|
348
|
+
|
349
|
+
@CurrentRenderer = nil
|
350
|
+
renderers.InitTraversal
|
351
|
+
for i in 0...numRenderers
|
352
|
+
renderer = renderers.GetNextItem
|
353
|
+
vx,vy = [0,0]
|
354
|
+
if (windowX > 1)
|
355
|
+
vx = x.to_f/(windowX-1)
|
356
|
+
end
|
357
|
+
if (windowY > 1)
|
358
|
+
vy = (windowY-y.to_f-1)/(windowY-1)
|
359
|
+
end
|
360
|
+
(vpxmin,vpymin,vpxmax,vpymax) = renderer.GetViewport
|
361
|
+
|
362
|
+
if (vx >= vpxmin && vx <= vpxmax && vy >= vpymin && vy <= vpymax)
|
363
|
+
@CurrentRenderer = renderer
|
364
|
+
@ViewportCenterX = windowX.to_f*(vpxmax-vpxmin)/2.0 +vpxmin
|
365
|
+
@ViewportCenterY = windowY.to_f*(vpymax-vpymin)/2.0 +vpymin
|
366
|
+
@CurrentCamera = @CurrentRenderer.GetActiveCamera
|
367
|
+
lights = @CurrentRenderer.GetLights
|
368
|
+
lights.InitTraversal
|
369
|
+
break if @CurrentLight = lights.GetNextItem
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
@LastX = x
|
374
|
+
@LastY = y
|
375
|
+
end
|
376
|
+
|
377
|
+
def GetCurrentRenderer
|
378
|
+
return @CurrentRenderer
|
379
|
+
end
|
380
|
+
|
381
|
+
def StartMotion(wid, event=nil)
|
382
|
+
x = event.x
|
383
|
+
y = event.y
|
384
|
+
self.UpdateRenderer(x,y)
|
385
|
+
return true
|
386
|
+
end
|
387
|
+
|
388
|
+
def EndMotion(wid, event=nil)
|
389
|
+
if @CurrentRenderer
|
390
|
+
self.Render
|
391
|
+
end
|
392
|
+
return true
|
393
|
+
end
|
394
|
+
|
395
|
+
def Rotate(x,y)
|
396
|
+
if @CurrentRenderer
|
397
|
+
|
398
|
+
@CurrentCamera.Azimuth(@LastX - x)
|
399
|
+
@CurrentCamera.Elevation(y - @LastY)
|
400
|
+
@CurrentCamera.OrthogonalizeViewUp
|
401
|
+
|
402
|
+
@LastX = x
|
403
|
+
@LastY = y
|
404
|
+
|
405
|
+
@CurrentRenderer.ResetCameraClippingRange
|
406
|
+
self.Render
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
def Pan(x,y)
|
411
|
+
if @CurrentRenderer
|
412
|
+
|
413
|
+
renderer = @CurrentRenderer
|
414
|
+
camera = @CurrentCamera
|
415
|
+
(pPoint0,pPoint1,pPoint2) = camera.GetPosition
|
416
|
+
(fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
|
417
|
+
|
418
|
+
if (camera.GetParallelProjection)
|
419
|
+
renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
|
420
|
+
renderer.WorldToDisplay
|
421
|
+
fx,fy,fz = renderer.GetDisplayPoint
|
422
|
+
renderer.SetDisplayPoint(fx-x+@LastX,
|
423
|
+
fy+y-@LastY,
|
424
|
+
fz)
|
425
|
+
renderer.DisplayToWorld
|
426
|
+
fx,fy,fz,fw = renderer.GetWorldPoint
|
427
|
+
camera.SetFocalPoint(fx,fy,fz)
|
428
|
+
|
429
|
+
renderer.SetWorldPoint(pPoint0,pPoint1,pPoint2,1.0)
|
430
|
+
renderer.WorldToDisplay
|
431
|
+
fx,fy,fz = renderer.GetDisplayPoint
|
432
|
+
renderer.SetDisplayPoint(fx-x+@LastX,
|
433
|
+
fy+y-@LastY,
|
434
|
+
fz)
|
435
|
+
renderer.DisplayToWorld
|
436
|
+
fx,fy,fz,fw = renderer.GetWorldPoint
|
437
|
+
camera.SetPosition(fx,fy,fz)
|
438
|
+
|
439
|
+
else
|
440
|
+
(fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
|
441
|
+
# Specify a point location in world coordinates
|
442
|
+
renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
|
443
|
+
renderer.WorldToDisplay
|
444
|
+
# Convert world point coordinates to display coordinates
|
445
|
+
dPoint = renderer.GetDisplayPoint
|
446
|
+
focalDepth = dPoint[2]
|
447
|
+
|
448
|
+
aPoint0 = @ViewportCenterX + (x - @LastX)
|
449
|
+
aPoint1 = @ViewportCenterY - (y - @LastY)
|
450
|
+
|
451
|
+
renderer.SetDisplayPoint(aPoint0,aPoint1,focalDepth)
|
452
|
+
renderer.DisplayToWorld
|
453
|
+
|
454
|
+
(rPoint0,rPoint1,rPoint2,rPoint3) = renderer.GetWorldPoint
|
455
|
+
if (rPoint3 != 0.0)
|
456
|
+
rPoint0 = rPoint0/rPoint3
|
457
|
+
rPoint1 = rPoint1/rPoint3
|
458
|
+
rPoint2 = rPoint2/rPoint3
|
459
|
+
end
|
460
|
+
|
461
|
+
camera.SetFocalPoint((fPoint0 - rPoint0) + fPoint0,
|
462
|
+
(fPoint1 - rPoint1) + fPoint1,
|
463
|
+
(fPoint2 - rPoint2) + fPoint2)
|
464
|
+
|
465
|
+
camera.SetPosition((fPoint0 - rPoint0) + pPoint0,
|
466
|
+
(fPoint1 - rPoint1) + pPoint1,
|
467
|
+
(fPoint2 - rPoint2) + pPoint2)
|
468
|
+
end
|
469
|
+
|
470
|
+
@LastX = x
|
471
|
+
@LastY = y
|
472
|
+
|
473
|
+
self.Render
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
def Zoom(x,y)
|
478
|
+
if @CurrentRenderer
|
479
|
+
|
480
|
+
renderer = @CurrentRenderer
|
481
|
+
camera = @CurrentCamera
|
482
|
+
|
483
|
+
zoomFactor = 1.02**(0.5*(@LastY - y))
|
484
|
+
@CurrentZoom = @CurrentZoom * zoomFactor
|
485
|
+
|
486
|
+
if camera.GetParallelProjection
|
487
|
+
parallelScale = camera.GetParallelScale/zoomFactor
|
488
|
+
camera.SetParallelScale(parallelScale)
|
489
|
+
else
|
490
|
+
camera.Dolly(zoomFactor)
|
491
|
+
renderer.ResetCameraClippingRange
|
492
|
+
end
|
493
|
+
|
494
|
+
@LastX = x
|
495
|
+
@LastY = y
|
496
|
+
|
497
|
+
self.Render
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
def Reset
|
502
|
+
if @CurrentRenderer
|
503
|
+
@CurrentRenderer.ResetCamera
|
504
|
+
end
|
505
|
+
|
506
|
+
self.Render
|
507
|
+
end
|
508
|
+
|
509
|
+
def Wireframe
|
510
|
+
actors = @CurrentRenderer.GetActors
|
511
|
+
numActors = actors.GetNumberOfItems
|
512
|
+
actors.InitTraversal
|
513
|
+
for i in 0...numActors
|
514
|
+
actor = actors.GetNextItem
|
515
|
+
actor.GetProperty.SetRepresentationToWireframe
|
516
|
+
end
|
517
|
+
|
518
|
+
self.Render
|
519
|
+
end
|
520
|
+
|
521
|
+
def Surface
|
522
|
+
actors = @CurrentRenderer.GetActors
|
523
|
+
numActors = actors.GetNumberOfItems
|
524
|
+
actors.InitTraversal
|
525
|
+
for i in 0...numActors
|
526
|
+
actor = actors.GetNextItem
|
527
|
+
actor.GetProperty.SetRepresentationToSurface
|
528
|
+
end
|
529
|
+
|
530
|
+
self.Render
|
531
|
+
end
|
532
|
+
|
533
|
+
def PickActor(x,y)
|
534
|
+
if @CurrentRenderer
|
535
|
+
|
536
|
+
renderer = @CurrentRenderer
|
537
|
+
picker = @Picker
|
538
|
+
|
539
|
+
windowY = self.get_window.height
|
540
|
+
picker.Pick(x,(windowY - y - 1),0.0,renderer)
|
541
|
+
assembly = picker.GetAssembly
|
542
|
+
|
543
|
+
if (@PickedAssembly != nil && @PrePickedProperty != nil)
|
544
|
+
@PickedAssembly.SetProperty(@PrePickedProperty)
|
545
|
+
# release hold of the property
|
546
|
+
@PrePickedProperty.UnRegister(@PrePickedProperty)
|
547
|
+
@PrePickedProperty = nil
|
548
|
+
end
|
549
|
+
|
550
|
+
if (assembly != nil)
|
551
|
+
@PickedAssembly = assembly
|
552
|
+
@PrePickedProperty = @PickedAssembly.GetProperty
|
553
|
+
# hold onto the property
|
554
|
+
@PrePickedProperty.Register(@PrePickedProperty)
|
555
|
+
@PickedAssembly.SetProperty(@PickedProperty)
|
556
|
+
end
|
557
|
+
|
558
|
+
self.Render
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
|
564
|
+
def main
|
565
|
+
|
566
|
+
Gtk.init
|
567
|
+
Gtk::GL.init
|
568
|
+
|
569
|
+
# The main window
|
570
|
+
window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
|
571
|
+
window.set_title("A GtkVTKRenderWindow Demo!")
|
572
|
+
window.signal_connect("destroy"){ Gtk.main_quit }
|
573
|
+
window.signal_connect("delete_event"){ Gtk.main_quit }
|
574
|
+
window.set_border_width(10)
|
575
|
+
|
576
|
+
# A VBox into which widgets are packed.
|
577
|
+
vbox = Gtk::VBox.new(false, 3)
|
578
|
+
window.add(vbox)
|
579
|
+
vbox.show
|
580
|
+
|
581
|
+
# The GtkVTKRenderWindow
|
582
|
+
gvtk = GtkVTKRenderWindow.new
|
583
|
+
#gvtk.SetDesiredUpdateRate(1000)
|
584
|
+
gvtk.set_usize(400, 400)
|
585
|
+
vbox.pack_start(gvtk)
|
586
|
+
gvtk.show
|
587
|
+
|
588
|
+
# The VTK stuff.
|
589
|
+
cone = Vtk::ConeSource.new
|
590
|
+
cone.SetResolution(80)
|
591
|
+
coneMapper = Vtk::PolyDataMapper.new
|
592
|
+
coneMapper.SetInput(cone.GetOutput)
|
593
|
+
#coneActor = Vtk::LODActor.new
|
594
|
+
coneActor = Vtk::Actor.new
|
595
|
+
coneActor.SetMapper(coneMapper)
|
596
|
+
coneActor.GetProperty.SetColor(0.5, 0.5, 1.0)
|
597
|
+
ren = Vtk::Renderer.new
|
598
|
+
gvtk.GetRenderWindow.AddRenderer(ren)
|
599
|
+
ren.AddActor(coneActor)
|
600
|
+
|
601
|
+
# A simple quit button
|
602
|
+
quit = Gtk::Button.new("Quit!")
|
603
|
+
quit.signal_connect("clicked"){ Gtk.main_quit }
|
604
|
+
vbox.pack_start(quit)
|
605
|
+
quit.show
|
606
|
+
|
607
|
+
# show the main window && start event processing.
|
608
|
+
window.show
|
609
|
+
Gtk.main
|
610
|
+
end
|
611
|
+
|
612
|
+
|
613
|
+
if $0 == __FILE__
|
614
|
+
main
|
615
|
+
end
|