286 lines
9.8 KiB
Python
286 lines
9.8 KiB
Python
#
|
|
# 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)
|
|
|