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,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
|