#! /usr/bin/python import pygtk import gtk import gtk.gdk import gtk.glade import gobject import psycopg2 import time import datetime # Drawing functions are described in PyGTK tutorial # http://www.pygtk.org/pygtk2tutorial/index.html # in Chapter 12 about drawing # http://www.pygtk.org/pygtk2tutorial/ch-DrawingArea.html class Main: def __init__(self): self._connection = psycopg2.connect("dbname=tomus") self._glade = gtk.glade.XML("Visualize.glade") self._window = self._glade.get_widget('visualize') signals = { "program_exit": self.OnExit, "draw_event": self.OnDrawEvent, } self._glade.signal_autoconnect(signals) c = self._connection.cursor() c.execute("SELECT MIN(position[1]), MAX(position[1]), MIN(position[2]), MAX(position[2]), MIN(position[3]), MAX(position[3]) FROM sputnik.ccc23xml") i = c.fetchone() if None != i: y0 = gtk.Adjustment(value=0, lower=i[2], upper=i[3], step_incr=0.1, page_incr=1, page_size=0) y1 = gtk.Adjustment(value=0, lower=i[2], upper=i[3], step_incr=0.1, page_incr=1, page_size=0) self._glade.get_widget('x0').set_text(str(i[0])) self._glade.get_widget('x1').set_text(str(i[1])) self._glade.get_widget('z0').set_text(str(i[4])) self._glade.get_widget('z1').set_text(str(i[5])) self._glade.get_widget('y0').set_adjustment(y0) self._glade.get_widget('y1').set_adjustment(y1) self._connection.commit() c.close() self._window.show_all() self._gc = self._glade.get_widget('draw').get_style().fg_gc[gtk.STATE_NORMAL] def OnExit(self, widget): self._connection.close() self._connection = None gtk.main_quit() def OnDrawEvent(self, widget, event=None): if event.type != gtk.gdk.BUTTON_PRESS: return False if 1 == event.button: self.DrawTimeless(widget) elif 2 == event.button: self.DrawTimediff(widget) elif 3 == event.button: self.DrawTimesteps(widget) return True def DrawTimeless(self, widget): drawable = widget.window w = widget.allocation.width h = widget.allocation.height drawable.clear() x0 = float(self._glade.get_widget('x0').get_text()) x1 = float(self._glade.get_widget('x1').get_text()) z0 = float(self._glade.get_widget('z0').get_text()) z1 = float(self._glade.get_widget('z1').get_text()) y0 = self._glade.get_widget('y0').get_value() y1 = self._glade.get_widget('y1').get_value() c = self._connection.cursor() c.execute("SELECT position[1], position[3] FROM sputnik.ccc23xml WHERE %s <= position[2] AND position[2] <= %s", (y0, y1)) try: i = c.fetchone() while None != i: drawable.draw_point(self._gc, int(w*(float(i[0])-x0)/(x1-x0)), int(h*(float(i[1])-z0)/(z1-z0))) i = c.fetchone() except Error: pass self._connection.commit() c.close() def DrawTimediff(self, widget): drawable = widget.window w = widget.allocation.width h = widget.allocation.height drawable.clear() x0 = float(self._glade.get_widget('x0').get_text()) x1 = float(self._glade.get_widget('x1').get_text()) z0 = float(self._glade.get_widget('z0').get_text()) z1 = float(self._glade.get_widget('z1').get_text()) y0 = self._glade.get_widget('y0').get_value() y1 = self._glade.get_widget('y1').get_value() t0 = self._glade.get_widget('t0').get_text() t1 = self._glade.get_widget('t1').get_text() t2 = self._glade.get_widget('t2').get_text() t3 = self._glade.get_widget('t3').get_text() c = self._connection.cursor() c.execute("""SELECT a.id, a.x, a.z, b.x, b.z FROM (SELECT id, position[1] AS x, position[3] AS z FROM sputnik.ccc23xml WHERE %s::TIMESTAMP WITH TIME ZONE-0.5*%s::INTERVAL <= time AND time <= %s::TIMESTAMP WITH TIME ZONE+0.5*%s::INTERVAL) a LEFT OUTER JOIN (SELECT id, position[1] AS x, position[3] AS z FROM sputnik.ccc23xml WHERE %s::TIMESTAMP WITH TIME ZONE-0.5*%s::INTERVAL -%s::INTERVAL <= time AND time <= %s::TIMESTAMP WITH TIME ZONE+0.5*%s::INTERVAL -%s::INTERVAL) b ON a.id = b.id""", (t0, t2, t0, t2, t0, t2, t3, t0, t2, t3)) i = c.fetchone() while None != i: if i[3] == None or i[4] == None: drawable.draw_rectangle(self._gc, True, int(w*(float(i[1])-x0)/(x1-x0)), int(h*(float(i[2])-z0)/(z1-z0)), 2, 2) else: drawable.draw_line(self._gc, int(w*(float(i[1])-x0)/(x1-x0)), int(h*(float(i[2])-z0)/(z1-z0)),int(w*(float(i[3])-x0)/(x1-x0)), int(h*(float(i[4])-z0)/(z1-z0))) i = c.fetchone() self._connection.commit() c.close() def DrawTimesteps(self, widget): drawable = widget.window w = widget.allocation.width h = widget.allocation.height x0 = float(self._glade.get_widget('x0').get_text()) x1 = float(self._glade.get_widget('x1').get_text()) z0 = float(self._glade.get_widget('z0').get_text()) z1 = float(self._glade.get_widget('z1').get_text()) y0 = self._glade.get_widget('y0').get_value() y1 = self._glade.get_widget('y1').get_value() t0 = self._glade.get_widget('t0').get_text() t1 = self._glade.get_widget('t1').get_text() t2 = self._glade.get_widget('t2').get_text() t3 = self._glade.get_widget('t3').get_text() ta = datetime.datetime.fromtimestamp(time.mktime(time.strptime(t0, '%Y-%m-%d %H:%M:%S'))) tz = datetime.datetime.fromtimestamp(time.mktime(time.strptime(t1, '%Y-%m-%d %H:%M:%S'))) td = datetime.timedelta(0, float(t3.split(' ')[0])) while ta < tz: drawable.clear() c = self._connection.cursor() c.execute("""SELECT id, position[1] AS x, position[3] AS z FROM sputnik.ccc23xml WHERE %s::TIMESTAMP WITH TIME ZONE-0.5*%s::interval <= time AND time <= %s::TIMESTAMP WITH TIME ZONE+0.5*%s::INTERVAL""", (ta.__str__(), t2, ta.__str__(), t2)) i = c.fetchone() while None != i: drawable.draw_arc(self._gc, True, int(w*(float(i[1])-x0)/(x1-x0)), int(h*(float(i[2])-z0)/(z1-z0)), 2, 2, 0, 360*64) i = c.fetchone() time.sleep(1) print ta.__str__() ta += td self._connection.commit() c.close() program = Main() gtk.main()