⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkglextvtkrenderwindow.py

📁 a very goog book
💻 PY
📖 第 1 页 / 共 2 页
字号:
"""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 + -