1
2
3
4
5
6
7
8
9
10
11
12
13
14 """Handle 3D perspective projection (client-side)"""
15
16 import sys, os, pickle, math, string
17 import Tkinter, tkFileDialog
18 import Pyro.core
19 import VisionEgg.PyroClient
20 import StringIO
21
22 __version__ = VisionEgg.release_name
23 __cvs__ = string.split('$Revision$')[1]
24 __date__ = string.join(string.split('$Date$')[1:3], ' ')
25 __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
26
29
30
31 self.left = -0.2
32 self.right = 0.2
33 self.top = 0.2
34 self.bottom = -0.2
35 self.near = 0.2
36 self.far = 20.0
37
38
39 self.eye = (0.0, 0.0, 0.0)
40 self.center = (0.0, 0.0, -1.0)
41 self.up = (0.0, 1.0, 0.0)
42
43 -class CallbackEntry(Tkinter.Entry):
44 - def __init__(self,master=None,callback=None,**kw):
45 Tkinter.Entry.__init__(self,master, **kw)
46 self.bind('<Return>',callback)
47 self.bind('<Tab>',callback)
48
50 - def __init__(self, master=None, auto_connect=0, server_hostname='', server_port=7766, **kw):
51 Tkinter.Frame.__init__(self,master,**kw)
52 self.pyro_client = None
53 self.entry_width = 10
54 self.connected = 0
55 self.meta_params = ScreenPositionParameters()
56 self.loopable_variables = {}
57
58 row = 0
59 Tkinter.Label(self,
60 text="3D Perspective Calibration",
61 font=("Helvetica",12,"bold")).grid(row=row,column=0,columnspan=2)
62
63 row += 1
64 Tkinter.Label(self,
65 text="This dialog allows you to enter acheive "+\
66 "the proper perspective distortion for 3D scenes."
67 ).grid(row=row,column=0,columnspan=2)
68
69 if not auto_connect:
70 row += 1
71
72 connected_frame = Tkinter.Frame(self)
73 connected_frame.grid(row=row,column=0,columnspan=2,sticky=Tkinter.W+Tkinter.E)
74 connected_frame.columnconfigure(0,weight=1)
75 connected_frame.columnconfigure(1,weight=1)
76 connected_frame.columnconfigure(2,weight=1)
77
78 self.connected_label = Tkinter.Label(connected_frame,text="Server status: Not connected")
79 self.connected_label.grid(row=0,column=0)
80 Tkinter.Button(connected_frame,text="Connect",command=self.connect).grid(row=0,column=1)
81 Tkinter.Button(connected_frame,text="Quit server",command=self.quit_server).grid(row=0,column=2)
82
83 row += 1
84 param_frame = Tkinter.Frame(self)
85 param_frame.grid(row=row,column=0,sticky=Tkinter.N)
86 param_frame.columnconfigure(0,weight=1)
87 param_frame.columnconfigure(1,weight=1)
88
89 pf_row = 0
90 frustum_frame = Tkinter.Frame(param_frame)
91 frustum_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5)
92
93 ff_row = 0
94 Tkinter.Label(frustum_frame,
95 text="Viewing volume size",
96 font=("Helvetica",12,"bold")).grid(row=ff_row,column=0,columnspan=3,ipady=5)
97
98 ff_row += 1
99 Tkinter.Label(frustum_frame,text="Left:").grid(row=ff_row,column=0)
100 self.left_tk_var = Tkinter.DoubleVar()
101 self.left_tk_var.set(self.meta_params.left)
102 CallbackEntry(frustum_frame,
103 self.send_values,
104 width=self.entry_width,
105 textvariable=self.left_tk_var).grid(row=ff_row,column=1)
106
107 ff_row += 1
108 Tkinter.Label(frustum_frame,text="Right:").grid(row=ff_row,column=0)
109 self.right_tk_var = Tkinter.DoubleVar()
110 self.right_tk_var.set(self.meta_params.right)
111 CallbackEntry(frustum_frame,
112 self.send_values,
113 width=self.entry_width,
114 textvariable=self.right_tk_var).grid(row=ff_row,column=1)
115
116 ff_row += 1
117 Tkinter.Label(frustum_frame,text="Top:").grid(row=ff_row,column=0)
118 self.top_tk_var = Tkinter.DoubleVar()
119 self.top_tk_var.set(self.meta_params.top)
120 CallbackEntry(frustum_frame,
121 self.send_values,
122 width=self.entry_width,
123 textvariable=self.top_tk_var).grid(row=ff_row,column=1)
124
125 ff_row += 1
126 Tkinter.Label(frustum_frame,text="Bottom:").grid(row=ff_row,column=0)
127 self.bottom_tk_var = Tkinter.DoubleVar()
128 self.bottom_tk_var.set(self.meta_params.bottom)
129 CallbackEntry(frustum_frame,
130 self.send_values,
131 width=self.entry_width,
132 textvariable=self.bottom_tk_var).grid(row=ff_row,column=1)
133
134 ff_row += 1
135 Tkinter.Label(frustum_frame,text="Near:").grid(row=ff_row,column=0)
136 self.near_tk_var = Tkinter.DoubleVar()
137 self.near_tk_var.set(self.meta_params.near)
138 CallbackEntry(frustum_frame,
139 self.send_values,
140 width=self.entry_width,
141 textvariable=self.near_tk_var).grid(row=ff_row,column=1)
142
143 ff_row += 1
144 Tkinter.Label(frustum_frame,text="Far:").grid(row=ff_row,column=0)
145 self.far_tk_var = Tkinter.DoubleVar()
146 self.far_tk_var.set(self.meta_params.far)
147 CallbackEntry(frustum_frame,
148 self.send_values,
149 width=self.entry_width,
150 textvariable=self.far_tk_var).grid(row=ff_row,column=1)
151
152
153 qf_frame = Tkinter.Frame(frustum_frame)
154 qf_frame.grid(row=1,column=2,rowspan=ff_row)
155
156 qf_row = 0
157 Tkinter.Button(qf_frame,text="Taller",command=self.frustum_taller).grid(row=qf_row,column=0,columnspan=2)
158 qf_row += 1
159 Tkinter.Button(qf_frame,text="Narrower",command=self.frustum_narrower).grid(row=qf_row,column=0)
160 Tkinter.Button(qf_frame,text="Wider",command=self.frustum_wider).grid(row=qf_row,column=1)
161 qf_row += 1
162 Tkinter.Button(qf_frame,text="Shorter",command=self.frustum_shorter).grid(row=qf_row,column=0,columnspan=2)
163
164 qf_row = 0
165 Tkinter.Button(qf_frame,text="Up",command=self.frustum_up).grid(row=qf_row,column=2,columnspan=2)
166 qf_row += 1
167 Tkinter.Button(qf_frame,text="Left",command=self.frustum_left).grid(row=qf_row,column=2)
168 Tkinter.Button(qf_frame,text="Right",command=self.frustum_right).grid(row=qf_row,column=3)
169 qf_row += 1
170 Tkinter.Button(qf_frame,text="Down",command=self.frustum_down).grid(row=qf_row,column=2,columnspan=2)
171
172 pf_row += 1
173 lookat_frame = Tkinter.Frame(param_frame)
174 lookat_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5)
175
176 la_row = 0
177 Tkinter.Label(lookat_frame,
178 text="Viewing volume orientation",
179 font=("Helvetica",12,"bold")).grid(row=la_row,column=0,columnspan=3,ipady=5)
180
181 la_row += 1
182 Tkinter.Label(lookat_frame,text="eye X:").grid(row=la_row,column=0)
183 self.eye_x_tk_var = Tkinter.DoubleVar()
184 self.eye_x_tk_var.set(self.meta_params.eye[0])
185 CallbackEntry(lookat_frame,
186 self.send_values,
187 width=self.entry_width,
188 textvariable=self.eye_x_tk_var).grid(row=la_row,column=1)
189
190 la_row += 1
191 Tkinter.Label(lookat_frame,text="eye Y:").grid(row=la_row,column=0)
192 self.eye_y_tk_var = Tkinter.DoubleVar()
193 self.eye_y_tk_var.set(self.meta_params.eye[1])
194 CallbackEntry(lookat_frame,
195 self.send_values,
196 width=self.entry_width,
197 textvariable=self.eye_y_tk_var).grid(row=la_row,column=1)
198
199