summaryrefslogtreecommitdiff
path: root/bin/pychart/axis.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/pychart/axis.py')
-rw-r--r--bin/pychart/axis.py241
1 files changed, 241 insertions, 0 deletions
diff --git a/bin/pychart/axis.py b/bin/pychart/axis.py
new file mode 100644
index 00000000000..64d3fd2409d
--- /dev/null
+++ b/bin/pychart/axis.py
@@ -0,0 +1,241 @@
+#
+# 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 font
+import pychart_util
+import chart_object
+import line_style
+import math
+import theme
+import axis_doc
+from pychart_types import *
+from types import *
+
+class T(chart_object.T):
+ keys = {
+ "tic_interval" : (IntervalType, None,
+ pychart_util.interval_desc("tick marks")),
+ "tic_len" : (UnitType, 6, """The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
+ "minor_tic_interval" : (IntervalType, None,
+ pychart_util.interval_desc("minor tick marks")),
+ "minor_tic_len" : (UnitType, 3, """The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
+ "line_style": (line_style.T, line_style.default,
+ "Specifies the style of axis and tick lines."),
+ "label": (types.StringType, "axis label",
+ "The descriptive string displayed below (or to the left of) the axis. <<font>>."),
+ "format": (FormatType, "%s",
+ """The format string for tick labels.
+ It can be a `printf' style format string, or
+ a single-parameter function that takes an X (or Y) value
+ and returns a string. """ +
+ pychart_util.string_desc),
+ "label_offset": (CoordOrNoneType, (None,None),
+ """The location for drawing the axis label,
+ relative to the middle point of the axis.
+ If the value is None, the label is displayed
+ below (or to the left of) of axis at the middle."""),
+ "tic_label_offset": (CoordType, (0,0),
+ """The location for drawing tick labels,
+ relative to the tip of the tick line."""),
+ "offset": (UnitType, 0,
+ """The location of the axis.
+ The value of 0 draws the
+ axis at the left (for the Y axis) or bottom (for the X axis)
+ edge of the drawing area.
+ """)
+ }
+
+class X(T):
+ keys = pychart_util.union_dict(T.keys,
+ {"draw_tics_above": (IntType, 0,
+ "If true, tick lines and labels are drawn above the axis line.")})
+ __doc__ = axis_doc.doc_x
+##AUTOMATICALLY GENERATED
+
+##END AUTOMATICALLY GENERATED
+ def draw_below(self, ar, can):
+ self.type_check()
+ self.tic_interval = self.tic_interval or ar.x_grid_interval
+ y_base = ar.loc[1] + self.offset
+
+ can.line(self.line_style, ar.loc[0], y_base,
+ ar.loc[0]+ ar.size[0], y_base)
+
+ tic_dic = {}
+ max_tic_height = 0
+
+ for i in ar.x_tic_points(self.tic_interval):
+ tic_dic[i] = 1
+ ticx = ar.x_pos(i)
+
+ str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
+
+ (total_height, base_height) = font.text_height(str)
+ max_tic_height = max(max_tic_height, total_height)
+
+ can.line(self.line_style, ticx, y_base, ticx, y_base-self.tic_len)
+ can.show(ticx+self.tic_label_offset[0],
+ y_base-self.tic_len-base_height+self.tic_label_offset[1],
+ str)
+
+ if self.minor_tic_interval:
+ for i in ar.x_tic_points(self.minor_tic_interval):
+ if tic_dic.has_key(i):
+ # a major tic was drawn already.
+ pass
+ else:
+ ticx = ar.x_pos(i)
+ can.line(self.line_style, ticx, y_base, ticx,
+ y_base-self.minor_tic_len)
+
+ self.draw_label(ar, can, y_base - self.tic_len - max_tic_height - 10)
+
+ def draw_above(self, ar, can):
+ y_base = ar.loc[1] + self.offset
+
+ tic_dic = {}
+ max_tic_height = 0
+
+ for i in ar.x_tic_points(self.tic_interval):
+ tic_dic[i] = 1
+ ticx = ar.x_pos(i)
+
+ str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
+
+ (total_height, base_height) = font.text_height(str)
+ max_tic_height = max(max_tic_height, total_height)
+
+ can.line(self.line_style, ticx, y_base, ticx, y_base + self.tic_len)
+ can.show(ticx+self.tic_label_offset[0],
+ y_base + self.tic_len + base_height + self.tic_label_offset[1],
+ str)
+
+ if self.minor_tic_interval:
+ for i in ar.x_tic_points(self.minor_tic_interval):
+ if tic_dic.has_key(i):
+ # a major tic was drawn already.
+ pass
+ else:
+ ticx = ar.x_pos(i)
+ can.line(self.line_style, ticx, y_base, ticx,
+ y_base + self.minor_tic_len)
+ self.draw_label(ar, can, y_base + self.tic_len + max_tic_height + 10)
+
+ def draw_label(self, ar, can, ylabel):
+ if self.label == None: return
+
+ str = "/hC/vM" + self.label
+ (label_height, base_height) = font.text_height(str)
+ xlabel = ar.loc[0] + ar.size[0]/2.0
+ if self.label_offset[0] != None:
+ xlabel += self.label_offset[0]
+ if self.label_offset[1] != None:
+ ylabel += self.label_offset[1]
+ can.show(xlabel, ylabel, str)
+
+ def draw(self, ar, can):
+ self.type_check()
+ self.tic_interval = self.tic_interval or ar.x_grid_interval
+ y_base = ar.loc[1] + self.offset
+ can.line(self.line_style, ar.loc[0], y_base,
+ ar.loc[0]+ ar.size[0], y_base)
+ if self.draw_tics_above:
+ self.draw_above(ar, can)
+ else:
+ self.draw_below(ar, can)
+class Y(T):
+ __doc__ = axis_doc.doc_y
+ keys = pychart_util.union_dict(T.keys,
+ {"draw_tics_right": (IntType, 0,
+ "If true, tick lines and labels are drawn right of the axis line.")})
+
+ def draw_left(self, ar, can):
+ x_base = ar.loc[0] + self.offset
+ xmin = 999999
+ tic_dic = {}
+ for i in ar.y_tic_points(self.tic_interval):
+ y_tic = ar.y_pos(i)
+ tic_dic[i] = 1
+ can.line(self.line_style, x_base, y_tic,
+ x_base - self.tic_len, y_tic)
+ str = pychart_util.apply_format(self.format, (i,), 0)
+ if self.tic_len > 0: str = "/hR" + str
+
+ tic_height, base_height = font.text_height(str)
+ x = x_base - self.tic_len + self.tic_label_offset[0]
+ can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
+ str)
+ xmin = min(xmin, x - font.text_width(str))
+
+ if self.minor_tic_interval:
+ for i in ar.y_tic_points(self.minor_tic_interval):
+ if tic_dic.has_key(i):
+ # a major tic line was drawn already.
+ pass
+ else:
+ y_tic = ar.y_pos(i)
+ can.line(self.line_style, x_base, y_tic,
+ x_base - self.minor_tic_len, y_tic)
+
+ self.draw_label(ar, can, xmin - theme.default_font_size/2.0)
+
+ def draw_right(self, ar, can):
+ x_base = ar.loc[0] + self.offset
+ xmax = 0
+ tic_dic = {}
+ for i in ar.y_tic_points(self.tic_interval):
+ y_tic = ar.y_pos(i)
+ tic_dic[i] = 1
+ can.line(self.line_style, x_base, y_tic,
+ x_base + self.tic_len, y_tic)
+ str = pychart_util.apply_format(self.format, (i,), 0)
+ if self.tic_len > 0: str = "/hL" + str
+
+ tic_height, base_height = font.text_height(str)
+ x = x_base + self.tic_len + self.tic_label_offset[0]
+ can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
+ str)
+ xmax = max(xmax, x + font.text_width(str))
+
+ if self.minor_tic_interval:
+ for i in ar.y_tic_points(self.minor_tic_interval):
+ if tic_dic.has_key(i):
+ # a major tic line was drawn already.
+ pass
+ else:
+ y_tic = ar.y_pos(i)
+ can.line(self.line_style, x_base, y_tic,
+ x_base + self.minor_tic_len, y_tic)
+
+ self.draw_label(ar, can, xmax + theme.default_font_size)
+
+ def draw_label(self, ar, can, xlabel):
+ if self.label == None:
+ return
+ ylabel = ar.loc[1] + ar.size[1] / 2
+ if self.label_offset[0] != None:
+ xlabel += self.label_offset[0]
+ if self.label_offset[1] != None:
+ ylabel += self.label_offset[1]
+ can.show(xlabel, ylabel, "/a90/hC" + self.label)
+
+ def draw(self, ar, can):
+ self.type_check()
+ self.tic_interval = self.tic_interval or ar.y_grid_interval
+
+ x_base = ar.loc[0] + self.offset
+ can.line(self.line_style, x_base, ar.loc[1], x_base, ar.loc[1]+ar.size[1])
+ if self.draw_tics_right:
+ self.draw_right(ar, can)
+ else:
+ self.draw_left(ar, can)