From bcebcf4f38ce6abb6658bcb6bf1911b78afaf75e Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Fri, 4 Apr 2008 00:33:39 +0200 Subject: * host/inter: - added Drawable class. --- host/inter/drawable.py | 107 +++++++++++++++++++++++++++++++++++++++ host/inter/test/test_drawable.py | 47 +++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 host/inter/drawable.py create mode 100644 host/inter/test/test_drawable.py (limited to 'host') 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 ('', 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 () -- cgit v1.2.3