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

📄 qvtkrenderwidget.py

📁 a very goog book
💻 PY
📖 第 1 页 / 共 2 页
字号:
"""A simple VTK input file for PyQt, the qt bindings for python.See http://www.trolltech.com for qt documentation, andhttp://www.river-bank.demon.co.uk or http://www.thekompany.comfor the qt python bindings.*******************************************************   NOTE: The widget provided by this module is not free of bugs and it   is recommended that you consider using the   QVTKRenderWindowInteractor widget that is also in this directory   instead of this one.*******************************************************Created by David Gobbi, December 2001Based on vtkTkRenderWindget.pyChanges by Gerard Vermeulen Feb. 2003 Win32 support""""""This class should work with both the UNIX version of Qt and also onWin32.Depending on the OpenGL graphics drivers, it may notbe possible to have more than one QVTKRenderWidgetper application.In short, this class is experimental.  A proper implementationwill probably require a QVTKRenderWidget that is written inC++ and then wrapped to be made available through python,similar to the vtkTkRenderWidget.  """# Problems on Win32:# 1. The widget is not cleaned up properly and crashes the#    application.import vtkimport math, os, sysfrom qt import *class QVTKRenderWidget(QWidget):    """    A QVTKRenderWidget for Python and Qt.    Use GetRenderWindow() to get the vtkRenderWindow.    Create with the keyword stereo=1 in order to    generate a stereo-capable window.    """    def __init__(self, parent=None, name=None, *args, **kw):        # miscellaneous protected variables        self._CurrentRenderer = None        self._CurrentCamera = None        self._CurrentZoom = 1.0        self._CurrentLight = None        self._ViewportCenterX = 0        self._ViewportCenterY = 0                self._Picker = vtk.vtkCellPicker()        self._PickedActor = None        self._PickedProperty = vtk.vtkProperty()        self._PickedProperty.SetColor(1,0,0)        self._PrePickedProperty = None                # these record the previous mouse position        self._LastX = 0        self._LastY = 0        # the current interaction mode (Rotate, Pan, Zoom, etc)        self._Mode = None        self._ActiveButton = 0        # used by the LOD actors        self._DesiredUpdateRate = 15        self._StillUpdateRate = 0.0001        # private attributes        self.__oldFocus = None        self.__saveX = 0        self.__saveY = 0        self.__saveState = 0        self.__connected = 0  # is QT->VTK connection done?        # do special handling of some keywords:        # stereo, rw                stereo = 0                if kw.has_key('stereo'):            if kw['stereo']:                stereo = 1            del kw['stereo']        rw = None        if kw.has_key('rw'):            rw = kw['rw']            del kw['rw']        # create qt-level widget        apply(QWidget.__init__, (self,parent,name) + args, kw)        if rw: # user-supplied render window            self._RenderWindow = rw        else:            self._RenderWindow = vtk.vtkRenderWindow()        if stereo: # stereo mode            self._RenderWindow.StereoCapableWindowOn()            self._RenderWindow.SetStereoTypeToCrystalEyes()         # do all the necessary qt setup        self.setBackgroundMode(2) # NoBackground        self.setMouseTracking(1) # get all mouse events        self.setFocusPolicy(2) # ClickFocus        if parent == None:            self.show()                if self.isVisible():            if self.__connected == 0:                size = self.size()                self._RenderWindow.SetSize(size.width(),size.height())                self._RenderWindow.SetWindowInfo(str(int(self.winId())))                self.__connected = 1    def show(self):        QWidget.show(self)        self.repaint() # needed for initial contents display on Win32    def paintEvent(self,ev):        if self.isVisible():            if self.__connected == 0:                size = self.size()                self._RenderWindow.SetSize(size.width(),size.height())                self._RenderWindow.SetWindowInfo(str(int(self.winId())))                self.__connected = 1        if self.__connected:            self.Render()    def resizeEvent(self,ev):        self.repaint()    def enterEvent(self,ev):        if not self.hasFocus():            self.__oldFocus = self.focusWidget()            self.setFocus()    def leaveEvent(self,ev):        if (self.__saveState & 0x7) == 0 and self.__oldFocus:            self.__oldFocus.setFocus()            self.__oldFocus = None    def mousePressEvent(self,ev):        if self._Mode != None:            return        if (ev.button() == 2 or             ev.button() == 1 and ev.state() & 16):            self._Mode = "Zoom"            self._ActiveButton = ev.button()        elif (ev.button() == 4 or              ev.button() == 1 and ev.state() & 8):            self._Mode = "Pan"            self._ActiveButton = ev.button()        elif (ev.button() == 1):            self._Mode = "Rotate"            self._ActiveButton = ev.button()        if self._Mode != None:            self._RenderWindow.SetDesiredUpdateRate(self._DesiredUpdateRate)                self.UpdateRenderer(ev.x(),ev.y())    def mouseReleaseEvent(self,ev):        if self._Mode == None:            return        self._RenderWindow.SetDesiredUpdateRate(self._StillUpdateRate)        if self._CurrentRenderer:            self.Render()        if ev.button() == self._ActiveButton:            self._Mode = None            self._ActiveButton = 0    def mouseMoveEvent(self,ev):        self.__saveState = ev.state()        self.__saveX = ev.x()        self.__saveY = ev.y()        if self._Mode == "Pan":            self.Pan(ev.x(),ev.y())        elif self._Mode == "Rotate":            self.Rotate(ev.x(),ev.y())        elif self._Mode == "Zoom":            self.Zoom(ev.x(),ev.y())    def keyPressEvent(self,ev):        if ev.key() == ord('R'):            self.Reset(self.__saveX,self.__saveY)        if ev.key() == ord('W'):            self.Wireframe()        if ev.key() == ord('S'):            self.Surface()        if ev.key() == ord('P'):            self.PickActor(self.__saveX,self.__saveY)    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 GetZoomFactor(self):        return self._CurrentZoom    def GetRenderWindow(self):        return self._RenderWindow

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -