]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wxPython/lib/vtk.py
7977b6c450d4d9ab34b2c65d837ab0fa74d1d028
[wxWidgets.git] / wxPython / wxPython / lib / vtk.py
1 #----------------------------------------------------------------------
2 # Name: wxPython.lib.vtk
3 # Purpose: Provides a wrapper around the vtkRenderWindow from the
4 # VTK Visualization Toolkit. Requires the VTK Python
5 # extensions from http://www.kitware.com/
6 #
7 # Author: Robin Dunn
8 #
9 # Created: 16-Nov-1999
10 # RCS-ID: $Id$
11 # Copyright: (c) 1999 by Total Control Software
12 # Licence: wxWindows license
13 #----------------------------------------------------------------------
14
15
16 try: # For Win32,
17 from vtkpython import *
18 except ImportError:
19 try: # for Unix. Why they do it this way is anybody's guess...
20 from libVTKCommonPython import *
21 from libVTKGraphicsPython import *
22 from libVTKImagingPython import *
23 except ImportError:
24 raise ImportError, "VTK extension module not found"
25
26 from wxPython.wx import *
27 import math
28
29 #----------------------------------------------------------------------
30
31 class wxVTKRenderWindow(wxScrolledWindow):
32 def __init__(self, parent, id, position=wxDefaultPosition,
33 size=wxDefaultSize, style=0):
34 wxScrolledWindow.__init__(self, parent, id, position, size, style)
35
36 self.renderWindow = vtkRenderWindow()
37
38 if wxPlatform != '__WXMSW__':
39 # We can't get the handle in wxGTK until after the widget
40 # is created, the window create event happens later so we'll
41 # catch it there
42 EVT_WINDOW_CREATE(self, self.OnCreateWindow)
43 else:
44 # but in MSW, the window create event happens durring the above
45 # call to __init__ so we have to do it here.
46 hdl = self.GetHandle()
47 self.renderWindow.SetWindowInfo(str(hdl))
48
49
50 EVT_LEFT_DOWN (self, self.SaveClick)
51 EVT_MIDDLE_DOWN(self, self.SaveClick)
52 EVT_RIGHT_DOWN (self, self.SaveClick)
53 EVT_LEFT_UP (self, self.Release)
54 EVT_MIDDLE_UP (self, self.Release)
55 EVT_RIGHT_UP (self, self.Release)
56 EVT_MOTION (self, self.MouseMotion)
57
58 EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
59 EVT_PAINT(self, self.OnPaint)
60
61
62 def GetRenderer(self):
63 self.renderWindow.GetRenderers().InitTraversal()
64 return self.renderWindow.GetRenderers().GetNextItem()
65
66
67 def GetRenderWindow(self):
68 return self.renderWindow
69
70
71 def OnPaint(self, event):
72 dc = wxPaintDC(self)
73 self.renderWindow.Render()
74
75 def OnCreateWindow(self, event):
76 hdl = self.GetHandle()
77 self.renderWindow.SetWindowInfo(str(hdl))
78
79 def OnEraseBackground(self, event):
80 pass
81
82
83
84 def SaveClick(self, event):
85 self.prev_x, self.prev_y = event.GetPositionTuple()
86 self.CaptureMouse()
87
88 def Release(self, event):
89 self.ReleaseMouse()
90
91 def MouseMotion(self, event):
92 event.x, event.y = event.GetPositionTuple()
93 size = self.GetClientSize()
94 if event.LeftIsDown():
95 # rotate
96 camera = self.GetRenderer().GetActiveCamera()
97 camera.Azimuth(float(self.prev_x - event.x) / size.width * 360)
98 camera.Elevation(float(event.y - self.prev_y) / size.width * 360)
99 camera.OrthogonalizeViewUp()
100 self.MotionUpdate(event)
101
102 elif event.MiddleIsDown():
103 # pan
104 camera = self.GetRenderer().GetActiveCamera()
105 camera.Yaw(-float(self.prev_x - event.x) / size.width * 30)
106 camera.Pitch(float(event.y - self.prev_y) / size.width * 30)
107 camera.OrthogonalizeViewUp()
108 self.MotionUpdate(event)
109
110 elif event.RightIsDown():
111 # dolly
112 camera = self.GetRenderer().GetActiveCamera()
113 camera.Dolly(math.exp(float((event.x - self.prev_x) - \
114 (event.y - self.prev_y))/ \
115 size.width))
116 self.MotionUpdate(event)
117
118
119 def MotionUpdate(self,event):
120 renderer = self.GetRenderer()
121 renderer.GetLights().InitTraversal()
122 light = renderer.GetLights().GetNextItem()
123 camera = renderer.GetActiveCamera()
124 light.SetPosition(camera.GetPosition())
125 light.SetFocalPoint(camera.GetFocalPoint())
126 self.renderWindow.Render()
127 self.prev_x = event.x
128 self.prev_y = event.y
129
130
131