diff options
| author | pinky <> | 2006-12-07 13:41:40 +0000 |
|---|---|---|
| committer | pinky <> | 2006-12-07 13:41:40 +0000 |
| commit | 004a0b996ff8f269451e07346f71a129a1f3fbaf (patch) | |
| tree | 48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/pychart/fill_style.py | |
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/pychart/fill_style.py')
| -rw-r--r-- | bin/pychart/fill_style.py | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/bin/pychart/fill_style.py b/bin/pychart/fill_style.py new file mode 100644 index 00000000000..1cddd3d9601 --- /dev/null +++ b/bin/pychart/fill_style.py @@ -0,0 +1,285 @@ +# +# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com) +# +# Jockey is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# Jockey is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +import pychart_util +import color +import line_style +import chart_object +import object_set +import types +import theme +import fill_style_doc +from pychart_types import * +from scaling import * + +_keys = { + "bgcolor" : (color.T, color.white, "The background color."), + "line_style": (line_style.T, line_style.default, + pychart_util.line_desc), + "line_interval": (NumType, 3, + "The interval between successive stitch lines.") + } + +class T(chart_object.T): + __doc__ = fill_style_doc.doc + keys = _keys +##AUTOMATICALLY GENERATED +##END AUTOMATICALLY GENERATED + def __str__(self): + s = name_table().lookup(self) + if s: + return s + return "<fillstyle: bg=%s line=%s interval=%s>" % \ + (self.bgcolor, self.line_style, self.line_interval) + +class Plain(T): + """This class just fills the region with solid background color. +Attributes line_style and line_interval are ignored.""" + def draw(self, can, x1, y1, x2, y2): + pass + +class Diag(T): + "This class fills the region with diagonal lines." + + def draw(self, can, x1, y1, x2, y2): + line_width = self.line_style.width + interval = self.line_interval * 1.414 + x1 -= line_width + y1 -= line_width + x2 += line_width + y2 += line_width + len = max(y2 - y1, x2 - x1) + curx = x1 - len + while curx < x2: + can.line(self.line_style, curx, y1, curx+len, y1+len) + curx += interval + +class Rdiag(T): + """Fills the region with diagonal lines, but tilted in the opposite +direction from fill_style.Diag.""" + def draw(self, can, x1, y1, x2, y2): + line_width = self.line_style.width + interval = self.line_interval * 1.414 + x1 -= line_width + y1 -= line_width + x2 += line_width + y2 += line_width + len = max(y2 - y1, x2 - x1) + curx = x1 + while curx < x2 + len: + can.line(self.line_style, curx, y1, curx-len, y1+len) + curx += interval + +class Vert(T): + "Fills the region with vertical lines" + def draw(self, can, x1, y1, x2, y2): + interval = self.line_interval + curx = x1 + while curx < x2: + can.line(self.line_style, curx, y1, curx, y2) + curx += interval + +class Horiz(T): + "Fills the region with horizontal lines" + def draw(self, can, x1, y1, x2, y2): + interval = self.line_interval + cury = y1 + while cury < y2: + can.line(self.line_style, x1, cury, x2, cury) + cury += interval + +class Stitch(T): + "Fills the region with horizontal and vertical lines." + def draw(self, can, x1, y1, x2, y2): + interval = self.line_interval + cury = y1 + while cury < y2: + can.line(self.line_style, x1, cury, x2, cury) + cury += interval + curx = x1 + while curx < x2: + can.line(self.line_style, curx, y1, curx, y2) + curx += interval + +class Wave(T): + "Fills the region with horizontal wavy lines." + def draw(self, can, x1, y1, x2, y2): + x1 = xscale(x1) + x2 = xscale(x2) + y1 = yscale(y1) + y2 = yscale(y2) + line_width = nscale(self.line_style.width) + interval = nscale(self.line_interval) + + can.set_line_style(self.line_style) + x1 -= line_width + x2 += line_width + cury = y1 + half = interval/2.0 + while cury < y2: + curx = x1 + can.newpath() + can.moveto(curx, cury) + while curx < x2: + can.lineto(curx + half, cury + half) + can.lineto(curx + interval, cury) + curx += interval + can.stroke() + cury += interval + +class Vwave(T): + """Fills the region with vertical wavy lines.""" + def draw(self, can, x1, y1, x2, y2): + x1 = xscale(x1) + x2 = xscale(x2) + y1 = yscale(y1) + y2 = yscale(y2) + line_width = nscale(self.line_style.width) + interval = nscale(self.line_interval) + + can.set_line_style(self.line_style) + y1 -= line_width + y2 += line_width + curx = x1 + half = interval/2.0 + while curx < x2: + cury = y1 + can.newpath() + can.moveto(curx, cury) + while cury < y2: + can.lineto(curx + half, cury + half) + can.lineto(curx, cury + interval) + cury += interval + can.stroke() + curx += interval + +class Lines(T): + """Fills the region with a series of short line segments.""" + def draw(self, can, x1, y1, x2, y2): + interval = nscale(self.line_interval) + cury = y1 + j = 0 + while cury < y2: + curx = x1 + if j % 2 == 1: + curx += interval/2.0 + while curx < x2: + can.line(self.line_style, curx, cury, curx+interval/2.0, cury) + curx += interval * 1.5 + j += 1 + cury += interval + +default = Plain() + +color_standards = object_set.T() +grayscale_standards = object_set.T() + +def _intern_both(style): + global color_standards, grayscale_standards + color_standards.add(style) + grayscale_standards.add(style) + return style + +def _intern_color(style): + global color_standards, grayscale_standards + color_standards.add(style) + return style + +def _intern_grayscale(style): + global color_standards, grayscale_standards + grayscale_standards.add(style) + return style + +black = _intern_both(Plain(bgcolor=color.gray_scale(0.0), line_style=None)) + +red = _intern_color(Plain(bgcolor=color.red)) +darkseagreen = _intern_color(Plain(bgcolor=color.darkseagreen)) +blue = _intern_color(Plain(bgcolor=color.blue)) +aquamarine1 = _intern_color(Plain(bgcolor=color.aquamarine1)) +gray70 = _intern_both(Plain(bgcolor=color.gray70, line_style=None)) +brown = _intern_color(Plain(bgcolor=color.brown)) +darkorchid = _intern_color(Plain(bgcolor=color.darkorchid)) +diag = _intern_both(Diag(line_style=line_style.T(cap_style=2))) +green = _intern_color(Plain(bgcolor=color.green)) +gray50 = _intern_both(Plain(bgcolor=color.gray50, line_style=None)) +white = _intern_both(Plain(bgcolor=color.gray_scale(1.0), line_style=None)) +goldenrod = _intern_color(Plain(bgcolor=color.goldenrod)) +rdiag = _intern_both(Rdiag(line_style=line_style.T(cap_style=2))) +vert = _intern_both(Vert(line_interval=1.8)) + +gray30 = _intern_both(Plain(bgcolor=color.gray30, line_style=None)) +gray20 = _intern_both(Plain(bgcolor=color.gray20, line_style=None)) +gray10 = _intern_both(Plain(bgcolor=color.gray10, line_style=None)) +diag2 = _intern_both(Diag(line_style=line_style.T(width=3, cap_style=2), + line_interval=6)) +rdiag2 = _intern_both(Rdiag(line_style=line_style.T(width=3, cap_style=2), + line_interval=6)) +yellow = _intern_color(Plain(bgcolor=color.yellow)) +diag3 = _intern_both(Diag(line_style=line_style.T(width=3, color=color.gray50, cap_style=2), + line_interval=6)) +horiz = _intern_both(Horiz(line_interval=1.8)) +gray90 = _intern_both(Plain(bgcolor=color.gray90, line_style=None)) +rdiag3 = _intern_both(Rdiag(line_style=line_style.T(width=3, + color=color.gray50, + cap_style=2), + line_interval=6)) + +wave = _intern_both(Wave(line_style=line_style.T(cap_style=2, join_style=1))) +vwave = _intern_both(Vwave(line_style=line_style.T(cap_style=2, join_style=1))) +stitch = _intern_both(Stitch(line_style=line_style.T(cap_style=2, join_style=1))) +lines = _intern_both(Lines(line_style=line_style.T())) + +diag_fine = _intern_both(Diag(line_style=line_style.T(width=0.75,cap_style=2), + line_interval = 1.5)) +diag2_fine = _intern_both(Diag(line_style=line_style.T(width=0.75, cap_style=2), + line_interval=1.5)) +diag3_fine = _intern_both(Diag(line_style=line_style.T(width=0.75, + color = color.gray50, + cap_style=2), + line_interval=1.5)) +rdiag_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75,cap_style=2), + line_interval = 1.5)) +rdiag2_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75, cap_style=2), + line_interval=1.5)) +rdiag3_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75, + color = color.gray50, + cap_style=2), + line_interval=1.5)) + +horiz_fine = _intern_both(Horiz(line_interval=1.5)) +vert_fine = _intern_both(Vert(line_interval=1.5)) + +# +# Fill styles for color charts. +# + +standards = None +_name_table = None + +def init(): + global standards, _name_table + if theme.use_color: + standards = color_standards + else: + standards = grayscale_standards + _name_table = None + +def name_table(): + global _name_table + if not _name_table: + _name_table = pychart_util.symbol_lookup_table(globals(), standards) + return _name_table + +init() +theme.add_reinitialization_hook(init) + |
