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

📄 wxvtkrenderwindow.py

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