summaryrefslogtreecommitdiff
path: root/host/inter
diff options
context:
space:
mode:
authorNicolas Schodet2008-04-04 00:33:39 +0200
committerNicolas Schodet2008-04-04 00:33:39 +0200
commitbcebcf4f38ce6abb6658bcb6bf1911b78afaf75e (patch)
tree5cbcefa7f85ba3362bbff93079da378c931c8c58 /host/inter
parent93212cae352eeda68c18de406bfd696fb976cdaf (diff)
* host/inter:
- added Drawable class.
Diffstat (limited to 'host/inter')
-rw-r--r--host/inter/drawable.py107
-rw-r--r--host/inter/test/test_drawable.py47
2 files changed, 154 insertions, 0 deletions
diff --git a/host/inter/drawable.py b/host/inter/drawable.py
new file mode 100644
index 00000000..52f28dd5
--- /dev/null
+++ b/host/inter/drawable.py
@@ -0,0 +1,107 @@
+from math import sqrt, degrees
+import trans_matrix
+import Tkinter
+
+__all__ = ('Drawable', 'DrawableCanvas')
+
+class Drawable:
+ """Define a drawable area with embeded transformations."""
+
+ def __init__ (self, onto):
+ """Initialise the drawable."""
+ self.onto = onto
+ self.trans_matrix = trans_matrix.TransMatrix ()
+ self.items = [ ]
+ self.trans_apply = self.trans_matrix.apply
+ self.trans_apply_angle = self.trans_matrix.apply_angle
+ self.trans_apply_distance = self.trans_matrix.apply_distance
+ self.trans_rotate = self.trans_matrix.rotate
+ self.trans_translate = self.trans_matrix.translate
+ self.trans_scale = self.trans_matrix.scale
+
+ def __draw_rectangle (self, p1, p2, **kw):
+ p = self.trans_apply (p1, (p2[0], p1[1]), p2, (p1[0], p2[1]))
+ return self.onto.__draw_polygon (*p, **kw)
+
+ def __draw_line (self, *p, **kw):
+ p = self.trans_apply (*p)
+ return self.onto.__draw_line (*p, **kw)
+
+ def __draw_polygon (self, *p, **kw):
+ p = self.trans_apply (*p)
+ return self.onto.__draw_polygon (*p, **kw)
+
+ def __draw_circle (self, p, r, **kw):
+ p = self.trans_apply (p)
+ r = self.trans_apply_distance (r)
+ return self.onto.__draw_circle (p, r, **kw)
+
+ def __draw_arc (self, p, r, **kw):
+ p = self.trans_apply (p)
+ r = self.trans_apply_distance (r)
+ if 'start' in kw:
+ kw = kw.copy ()
+ kw['start'] = self.trans_apply_angle (kw['start'])
+ import math
+ return self.onto.__draw_arc (p, r, **kw)
+
+ def draw_rectangle (self, *p, **kw):
+ """Draw a rectangle."""
+ self.items.append (self.__draw_rectangle (*p, **kw))
+
+ def draw_line (self, *p, **kw):
+ """Draw a line."""
+ self.items.append (self.__draw_line (*p, **kw))
+
+ def draw_polygon (self, *p, **kw):
+ """Draw a line."""
+ self.items.append (self.__draw_polygon (*p, **kw))
+
+ def draw_circle (self, p, r, **kw):
+ """Draw a circle of the given radius centered on p."""
+ self.items.append (self.__draw_circle (p, r, **kw))
+
+ def draw_arc (self, p, r, **kw):
+ """Draw a arc of the given radius centered on p."""
+ self.items.append (self.__draw_arc (p, r, **kw))
+
+ def trans_reset (self):
+ """Reset transformations."""
+ self.trans_matrix.identity ()
+
+ def reset (self):
+ self.__delete (*self.items)
+ self.items = [ ]
+ self.trans_reset ()
+
+ def __delete (self, *list):
+ """Delete a list of items."""
+ self.onto.__delete (*list)
+
+
+class DrawableCanvas(Tkinter.Canvas):
+ """Extend a Tkinter.Canvas to use Drawable on it."""
+
+ def _Drawable__draw_line (self, *p, **kw):
+ return self.create_line (*p, **kw)
+
+ def _Drawable__draw_polygon (self, *p, **kw):
+ return self.create_polygon (*p, **kw)
+
+ def _Drawable__draw_circle (self, p, r, **kw):
+ p1 = (p[0] - r, p[1] - r)
+ p2 = (p[0] + r, p[1] + r)
+ return self.create_oval (p1, p2, **kw)
+
+ def _Drawable__draw_arc (self, p, r, **kw):
+ p1 = (p[0] - r, p[1] - r)
+ p2 = (p[0] + r, p[1] + r)
+ for k in ('start', 'extent'):
+ if k in kw:
+ kw = kw.copy ()
+ # Tk is working upside down.
+ kw[k] = -degrees (kw[k])
+ return self.create_arc (p1, p2, **kw)
+
+ def _Drawable__delete (self, *list):
+ self.delete (*list)
diff --git a/host/inter/test/test_drawable.py b/host/inter/test/test_drawable.py
new file mode 100644
index 00000000..ab1f8d05
--- /dev/null
+++ b/host/inter/test/test_drawable.py
@@ -0,0 +1,47 @@
+import sys
+sys.path.append (sys.path[0] + '/..')
+
+from drawable import *
+from math import pi
+
+class Test (Drawable):
+
+ def draw (self):
+ self.draw_rectangle ((0, 0), (5, 5), fill = 'red')
+ self.draw_rectangle ((20, 20), (50, 50), fill = '', outline = 'blue')
+ self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), fill = 'green')
+ self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), smooth = True)
+ self.draw_circle ((40, -40), 10)
+ self.draw_arc ((-40, 0), 20, start = pi / 4, extent = pi / 2)
+
+class App (DrawableCanvas):
+
+ def __init__ (self, master = None):
+ DrawableCanvas.__init__ (self, master)
+ self.pack (expand = True, fill = 'both')
+ self.test = Test (self)
+ self.bind ('<Configure>', self.resize)
+ self.animated = False
+ self.i = 0
+
+ def animate (self):
+ self.after (500, self.animate)
+ self.test.trans_rotate (-pi/12)
+ self.test.trans_translate ((10, 10))
+ self.test.trans_scale (1.05)
+ self.test.trans_translate ((self.w / 2, self.h / 2))
+ self.test.draw ()
+ self.test.trans_translate ((-self.w / 2, -self.h / 2))
+ self.i += 1
+ if self.i == 10:
+ self.test.reset ()
+
+ def resize (self, ev):
+ self.w, self.h = ev.width, ev.height
+ self.test.reset ()
+ if not self.animated:
+ self.animate ()
+ self.animated = True
+
+app = App ()
+app.mainloop ()