📄 wxvtkrenderwindow.py
字号:
"""A simple VTK widget for wxPython. Note that wxPython comeswith its own wxVTKRenderWindow in wxPython.lib.vtk. Try bothand see which one works better for you.Find wxPython info at http://wxPython.orgCreated by David Gobbi, December 2001Based on vtkTkRenderWindget.py""""""Please see the example at the end of this file.----------------------------------------Creation:wxVTKRenderWindow(parent, ID, stereo=0, [wx keywords]):You should create a wxPySimpleApp() or some other wx**Appbefore creating the window.----------------------------------------Methods:Render()AddRenderer(ren)GetRenderers()GetRenderWindow()----------------------------------------Methods to override (all take a wxEvent):OnButtonDown(event) default: propagate event to Left, Right, MiddleOnLeftDown(event) default: set _Mode to 'Rotate'OnRightDown(event) default: set _Mode to 'Zoom'OnMiddleDown(event) default: set _Mode to 'Pan'OnButtonUp(event) default: propagate event to L, R, M and unset _ModeOnLeftUp(event)OnRightUp(event)OnMiddleUp(event)OnMotion(event) default: call appropriate handler for _ModeOnEnterWindow(event) default: set focus to this windowOnLeaveWindow(event) default: release focusOnKeyDown(event) default: [R]eset, [W]irefreme, [S]olid, [P]ickOnKeyUp(event)OnChar(event)OnSetFocus(event)OnKillFocus(event)OnSize(event)OnMove(event)OnPaint(event) default: Render()----------------------------------------Protected Members:_Mode: Current mode: 'Rotate', 'Zoom', 'Pan'_LastX, _LastY: The (x,y) coordinates of the previous event_CurrentRenderer: The renderer that was most recently clicked in_CurrentCamera: The camera for the current renderer----------------------------------------Private Members:__Handle: Handle to the window containing the vtkRenderWindow"""# import usual librariesimport math, os, sysfrom wxPython.wx import *from vtkpython import *# a few configuration items, see what works best on your system# Use wxGLCanvas as base class instead of wxWindow.# This is sometimes necessary under wxGTK or the image is blank.# (in wxWindows 2.3.1 and earlier, the GLCanvas had scroll bars)try: WX_USE_GL_CANVASexcept NameError: if wxPlatform == '__WXMSW__': WX_USE_GLCANVAS = 0 else: WX_USE_GLCANVAS = 1 # Keep capturing mouse after mouse is dragged out of window# (in wxGTK 2.3.2 there is a bug that keeps this from working,# but it is only relevant in wxGTK if there are multiple windows)try: WX_USE_X_CAPTUREexcept NameError: if wxPlatform == '__WXMSW__': WX_USE_X_CAPTURE = 1 else: WX_USE_X_CAPTURE = 0# end of configuration itemsif WX_USE_GLCANVAS: from wxPython.glcanvas import * baseClass = wxGLCanvaselse: baseClass = wxWindowclass wxVTKRenderWindow(baseClass): """ A wxRenderWindow for wxPython. Use GetRenderWindow() to get the vtkRenderWindow. Create with the keyword stereo=1 in order to generate a stereo-capable window. """ def __init__(self, parent, ID, *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 = vtkCellPicker() self._PickedActor = None self._PickedProperty = 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 = None # private attributes self.__OldFocus = None # used by the LOD actors self._DesiredUpdateRate = 15 self._StillUpdateRate = 0.0001 # First do special handling of some keywords: # stereo, position, size, width, height, style stereo = 0 if kw.has_key('stereo'): if kw['stereo']: stereo = 1 del kw['stereo'] position = wxDefaultPosition if kw.has_key('position'): position = kw['position'] del kw['position'] try: size = parent.GetSize() except AttributeError: size = wxDefaultSize if kw.has_key('size'): size = kw['size'] del kw['size'] if kw.has_key('width') and kw.has_key('height'): size = (kw['width'], kw['height']) del kw['width'] del kw['height'] # wxWANTS_CHARS says to give us e.g. TAB # wxNO_FULL_REPAINT_ON_RESIZE cuts down resize flicker under GTK style = wxWANTS_CHARS | wxNO_FULL_REPAINT_ON_RESIZE if kw.has_key('style'): style = style | kw['style'] del kw['style'] # the enclosing frame must be shown under GTK or the windows # don't connect together properly l = [] p = parent while p: # make a list of all parents l.append(p) p = p.GetParent() l.reverse() # sort list into descending order for p in l: p.Show(1) # initialize the wxWindow baseClass.__init__(self, parent, ID, position, size, style) # create the RenderWindow and initialize it self._RenderWindow = vtkRenderWindow() try: self._RenderWindow.SetSize(size.width, size.height) except AttributeError: self._RenderWindow.SetSize(size[0], size[1]) if stereo: self._RenderWindow.StereoCapableWindowOn() self._RenderWindow.SetStereoTypeToCrystalEyes() self.__handle = None # Tell the RenderWindow to render inside the wxWindow. if self.GetHandle(): self.__handle = self.GetHandle() self._RenderWindow.SetWindowInfo(str(self.__handle)) # refresh window by doing a Render EVT_PAINT(self, self.OnPaint) # turn off background erase to reduce flicker EVT_ERASE_BACKGROUND(self, lambda e: None) # Bind the events to the event converters EVT_RIGHT_DOWN(self, self._OnButtonDown) EVT_LEFT_DOWN(self, self._OnButtonDown) EVT_MIDDLE_DOWN(self, self._OnButtonDown) EVT_RIGHT_UP(self, self._OnButtonUp) EVT_LEFT_UP(self, self._OnButtonUp) EVT_MIDDLE_UP(self, self._OnButtonUp) EVT_MOTION(self, self.OnMotion) EVT_ENTER_WINDOW(self, self._OnEnterWindow) EVT_LEAVE_WINDOW(self, self._OnLeaveWindow) EVT_CHAR(self, self.OnChar) # If we use EVT_KEY_DOWN instead of EVT_CHAR, capital versions # of all characters are always returned. EVT_CHAR also performs # other necessary keyboard-dependent translations. EVT_CHAR(self, self.OnKeyDown) EVT_KEY_UP(self, self.OnKeyUp) EVT_SIZE(self, self._OnSize) EVT_MOVE(self, self.OnMove) EVT_SET_FOCUS(self, self.OnSetFocus) EVT_KILL_FOCUS(self, self.OnKillFocus) 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 OnPaint(self,event): dc = wxPaintDC(self) self.Render() def _OnSize(self,event): if wxPlatform != '__WXMSW__': try: width, height = event.GetSize() except: width = event.GetSize().width height = event.GetSize().height self._RenderWindow.SetSize(width, height) self.OnSize(event) self.Render() def OnSize(self, event): pass def OnMove(self,event): pass def _OnEnterWindow(self,event): self.UpdateRenderer(event) self.OnEnterWindow(event) def OnEnterWindow(self,event): if self.__OldFocus == None: self.__OldFocus = wxWindow_FindFocus() self.SetFocus() def _OnLeaveWindow(self,event): self.OnLeaveWindow(event) def OnLeaveWindow(self,event): if self.__OldFocus: self.__OldFocus.SetFocus() self.__OldFocus = None def OnSetFocus(self,event): pass def OnKillFocus(self,event): pass def _OnButtonDown(self,event): # helper function for capturing mouse until button released self._RenderWindow.SetDesiredUpdateRate(self._DesiredUpdateRate) if event.RightDown(): button = "Right" elif event.LeftDown(): button = "Left" elif event.MiddleDown(): button = "Middle" else: button = None # save the button and capture mouse until the button is released if button and not self._ActiveButton: self._ActiveButton = button if WX_USE_X_CAPTURE: self.CaptureMouse() self.OnButtonDown(event) def OnButtonDown(self,event): if not self._Mode: # figure out what renderer the mouse is over self.UpdateRenderer(event) if event.LeftDown(): self.OnLeftDown(event) elif event.RightDown(): self.OnRightDown(event) elif event.MiddleDown(): self.OnMiddleDown(event) def OnLeftDown(self,event): if not self._Mode:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -