Class: GtkVTKRenderWindow

Inherits:
GtkVTKRenderWindowBase show all
Defined in:
lib/VTK/gtk/GtkVTKRenderWindow.rb

Instance Method Summary collapse

Methods inherited from GtkVTKRenderWindowBase

#ConnectSignals, #GetDesiredUpdateRate, #GetRenderWindow, #GetRenderer, #GetStillUpdateRate, #OnConfigure, #OnDestroy, #OnExpose, #OnKeyRelease, #OnRealize, #SetDesiredUpdateRate, #SetStillUpdateRate

Constructor Details

#initializeGtkVTKRenderWindow

An example of a fully functional GtkVTKRenderWindow that is

based on the vtkRenderWidget.py provided with the VTK sources.


228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 228

def initialize
  super

  @CurrentRenderer = nil
  @CurrentCamera = nil
  @CurrentZoom = 1.0
  @CurrentLight = nil

  @ViewportCenterX = 0
  @ViewportCenterY = 0

  @Picker = Vtk::CellPicker.new
  @PickedAssembly = nil
  @PickedProperty = Vtk::Property.new
  @PickedProperty.SetColor(1, 0, 0)
  @PrePickedProperty = nil

  @OldFocus = nil

  # these record the previous mouse position
  @LastX = 0
  @LastY = 0
end

Instance Method Details

#EndMotion(wid, event = nil) ⇒ Object



388
389
390
391
392
393
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 388

def EndMotion(wid, event=nil)
  if @CurrentRenderer
    self.Render
  end
  return true
end

#GetCurrentRendererObject



377
378
379
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 377

def GetCurrentRenderer
  return @CurrentRenderer
end

#GetPickerObject



324
325
326
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 324

def GetPicker
  return @Picker
end

#GetZoomFactorObject



316
317
318
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 316

def GetZoomFactor
  return @CurrentZoom
end

#OnButtonDown(wid, event) ⇒ Object



252
253
254
255
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 252

def OnButtonDown(wid, event)
  @RenderWindow.SetDesiredUpdateRate(@DesiredUpdateRate)
  return self.StartMotion(wid, event)
end

#OnButtonUp(wid, event) ⇒ Object



257
258
259
260
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 257

def OnButtonUp(wid, event)
  @RenderWindow.SetDesiredUpdateRate(@StillUpdateRate)
  return self.EndMotion(wid, event)
end

#OnEnter(wid, event = nil) ⇒ Object



286
287
288
289
290
291
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 286

def OnEnter(wid, event=nil)
  self.grab_focus
  w = self.pointer
  self.UpdateRenderer(w[0], w[1])
  return true
end

#OnKeyPress(wid, event = nil) ⇒ Object



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 297

def OnKeyPress(wid, event=nil)
  if (event.keyval == "r") || (event.keyval == "R")
    self.Reset
    return true
  elsif (event.keyval == "w") || (event.keyval == "W")
    self.Wireframe
    return true
  elsif (event.keyval == "s") || (event.keyval == "S")
    self.Surface
    return true
  elsif (event.keyval == "p") || (event.keyval == "P")
    m = self.pointer
    self.PickActor(m[0], m[1])
    return true
  else
    return false
  end
end

#OnLeave(wid, event) ⇒ Object



293
294
295
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 293

def OnLeave(wid, event)
  return true
end

#OnMouseMove(wid, event = nil) ⇒ Object



262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 262

def OnMouseMove(wid, event=nil)
  if ((event.state & Gdk::Window::ModifierType::BUTTON1_MASK) == Gdk::Window::ModifierType::BUTTON1_MASK)
    if ((event.state & Gdk::Window::ModifierType::SHIFT_MASK) == Gdk::Window::ModifierType::SHIFT_MASK)
      m = self.pointer
      self.Pan(m[0], m[1])
      return true
    else
      m = self.pointer
      self.Rotate(m[0], m[1])
      return true
    end
  elsif ((event.state & Gdk::Window::ModifierType::BUTTON2_MASK) == Gdk::Window::ModifierType::BUTTON2_MASK)
    m = self.pointer
    self.Pan(m[0], m[1])
    return true
  elsif ((event.state & Gdk::Window::ModifierType::BUTTON3_MASK) == Gdk::Window::ModifierType::BUTTON3_MASK)
    m = self.pointer
    self.Zoom(m[0], m[1])
    return true
  else
    return false
  end
end

#Pan(x, y) ⇒ Object



410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 410

def Pan(x,y)
  if @CurrentRenderer

    renderer = @CurrentRenderer
    camera = @CurrentCamera
    (pPoint0,pPoint1,pPoint2) = camera.GetPosition
    (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint

    if (camera.GetParallelProjection)
      renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
      renderer.WorldToDisplay
      fx,fy,fz = renderer.GetDisplayPoint
      renderer.SetDisplayPoint(fx-x+@LastX,
                               fy+y-@LastY,
                               fz)
      renderer.DisplayToWorld
      fx,fy,fz,fw = renderer.GetWorldPoint
      camera.SetFocalPoint(fx,fy,fz)

      renderer.SetWorldPoint(pPoint0,pPoint1,pPoint2,1.0)
      renderer.WorldToDisplay
      fx,fy,fz = renderer.GetDisplayPoint
      renderer.SetDisplayPoint(fx-x+@LastX,
                               fy+y-@LastY,
                               fz)
      renderer.DisplayToWorld
      fx,fy,fz,fw = renderer.GetWorldPoint
      camera.SetPosition(fx,fy,fz)

    else
      (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint
      # Specify a point location in world coordinates
      renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
      renderer.WorldToDisplay
      # Convert world point coordinates to display coordinates
      dPoint = renderer.GetDisplayPoint
      focalDepth = dPoint[2]

      aPoint0 = @ViewportCenterX + (x - @LastX)
      aPoint1 = @ViewportCenterY - (y - @LastY)

      renderer.SetDisplayPoint(aPoint0,aPoint1,focalDepth)
      renderer.DisplayToWorld

      (rPoint0,rPoint1,rPoint2,rPoint3) = renderer.GetWorldPoint
      if (rPoint3 != 0.0)
        rPoint0 = rPoint0/rPoint3
        rPoint1 = rPoint1/rPoint3
        rPoint2 = rPoint2/rPoint3
      end

      camera.SetFocalPoint((fPoint0 - rPoint0) + fPoint0, 
                           (fPoint1 - rPoint1) + fPoint1,
                           (fPoint2 - rPoint2) + fPoint2) 

      camera.SetPosition((fPoint0 - rPoint0) + pPoint0, 
                         (fPoint1 - rPoint1) + pPoint1,
                         (fPoint2 - rPoint2) + pPoint2)
    end

    @LastX = x
    @LastY = y

    self.Render
  end
end

#PickActor(x, y) ⇒ Object



533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 533

def PickActor(x,y)
  if @CurrentRenderer

    renderer = @CurrentRenderer
    picker = @Picker

    windowY = self.get_window.height
    picker.Pick(x,(windowY - y - 1),0.0,renderer)
    assembly = picker.GetAssembly

    if (@PickedAssembly != nil && @PrePickedProperty != nil)
      @PickedAssembly.SetProperty(@PrePickedProperty)
      # release hold of the property
      @PrePickedProperty.UnRegister(@PrePickedProperty)
      @PrePickedProperty = nil
    end

    if (assembly != nil)
      @PickedAssembly = assembly
      @PrePickedProperty = @PickedAssembly.GetProperty
      # hold onto the property
      @PrePickedProperty.Register(@PrePickedProperty)
      @PickedAssembly.SetProperty(@PickedProperty)
    end

    self.Render
  end
end

#RenderObject



328
329
330
331
332
333
334
335
336
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 328

def Render
  if (@CurrentLight)
    light = @CurrentLight
    light.SetPosition(@CurrentCamera.GetPosition)
    light.SetFocalPoint(@CurrentCamera.GetFocalPoint)
  end

  GtkVTKRenderWindowBase.Render
end

#ResetObject



501
502
503
504
505
506
507
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 501

def Reset
  if @CurrentRenderer
    @CurrentRenderer.ResetCamera
  end

  self.Render
end

#Rotate(x, y) ⇒ Object



395
396
397
398
399
400
401
402
403
404
405
406
407
408
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 395

def Rotate(x,y)
  if @CurrentRenderer

    @CurrentCamera.Azimuth(@LastX - x)
    @CurrentCamera.Elevation(y - @LastY)
    @CurrentCamera.OrthogonalizeViewUp

    @LastX = x
    @LastY = y

    @CurrentRenderer.ResetCameraClippingRange
    self.Render
  end
end

#SetZoomFactor(zf) ⇒ Object



320
321
322
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 320

def SetZoomFactor(zf)
  @CurrentZoom = zf
end

#StartMotion(wid, event = nil) ⇒ Object



381
382
383
384
385
386
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 381

def StartMotion(wid, event=nil)
  x = event.x
  y = event.y
  self.UpdateRenderer(x,y)
  return true
end

#SurfaceObject



521
522
523
524
525
526
527
528
529
530
531
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 521

def Surface
  actors = @CurrentRenderer.GetActors
  numActors = actors.GetNumberOfItems
  actors.InitTraversal
  for i in 0...numActors
    actor = actors.GetNextItem
    actor.GetProperty.SetRepresentationToSurface
  end

  self.Render
end

#UpdateRenderer(x, y) ⇒ Object



338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 338

def UpdateRenderer(x,y)
=begin
      UpdateRenderer will identify the renderer under the mouse && set
      up _CurrentRenderer, _CurrentCamera, && _CurrentLight.
=end
  windowX = self.get_window.width
  windowY = self.get_window.height

  renderers = @RenderWindow.GetRenderers
  numRenderers = renderers.GetNumberOfItems

  @CurrentRenderer = nil
  renderers.InitTraversal
  for i in 0...numRenderers
    renderer = renderers.GetNextItem
    vx,vy = [0,0]
    if (windowX > 1)
      vx = x.to_f/(windowX-1)
    end
    if (windowY > 1)
      vy = (windowY-y.to_f-1)/(windowY-1)
    end
    (vpxmin,vpymin,vpxmax,vpymax) = renderer.GetViewport

    if (vx >= vpxmin && vx <= vpxmax && vy >= vpymin && vy <= vpymax)
      @CurrentRenderer = renderer
      @ViewportCenterX = windowX.to_f*(vpxmax-vpxmin)/2.0 +vpxmin
      @ViewportCenterY = windowY.to_f*(vpymax-vpymin)/2.0 +vpymin
      @CurrentCamera = @CurrentRenderer.GetActiveCamera
      lights = @CurrentRenderer.GetLights
      lights.InitTraversal
      break if @CurrentLight = lights.GetNextItem
    end
  end

  @LastX = x
  @LastY = y
end

#WireframeObject



509
510
511
512
513
514
515
516
517
518
519
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 509

def Wireframe
  actors = @CurrentRenderer.GetActors
  numActors = actors.GetNumberOfItems
  actors.InitTraversal
  for i in 0...numActors
    actor = actors.GetNextItem
    actor.GetProperty.SetRepresentationToWireframe
  end

  self.Render
end

#Zoom(x, y) ⇒ Object



477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
# File 'lib/VTK/gtk/GtkVTKRenderWindow.rb', line 477

def Zoom(x,y)
  if @CurrentRenderer

    renderer = @CurrentRenderer
    camera = @CurrentCamera

    zoomFactor = 1.02**(0.5*(@LastY - y))
    @CurrentZoom = @CurrentZoom * zoomFactor

    if camera.GetParallelProjection
      parallelScale = camera.GetParallelScale/zoomFactor
      camera.SetParallelScale(parallelScale)
    else
      camera.Dolly(zoomFactor)
      renderer.ResetCameraClippingRange
    end

    @LastX = x
    @LastY = y

    self.Render
  end
end