1
2 """A visual player for simulation output based on libchamplain and its python bindings"""
3
4 import champlain
5 import clutter
6 import cairo
7 import math
8 import gobject
9 import threading
10 import time
11
12 import select
13 import sys
14 import struct
15
16 sys.path.append("..")
17 from mosp.geo.utm import utm_to_latlong
18 from mosp.monitors import PipePlayerMonitor
19
20 __author__ = "F. Ludwig, P. Tute"
21 __copyright__ = "2010-2011, DCSec, Leibniz Universitaet Hannover, Germany"
22 __license__ = "GPLv3"
23 __deprecated__ = True
24 __status__ = "unmaintained"
25
26
27 COLORS = {0: [0.1,0.1,0.9,1.0],
28 1: [0.9,0.1,0.1,1.0],
29 2: [0.1,0.9,0.1,1.0],
30 3: [0.5,0.0,0.5,1.0],
31 4: [0.0,1.0,1.0,1.0],
32 5: [0.6,0.6,0.0,1.0],
33 6: [0.5,0.5,0.5,1.0],
34 7: [0.0,0.0,0.0,1.0]
35 }
36
37
39 """The AnimatedMarker extends the champlain.Marker"""
40 - def __init__(self, color=0, markersize=10) :
41 """Init the AnimatedMarker."""
42 champlain.Marker.__init__(self)
43 self.markersize = markersize
44 self.color = -1
45 self.texture = None
46 self.change_color(color)
47
49 """Change AnimatedMarker's color."""
50 if self.color != color:
51 self.color = color
52 if self.texture:
53
54 self.remove(self.texture)
55
56 self.texture = clutter.CairoTexture(self.markersize, self.markersize)
57 cr = self.texture.cairo_create()
58 cr.arc(self.markersize / 2.0, self.markersize / 2.0, self.markersize / 2.0,
59 0, 2 * math.pi)
60 cr.set_source_rgba(*COLORS[self.color])
61 cr.fill()
62 self.add(self.texture)
63
64
66 """The visual player based on libchamplain and its python bindings."""
67
68 - def __init__(self, width=640, height=480, init_zoom=14, markersize=10):
69 """Inits the Player."""
70 super(Player, self).__init__()
71 self.screensize=(width, height)
72 self.init_zoom = init_zoom
73 self.markersize = markersize
74
76 """On update, get new marker positions, update colors, ..."""
77 try:
78 s = select.select([sys.stdin], [], [], 0.0)
79 except IOError:
80 print 'assuming end of simulation'
81 return
82 while s[0]:
83 type = sys.stdin.read(1)
84 if type == '\x00':
85 data = sys.stdin.read(PipePlayerMonitor.FORMAT_LEN)
86 color, id, x, y = struct.unpack(PipePlayerMonitor.FORMAT, data)
87 coords = utm_to_latlong(x, y, self.zone)
88 self.markers[id].set_position(coords[1], coords[0])
89 self.markers[id].change_color(color)
90
91
92 elif type == '\x01':
93 t = struct.unpack('I', sys.stdin.read(4))[0]
94 self.date.set_text(str(t))
95 t %= 24000
96 op = None
97 if 4000 <= t <= 8000:
98 op = 120 - (t - 4000.0) / 4000 * 120
99 if 16000 <= t <= 20000:
100 op = (t - 16000.0) / 4000 * 120
101
102 if not op is None:
103 self.night.set_opacity(int(op))
104
105 s = select.select([sys.stdin], [], [], 0.0)
106
107 s = select.select([sys.stdin], [], [], 0.0)
108
109
110
111 gobject.timeout_add(50, self.update)
112
114 """Handle key presses."""
115 if event.keyval == clutter.keysyms.q:
116
117 clutter.main_quit()
118 if event.keyval in (clutter.keysyms.plus, clutter.keysyms.o):
119
120 self.actor.zoom_in()
121 if event.keyval in (clutter.keysyms.minus, clutter.keysyms.i):
122
123 self.actor.zoom_out()
124 elif event.keyval == clutter.keysyms.a:
125
126 for marker in self.markers:
127 marker.toggle_ant()
128 print event.keyval
129
131 """On resize resize also this ..."""
132 self.actor.set_size(int(stage.get_width()), int(stage.get_height()))
133 self.night.set_size(int(stage.get_width()), int(stage.get_height()))
134
136 """The window, stage, marker init and so on ..."""
137 global markers
138 gobject.threads_init()
139 clutter.init()
140 stage = clutter.Stage(default=True)
141 self.actor = champlain.View()
142 layer = champlain.Layer()
143
144 stage.connect("button-press-event", self.button_pressed)
145 stage.connect("key-press-event", self.key_press)
146
147 stage.set_user_resizable(True)
148 stage.connect("allocation-changed", self.resize_actor)
149
150 self.markers = []
151 self.num_marker = int(sys.stdin.readline())
152 self.minlat = float(sys.stdin.readline())
153 self.minlon = float(sys.stdin.readline())
154 self.maxlat = float(sys.stdin.readline())
155 self.maxlon = float(sys.stdin.readline())
156 self.zone = int(sys.stdin.readline())
157 print 'showing %i marker' % self.num_marker
158 for i in xrange(self.num_marker):
159 marker = AnimatedMarker(markersize=self.markersize)
160
161 layer.add(marker)
162 self.markers.append(marker)
163
164 bbox = champlain.Polygon()
165 bbox.append_point(self.minlat, self.minlon)
166 bbox.append_point(self.minlat, self.maxlon)
167 bbox.append_point(self.maxlat, self.maxlon)
168 bbox.append_point(self.maxlat, self.minlon)
169 bbox.set_stroke_width(1.0);
170 bbox.set_property("closed-path", True)
171 bbox.set_property("mark-points", True)
172 bbox.set_property("stroke-color", clutter.Color(red=64,green=64,blue=64,alpha=128))
173 self.actor.add_polygon(bbox)
174
175 self.POSITION = [ self.minlat+((self.maxlat-self.minlat)/2), self.minlon+(self.maxlon-self.minlon)/2]
176
177 stage.set_size(*self.screensize)
178 self.actor.set_size(*self.screensize)
179 stage.add(self.actor)
180
181 layer.show()
182 self.actor.add_layer(layer)
183
184
185 self.actor.set_property("zoom-level", self.init_zoom)
186 self.actor.set_property("scroll-mode", champlain.SCROLL_MODE_KINETIC)
187 self.actor.center_on(*self.POSITION)
188
189 self.night = clutter.Rectangle(clutter.Color(0, 0, 50))
190 self.night.set_size(*self.screensize)
191 self.night.set_opacity(120)
192 self.night.show()
193
194 if not '-n' in sys.argv:
195 stage.add(self.night)
196
197 self.date = clutter.Text()
198 self.date.set_text("Hello World")
199 stage.add(self.date)
200
201 stage.show()
202
203 gobject.timeout_add(200, self.update)
204
205 clutter.main()
206
210
211
212 if __name__ == '__main__':
213 p = Player(width=800, height=600, init_zoom=15, markersize=10)
214 p.main()
215