Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.ScreenPositionGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: ScreenPositionGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 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   
27 -class ScreenPositionParameters:
28 - def __init__(self):
29 30 # frustum (initial values - view portion of unit sphere) 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 # position/orientation 39 self.eye = (0.0, 0.0, 0.0) # observer position 40 self.center = (0.0, 0.0, -1.0) # center of gaze 41 self.up = (0.0, 1.0, 0.0) # up vector
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
49 -class ScreenPositionControlFrame(Tkinter.Frame):
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 # let columns expand 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 # quick frustum frame 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