odoo/bin/pychart/fill_style.py

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)