wxMSW and wxGTK. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5162 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#----------------------------------------------------------------------
 | 
						|
# 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
 | 
						|
 | 
						|
 | 
						|
 |