]> git.mxchange.org Git - flightgear.git/blob - scripts/python/FGFSDemo.py
Updated to document the new 3d positional tags that are available for
[flightgear.git] / scripts / python / FGFSDemo.py
1 import Tix
2 from Tkconstants import *
3 from FlightGear import FlightGear
4
5 import sys
6 import socket
7
8 class PropertyField:
9     def __init__(self, parent, prop, label):
10         self.prop = prop
11         self.field = Tix.LabelEntry( parent, label=label,
12              options='''
13              label.width 30
14              label.anchor e
15              entry.width 30
16              ''' )
17         self.field.pack( side=Tix.TOP, padx=20, pady=2 )
18
19     def update_field(self,fgfs):
20         val = fgfs[self.prop]
21         self.field.entry.delete(0,'end')
22         self.field.entry.insert(0, val)
23     
24 class PropertyPage(Tix.Frame):
25     def __init__(self,parent,fgfs):
26         Tix.Frame.__init__(self,parent)
27         self.fgfs = fgfs
28         self.pack( side=Tix.TOP, padx=2, pady=2, fill=Tix.BOTH, expand=1 )
29         self.fields = []
30         
31     def addField(self, prop, label):
32         f = PropertyField(self, prop, label)
33         self.fields.append(f)
34
35     def update_fields(self):
36         for f in self.fields:
37             f.update_field(self.fgfs)
38             Tix.Frame.update(self)
39
40 class FGFSDemo(Tix.Frame):
41     def __init__(self,fgfs,root=None):
42         Tix.Frame.__init__(self,root)
43         z = root.winfo_toplevel()
44         z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
45         self.fgfs = fgfs
46         self.pack()
47         self.pages = {}
48         self.after_id = None
49         self.createWidgets()
50         self.update()
51
52     def createWidgets(self):
53         self.nb = Tix.NoteBook(self)
54         self.nb.add( 'sim', label='Simulation',
55                      raisecmd= lambda self=self: self.update_page() )
56         self.nb.add( 'view', label='View',
57                      raisecmd= lambda self=self: self.update_page() )
58         self.nb.add( 'loc', label='Location',
59                      raisecmd= lambda self=self: self.update_page() )
60         self.nb.add( 'weather', label='Weather',
61                      raisecmd= lambda self=self: self.update_page() )
62         self.nb.add( 'clouds', label='Clouds',
63                      raisecmd= lambda self=self: self.update_page() )
64         self.nb.add( 'velocities', label='Velocities',
65                      raisecmd= lambda self=self: self.update_page() )
66
67         page = PropertyPage( self.nb.sim, self.fgfs )
68         self.pages['sim'] = page
69         page.addField( '/sim/aircraft', 'Aircraft:')
70         page.addField( '/sim/startup/airport-id', 'Airport ID:')
71         page.addField( '/sim/time/gmt', 'Current time (GMT):')
72         page.addField( '/sim/startup/trim', 'Trim on ground (true/false):')
73         page.addField( '/sim/sound/audible', 'Sound enabled (true/false):')
74         page.addField( '/sim/startup/browser-app', 'Web browser:')
75
76         page = PropertyPage( self.nb.view, self.fgfs )
77         self.pages['view'] = page
78         page.addField( '/sim/view-mode', 'View mode:')
79         page.addField( "/sim/current-view/field-of-view", "Field of view (deg):" )
80         page.addField( "/sim/current-view/pitch-offset-deg", "View pitch offset (deg):" )
81         page.addField( "/sim/current-view/heading-offset-deg", "View heading offset (deg):" )
82
83         page = PropertyPage( self.nb.loc, self.fgfs )
84         self.pages['loc'] = page
85         page.addField( "/position/altitude-ft", "Altitude (ft):" )
86         page.addField( "/position/longitude-deg", "Longitude (deg):" )
87         page.addField( "/position/latitude-deg", "Latitude (deg):" )
88         page.addField( "/orientation/roll-deg", "Roll (deg):" )
89         page.addField( "/orientation/pitch-deg", "Pitch (deg):" )
90         page.addField( "/orientation/heading-deg", "Heading (deg):" )
91
92         page = PropertyPage( self.nb.weather, self.fgfs )
93         self.pages['weather'] = page
94         page.addField("/environment/wind-from-heading-deg",
95                       "Wind direction (deg FROM):")
96         page.addField("/environment/params/base-wind-speed-kt",
97                       "Wind speed (kt):")
98         page.addField("/environment/params/gust-wind-speed-kt",
99                       "Maximum gust (kt):")
100         page.addField("/environment/wind-from-down-fps",
101                       "Updraft (fps):")
102         page.addField("/environment/temperature-degc", "Temperature (degC):")
103         page.addField("/environment/dewpoint-degc", "Dewpoint (degC):")
104         page.addField("/environment/pressure-sea-level-inhg",
105                       "Altimeter setting (inHG):")
106
107         page = PropertyPage( self.nb.clouds, self.fgfs )
108         self.pages['clouds'] = page
109         page.addField("/environment/clouds/layer[0]/type",
110                       "Layer 0 type:")
111         page.addField("/environment/clouds/layer[0]/elevation-ft",
112                       "Layer 0 height (ft):")
113         page.addField("/environment/clouds/layer[0]/thickness-ft",
114                       "Layer 0 thickness (ft):")
115         page.addField("/environment/clouds/layer[1]/type",
116                       "Layer 1 type:")
117         page.addField("/environment/clouds/layer[1]/elevation-ft",
118                       "Layer 1 height (ft):")
119         page.addField("/environment/clouds/layer[1]/thickness-ft",
120                       "Layer 1 thickness (ft):")
121         page.addField("/environment/clouds/layer[2]/type",
122                       "Layer 2 type:")
123         page.addField("/environment/clouds/layer[2]/elevation-ft",
124                       "Layer 2 height (ft):")
125         page.addField("/environment/clouds/layer[2]/thickness-ft",
126                       "Layer 2 thickness (ft):")
127         page.addField("/environment/clouds/layer[3]/type",
128                       "Layer 3 type:")
129         page.addField("/environment/clouds/layer[3]/elevation-ft",
130                       "Layer 3 height (ft):")
131         page.addField("/environment/clouds/layer[3]/thickness-ft",
132                       "Layer 3 thickness (ft):")
133         page.addField("/environment/clouds/layer[4]/type",
134                       "Layer 4 type:")
135         page.addField("/environment/clouds/layer[4]/elevation-ft",
136                       "Layer 4 height (ft):")
137         page.addField("/environment/clouds/layer[4]/thickness-ft",
138                       "Layer 4 thickness (ft):")
139
140         page = PropertyPage( self.nb.velocities, self.fgfs )
141         self.pages['velocities'] = page
142         page.addField("/velocities/airspeed-kt", "Airspeed (kt):")
143         page.addField("/velocities/speed-down-fps", "Descent speed (fps):")
144
145         self.nb.pack( expand=1, fill=Tix.BOTH, padx=5, pady=5, side=Tix.TOP )
146         
147         self.QUIT = Tix.Button(self)
148         self.QUIT['text'] = 'Quit'
149         self.QUIT['command'] = self.quitcmd
150         self.QUIT.pack({"side": "bottom"})
151
152     def quitcmd(self):
153         if self.after_id:
154             self.after_cancel(self.after_id)
155         #self.quit()
156         self.destroy()
157
158     def update_page(self):
159         page = self.pages[ self.nb.raised() ]
160         page.update_fields()
161         self.update()
162         self.after_id = self.after( 1000, lambda self=self: self.update_page() )
163
164 def main():
165     if len(sys.argv) != 3:
166         print 'Usage: %s host port' % sys.argv[0]
167         sys.exit(1)
168
169     host = sys.argv[1]
170     try:
171         port = int( sys.argv[2] )
172     except ValueError, msg:
173         print 'Error: expected a number for port'
174         sys.exit(1)
175     
176     fgfs = None
177     try:
178         fgfs = FlightGear( host, port )
179     except socket.error, msg:
180         print 'Error connecting to flightgear:', msg[1]
181         sys.exit(1)
182     
183     root = Tix.Tk()
184     app = FGFSDemo( fgfs, root )
185     app.mainloop()
186
187 if __name__ == '__main__':
188     main()
189