graphkit-vtk 0.2.1 → 0.3.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
data/graphkit-vtk.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "graphkit-vtk"
8
- s.version = "0.2.1"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Edmund Highcock"]
12
- s.date = "2012-12-30"
12
+ s.date = "2012-12-31"
13
13
  s.description = "An extension allowing graphkits to be rendered using the Visualization Toolkit. Uses the RubyPython gem to access the Python bindings for VTK."
14
14
  s.email = "edmundhighcock@sourceforge.net"
15
15
  s.extra_rdoc_files = [
data/lib/graphkit-vtk.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  class GraphKit
2
2
  class VTKObjectGroup
3
+
4
+ def initialize
5
+ @other_objects = {}
6
+ end
3
7
  #The Python vtk module
4
8
  attr_accessor :vtk_module
5
9
 
@@ -12,9 +16,14 @@ class GraphKit
12
16
  # The VTK mapper (which converts the data to image data)
13
17
  attr_accessor :mapper
14
18
 
15
- # The VTK actor which is responsible for the data
19
+ # The vtkActor which is responsible for the data
16
20
  # within the window
17
21
  attr_accessor :actor
22
+
23
+ # The vtkVolume which is responsible for the data
24
+ # within the window in the case of volume
25
+ # rendering
26
+ attr_accessor :volume
18
27
 
19
28
  # The VTK renderer which renders the image data
20
29
  attr_accessor :renderer
@@ -30,6 +39,9 @@ class GraphKit
30
39
 
31
40
  # The VTK interactor
32
41
  attr_accessor :interactor
42
+
43
+ # A hash containing other VTK objects
44
+ attr_reader :other_objects
33
45
 
34
46
 
35
47
  end
@@ -220,6 +232,160 @@ class GraphKit
220
232
  end
221
233
 
222
234
 
235
+ # This method returns a VTKObjectGroup object, which
236
+ # contains references to the VTK/Python objects
237
+ # which are necessary to plot a graph using
238
+ # volume rendering.
239
+ #
240
+ # function can be :raycast or :tetrahedra
241
+ #
242
+ def vtk_volume_object_group( function = :raycast, filename = nil)
243
+ # If we are not given a filename, need to write the
244
+ # data in VTK format... can change at some point?
245
+ temp_write = false
246
+ unless filename
247
+ temp_write = true
248
+ filename = (Time.now.to_i).to_s + rand(1000000).to_s + ".tmp.vtk"
249
+ to_vtk_legacy_fast(file_name: filename)
250
+ end
251
+
252
+ require 'rubypython'
253
+ RubyPython.start
254
+ vtk_og = VTKObjectGroup.new
255
+ vtk = vtk_og.vtk_module = RubyPython.import('vtk')
256
+ file_name = filename
257
+
258
+ vtk_og.reader = reader = vtk.vtkUnstructuredGridReader
259
+ reader.SetFileName(file_name)
260
+ reader.Update
261
+
262
+ if temp_write
263
+ FileUtils.rm(filename)
264
+ end
265
+
266
+ vtk_og.output = output = reader.GetOutput
267
+ ep 'scalar_range', scalar_range = output.GetScalarRange
268
+ #
269
+
270
+ tf = vtk_og.other_objects[:tetrahedra_filter] = vtk.vtkDataSetTriangleFilter
271
+ tf.SetInput(output)
272
+
273
+
274
+ volprop = vtk_og.other_objects[:volume_property]= vtk.vtkVolumeProperty
275
+ coltranfunc = vtk_og.other_objects[:color_transfer_function] = vtk.vtkColorTransferFunction
276
+ opacfunc = vtk_og.other_objects[:opacity_function] = vtk.vtkPiecewiseFunction
277
+
278
+ min, max = scalar_range.to_a
279
+ ep scalar_range.to_a
280
+ max = max.to_s.to_f
281
+ min = min.to_s.to_f
282
+ ep 'max', max, max.class, 'min', min, min.class
283
+
284
+ coltranfunc.AddRGBPoint(min, 0.0, 0.0, 1.0)
285
+ coltranfunc.AddRGBPoint(min + 1.0*(max-min)/5.0, 0.0, 1.0, 1.0)
286
+ coltranfunc.AddRGBPoint(min + 2.0*(max-min)/5.0, 1.0, 0.0, 0.0)
287
+ coltranfunc.AddRGBPoint(min + 3.0*(max-min)/5.0, 1.0, 1.0, 0.0)
288
+ coltranfunc.AddRGBPoint(min + 4.0*(max-min)/5.0, 0.0, 1.0, 0.0)
289
+ coltranfunc.AddRGBPoint(min + 5.0*(max-min)/5.0, 1.0, 1.0, 1.0)
290
+
291
+ opacfunc.AddPoint(min, 1)
292
+ opacfunc.AddPoint(max, 1)
293
+
294
+ volprop.SetColor(coltranfunc)
295
+ volprop.SetScalarOpacity(opacfunc)
296
+
297
+
298
+ case function
299
+ when :raycast
300
+ vtk_og.mapper = mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper
301
+ mapper.SetInput(tf.GetOutput)
302
+ mapper.SetRayCastFunction(vtk.vtkUnstructuredGridBunykRayCastFunction)
303
+ when :zsweep
304
+ vtk_og.mapper = mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper
305
+ mapper.SetInput(tf.GetOutput)
306
+ mapper.SetRayIntegrator(vtk.vtkUnstructuredGridHomogeneousRayIntegrator )
307
+ when :tetrahedra
308
+ vtk_og.mapper = mapper = vtk.vtkProjectedTetrahedraMapper
309
+ mapper.SetInput(tf.GetOutput)
310
+ #mapper.SetRayCastFunction(vtk.vtkUnstructuredGridBunykRayCastFunction)
311
+ end
312
+ #mapper.SetScalarRange(scalar_range)
313
+
314
+ #look_up_table = vtk.vtkLookupTable
315
+ #look_up_table.SetNumberOfColors(64)
316
+ #look_up_table.SetHueRange(0.0, 0.667)
317
+ #mapper.SetLookupTable(look_up_table)
318
+ mapper.SetScalarModeToDefault
319
+ #mapper.CreateDefaultLookupTable
320
+ #mapper.ScalarVisibilityOn
321
+ #mapper.SelectColorArray('myvals')
322
+
323
+
324
+ vtk_og.volume = volume = vtk.vtkVolume
325
+ volume.SetMapper(mapper)
326
+ volume.SetProperty(volprop)
327
+ volume.VisibilityOn
328
+
329
+ vtk_og.renderer = renderer = vtk.vtkRenderer
330
+ renderer.AddVolume(volume)
331
+ #renderer.SetBackground(0,0,0)
332
+
333
+ vtk_og.renderer_window = renderer_window = vtk.vtkRenderWindow
334
+ renderer_window.SetSize(640,480)
335
+ renderer_window.AddRenderer(renderer)
336
+
337
+ render_large = vtk_og.large_image_renderer = vtk.vtkRenderLargeImage
338
+ render_large.SetInput(vtk_og.renderer)
339
+ render_large.SetMagnification(4)
340
+
341
+ vtk_og.interactor = interactor = vtk.vtkRenderWindowInteractor
342
+ interactor.SetRenderWindow(renderer_window)
343
+ interactor.Initialize
344
+ #interactor.Start
345
+
346
+ return vtk_og
347
+ end
348
+
349
+ # Visualise the GraphKit using the Visualization Toolkit (VTK)
350
+ # volume rendering classes.
351
+ # If <tt>output_file</tt> is "window", display it in a window;
352
+ # otherwise, write to the file, e.g. my_graph.jpg, my_graph.gif.
353
+ # The 'window' option will not work where VTK has been compiled
354
+ # for off screen rendering only.
355
+ #
356
+ # If input_file is given it sould be a VTK data file. Otherwise
357
+ # it will write the data to a temporary VTK legacy data file.
358
+ #
359
+ # The optional block yields a VTKObjectGroup which contains references
360
+ # to all the VTK objects for arbitrary manipulation before
361
+ # rendering.
362
+
363
+ def vtk_render_volume(output_file='window', function = :raycast, input_file=nil, &block)
364
+ vtk_og = vtk_volume_object_group(function, filename)
365
+ yield(vtk_og) if block
366
+ vtk = vtk_og.vtk_module
367
+ #filter = vtk.vtkWindowToImageFilter
368
+ #vtk_og.renderer_window.SetOffScreenRendering(1)
369
+ #gf = vtk.vtkGraphicsFactory
370
+ #gf.SetOffScreenOnlyMode(1)
371
+ vtk_og.renderer_window.Start
372
+ #vtk_og.reader.Update
373
+ #vtk_og.renderer.Update
374
+ #filter.SetInput(vtk_og.renderer_window)
375
+ case File.extname(output_file)
376
+ when '.jpeg', '.jpg'
377
+ jpeg_writer = vtk.vtkJPEGWriter
378
+ #vtk_og.renderer.DeviceRender
379
+ #jpeg_writer.SetInput(vtk_og.renderer.GetOutput)
380
+ #jpeg_writer.SetInput(render_large.GetOutput)
381
+ jpeg_writer.SetInput(vtk_og.large_image_renderer.GetOutput)
382
+ #filter.Update
383
+ jpeg_writer.SetFileName(output_file)
384
+ jpeg_writer.Write
385
+ end
386
+ vtk_og.renderer_window.Finalize
387
+
388
+ end
223
389
 
224
390
 
225
391
  end #module VTK
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphkit-vtk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-30 00:00:00.000000000 Z
12
+ date: 2012-12-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: graphkit
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
143
  version: '0'
144
144
  segments:
145
145
  - 0
146
- hash: -3523229928342679442
146
+ hash: 2250138545871999803
147
147
  required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  none: false
149
149
  requirements: