#---------------------------------------------------------------------- # Name: wxPython.lib.vtk # Purpose: Provides a wrapper around the vtkRenderWindow from the # VTK Visualization Toolkit. Requires the VTK Python # extensions from http://www.kitware.com/ # # Author: Robin Dunn # # Created: 16-Nov-1999 # RCS-ID: $Id$ # Copyright: (c) 1999 by Total Control Software # Licence: wxWindows license #---------------------------------------------------------------------- try: # For Win32, from vtkpython import * except ImportError: try: # for Unix. Why they do it this way is anybody's guess... from libVTKCommonPython import * from libVTKGraphicsPython import * from libVTKImagingPython import * except ImportError: raise ImportError, "VTK extension module not found" from wxPython.wx import * import math #---------------------------------------------------------------------- class wxVTKRenderWindow(wxScrolledWindow): def __init__(self, parent, id, position=wxDefaultPosition, size=wxDefaultSize, style=0): wxScrolledWindow.__init__(self, parent, id, position, size, style) self.renderWindow = vtkRenderWindow() if wxPlatform != '__WXMSW__': # We can't get the handle in wxGTK until after the widget # is created, the window create event happens later so we'll # catch it there EVT_WINDOW_CREATE(self, self.OnCreateWindow) else: # but in MSW, the window create event happens durring the above # call to __init__ so we have to do it here. hdl = self.GetHandle() self.renderWindow.SetWindowInfo(str(hdl)) EVT_LEFT_DOWN (self, self.SaveClick) EVT_MIDDLE_DOWN(self, self.SaveClick) EVT_RIGHT_DOWN (self, self.SaveClick) EVT_LEFT_UP (self, self.Release) EVT_MIDDLE_UP (self, self.Release) EVT_RIGHT_UP (self, self.Release) EVT_MOTION (self, self.MouseMotion) def GetRenderer(self): self.renderWindow.GetRenderers().InitTraversal() return self.renderWindow.GetRenderers().GetNextItem() def GetRenderWindow(self): return self.renderWindow def OnPaint(self, event): dc = wxPaintDC(self) self.renderWindow.Render() def OnCreateWindow(self, event): hdl = self.GetHandle() self.renderWindow.SetWindowInfo(str(hdl)) def OnEraseBackground(self, event): pass def SaveClick(self, event): self.prev_x, self.prev_y = event.GetPositionTuple() self.CaptureMouse() def Release(self, event): self.ReleaseMouse() def MouseMotion(self, event): event.x, event.y = event.GetPositionTuple() size = self.GetClientSize() if event.LeftIsDown(): # rotate camera = self.GetRenderer().GetActiveCamera() camera.Azimuth(float(self.prev_x - event.x) / size.width * 360) camera.Elevation(float(event.y - self.prev_y) / size.width * 360) camera.OrthogonalizeViewUp() self.MotionUpdate(event) elif event.MiddleIsDown(): # pan camera = self.GetRenderer().GetActiveCamera() camera.Yaw(-float(self.prev_x - event.x) / size.width * 30) camera.Pitch(float(event.y - self.prev_y) / size.width * 30) camera.OrthogonalizeViewUp() self.MotionUpdate(event) elif event.RightIsDown(): # dolly camera = self.GetRenderer().GetActiveCamera() camera.Dolly(math.exp(float((event.x - self.prev_x) - \ (event.y - self.prev_y))/ \ size.width)) self.MotionUpdate(event) def MotionUpdate(self,event): renderer = self.GetRenderer() renderer.GetLights().InitTraversal() light = renderer.GetLights().GetNextItem() camera = renderer.GetActiveCamera() light.SetPosition(camera.GetPosition()) light.SetFocalPoint(camera.GetFocalPoint()) self.renderWindow.Render() self.prev_x = event.x self.prev_y = event.y