?? gtkglextvtkrenderwindow.py
字號:
"""Description: This provides a VTK widget for pyGtk. This embeds a vtkRenderWindow inside a GTK widget. This is based on GtkVTKRenderWindow.py. The extensions here allow the use of gtkglext rather than gtkgl and pygtk-2 rather than pygtk-0. It requires pygtk-2.0.0 or later. There is a working example at the bottom.Credits: John Hunter <jdhunter@ace.bsd.uchicago.edu> developed and tested this code based on VTK's GtkVTKRenderWindow.py and extended it to work with pygtk-2.0.0.License: VTK license."""import math, sysimport pygtkpygtk.require('2.0')import gtkimport gtk.gtkglfrom gtk import gdkimport vtkclass GtkGLExtVTKRenderWindowBase(gtk.gtkgl.DrawingArea): """ A base class that enables one to embed a vtkRenderWindow into a pyGTK widget. This class embeds the RenderWindow correctly. Provided are some empty methods that can be overloaded to provide a user defined interaction behaviour. The event handling functions have names that are somewhat similar to the ones in the vtkInteractorStyle class included with VTK. """ def __init__(self, *args): gtk.gtkgl.DrawingArea.__init__(self) self.set_double_buffered(gtk.FALSE) self._RenderWindow = vtk.vtkRenderWindow() # private attributes self.__Created = 0 # used by the LOD actors self._DesiredUpdateRate = 15 self._StillUpdateRate = 0.0001 self.ConnectSignals() # need this to be able to handle key_press events. self.set_flags(gtk.CAN_FOCUS) # default size self.set_size_request(300, 300) def ConnectSignals(self): self.connect("realize", self.OnRealize) self.connect("expose_event", self.OnExpose) self.connect("configure_event", self.OnConfigure) self.connect("button_press_event", self.OnButtonDown) self.connect("button_release_event", self.OnButtonUp) self.connect("motion_notify_event", self.OnMouseMove) self.connect("enter_notify_event", self.OnEnter) self.connect("leave_notify_event", self.OnLeave) self.connect("key_press_event", self.OnKeyPress) self.connect("delete_event", self.OnDestroy) self.add_events(gdk.EXPOSURE_MASK| gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.KEY_PRESS_MASK | gdk.POINTER_MOTION_MASK | gdk.POINTER_MOTION_HINT_MASK | gdk.ENTER_NOTIFY_MASK | gdk.LEAVE_NOTIFY_MASK) def GetRenderWindow(self): return self._RenderWindow def GetRenderer(self): self._RenderWindow.GetRenderers().InitTraversal() return self._RenderWindow.GetRenderers().GetNextItem() def SetDesiredUpdateRate(self, rate): """Mirrors the method with the same name in vtkRenderWindowInteractor.""" self._DesiredUpdateRate = rate def GetDesiredUpdateRate(self): """Mirrors the method with the same name in vtkRenderWindowInteractor.""" return self._DesiredUpdateRate def SetStillUpdateRate(self, rate): """Mirrors the method with the same name in vtkRenderWindowInteractor.""" self._StillUpdateRate = rate def GetStillUpdateRate(self): """Mirrors the method with the same name in vtkRenderWindowInteractor.""" return self._StillUpdateRate def Render(self): if self.__Created: self._RenderWindow.Render() def OnRealize(self, *args): if self.__Created == 0: # you can't get the xid without the window being realized. self.realize() if sys.platform=='win32': win_id = str(self.widget.window.handle) else: win_id = str(self.widget.window.xid) self._RenderWindow.SetWindowInfo(win_id) self.__Created = 1 return gtk.TRUE def Created(self): return self.__Created def OnConfigure(self, widget, event): self.widget=widget self._RenderWindow.SetSize(event.width, event.height) self.Render() return gtk.TRUE def OnExpose(self, *args): self.Render() return gtk.TRUE def OnDestroy(self, *args): self.hide() del self._RenderWindow self.destroy() return gtk.TRUE def OnButtonDown(self, wid, event): """Mouse button pressed.""" self._RenderWindow.SetDesiredUpdateRate(self._DesiredUpdateRate) return gtk.TRUE def OnButtonUp(self, wid, event): """Mouse button released.""" self._RenderWindow.SetDesiredUpdateRate(self._StillUpdateRate) return gtk.TRUE def OnMouseMove(self, wid, event): """Mouse has moved.""" return gtk.TRUE def OnEnter(self, wid, event): """Entering the vtkRenderWindow.""" return gtk.TRUE def OnLeave(self, wid, event): """Leaving the vtkRenderWindow.""" return gtk.TRUE def OnKeyPress(self, wid, event): """Key pressed.""" return gtk.TRUE def OnKeyRelease(self, wid, event): "Key released." return gtk.TRUEclass GtkGLExtVTKRenderWindow(GtkGLExtVTKRenderWindowBase): """ An example of a fully functional GtkGLExtVTKRenderWindow that is based on the vtkRenderWidget.py provided with the VTK sources.""" def __init__(self, *args): GtkGLExtVTKRenderWindowBase.__init__(self) self._CurrentRenderer = None self._CurrentCamera = None self._CurrentZoom = 1.0 self._CurrentLight = None self._ViewportCenterX = 0 self._ViewportCenterY = 0 self._Picker = vtk.vtkCellPicker() self._PickedAssembly = None self._PickedProperty = vtk.vtkProperty() self._PickedProperty.SetColor(1, 0, 0) self._PrePickedProperty = None self._OldFocus = None # these record the previous mouse position self._LastX = 0 self._LastY = 0 def OnButtonDown(self, wid, event): self._RenderWindow.SetDesiredUpdateRate(self._DesiredUpdateRate) return self.StartMotion(wid, event) return gtk.TRUE def OnButtonUp(self, wid, event): self._RenderWindow.SetDesiredUpdateRate(self._StillUpdateRate) return self.EndMotion(wid, event) return gtk.TRUE def OnMouseMove(self, wid, event=None): if ((event.state & gdk.BUTTON1_MASK) == gdk.BUTTON1_MASK): if ((event.state & gdk.SHIFT_MASK) == gdk.SHIFT_MASK): m = self.get_pointer() self.Pan(m[0], m[1]) else: m = self.get_pointer() self.Rotate(m[0], m[1]) elif ((event.state & gdk.BUTTON2_MASK) == gdk.BUTTON2_MASK): m = self.get_pointer() self.Pan(m[0], m[1]) elif ((event.state & gdk.BUTTON3_MASK) == gdk.BUTTON3_MASK): m = self.get_pointer() self.Zoom(m[0], m[1]) else: return gtk.FALSE return gtk.TRUE def OnEnter(self, wid, event=None): # a render hack because grab_focus blanks the renderwin self.grab_focus() w = self.get_pointer() self.UpdateRenderer(w[0], w[1]) return gtk.TRUE def OnKeyPress(self, wid, event=None): #if (event.keyval == gdk.keyval_from_name("q") or # event.keyval == gdk.keyval_from_name("Q")): # gtk.mainquit() if (event.keyval == gdk.keyval_from_name('r') or event.keyval == gdk.keyval_from_name('R')): self.Reset() return gtk.TRUE elif (event.keyval == gdk.keyval_from_name('w') or event.keyval == gdk.keyval_from_name('W')): self.Wireframe() return gtk.TRUE elif (event.keyval == gdk.keyval_from_name('s') or event.keyval == gdk.keyval_from_name('S')): self.Surface() return gtk.TRUE elif (event.keyval == gdk.keyval_from_name('p') or event.keyval == gdk.keyval_from_name('P')): m = self.get_pointer() self.PickActor(m[0], m[1]) return gtk.TRUE else: return gtk.FALSE def GetZoomFactor(self): return self._CurrentZoom def SetZoomFactor(self, zf): self._CurrentZoom = zf def GetPicker(self):
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -