📄 qvtkrenderwidget.py
字号:
"""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 + -