]>
Commit | Line | Data |
---|---|---|
7b9da207 RD |
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 | ||
54b96882 | 31 | class wxVTKRenderWindow(wxScrolledWindow): |
7b9da207 RD |
32 | def __init__(self, parent, id, position=wxDefaultPosition, |
33 | size=wxDefaultSize, style=0): | |
54b96882 | 34 | wxScrolledWindow.__init__(self, parent, id, position, size, style) |
7b9da207 RD |
35 | |
36 | self.renderWindow = vtkRenderWindow() | |
37 | ||
d59efe01 RD |
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 | ||
7b9da207 RD |
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) | |
54b96882 | 56 | EVT_MOTION (self, self.MouseMotion) |
7b9da207 RD |
57 | |
58 | ||
59 | def GetRenderer(self): | |
60 | self.renderWindow.GetRenderers().InitTraversal() | |
61 | return self.renderWindow.GetRenderers().GetNextItem() | |
62 | ||
63 | ||
64 | def GetRenderWindow(self): | |
65 | return self.renderWindow | |
66 | ||
67 | ||
68 | def OnPaint(self, event): | |
69 | dc = wxPaintDC(self) | |
70 | self.renderWindow.Render() | |
71 | ||
54b96882 RD |
72 | def OnCreateWindow(self, event): |
73 | hdl = self.GetHandle() | |
74 | self.renderWindow.SetWindowInfo(str(hdl)) | |
75 | ||
76 | def OnEraseBackground(self, event): | |
77 | pass | |
78 | ||
79 | ||
7b9da207 RD |
80 | |
81 | def SaveClick(self, event): | |
82 | self.prev_x, self.prev_y = event.GetPositionTuple() | |
83 | self.CaptureMouse() | |
84 | ||
85 | def Release(self, event): | |
86 | self.ReleaseMouse() | |
87 | ||
88 | def MouseMotion(self, event): | |
89 | event.x, event.y = event.GetPositionTuple() | |
90 | size = self.GetClientSize() | |
91 | if event.LeftIsDown(): | |
92 | # rotate | |
93 | camera = self.GetRenderer().GetActiveCamera() | |
94 | camera.Azimuth(float(self.prev_x - event.x) / size.width * 360) | |
95 | camera.Elevation(float(event.y - self.prev_y) / size.width * 360) | |
96 | camera.OrthogonalizeViewUp() | |
97 | self.MotionUpdate(event) | |
98 | ||
99 | elif event.MiddleIsDown(): | |
100 | # pan | |
101 | camera = self.GetRenderer().GetActiveCamera() | |
102 | camera.Yaw(-float(self.prev_x - event.x) / size.width * 30) | |
103 | camera.Pitch(float(event.y - self.prev_y) / size.width * 30) | |
104 | camera.OrthogonalizeViewUp() | |
105 | self.MotionUpdate(event) | |
106 | ||
107 | elif event.RightIsDown(): | |
108 | # dolly | |
109 | camera = self.GetRenderer().GetActiveCamera() | |
110 | camera.Dolly(math.exp(float((event.x - self.prev_x) - \ | |
111 | (event.y - self.prev_y))/ \ | |
112 | size.width)) | |
113 | self.MotionUpdate(event) | |
114 | ||
115 | ||
116 | def MotionUpdate(self,event): | |
117 | renderer = self.GetRenderer() | |
118 | renderer.GetLights().InitTraversal() | |
119 | light = renderer.GetLights().GetNextItem() | |
120 | camera = renderer.GetActiveCamera() | |
121 | light.SetPosition(camera.GetPosition()) | |
122 | light.SetFocalPoint(camera.GetFocalPoint()) | |
123 | self.renderWindow.Render() | |
124 | self.prev_x = event.x | |
125 | self.prev_y = event.y | |
126 | ||
127 | ||
128 |