X-Git-Url: https://projects.mako.cc/source/yourule/blobdiff_plain/9ba5d300368cf7b4f7c49cfce16880eb92f0f8b9..769e51f5d2f06c6e40a09378b9c127d21d65c8f5:/ruler.py diff --git a/ruler.py b/ruler.py new file mode 100644 index 0000000..39bcd3d --- /dev/null +++ b/ruler.py @@ -0,0 +1,78 @@ +# define the length of things +from __future__ import division +import SVGdraw + +class Ruler: + def __init__(self, scale=None, units=None, + ruler_height=None, ruler_length=None): + + # default values come from OLPC + self.scale = scale or 78.740 + self.units = units or 'centimeters' + self.ruler_height = ruler_height or 200 + self.ruler_length = ruler_length or 15 + + font_height = 22 + + self.drawing = SVGdraw.drawing() + self.svg = SVGdraw.svg() + + # create the body of the ruler + body = SVGdraw.rect(0, 0, + (self.scale * self.ruler_length), + self.ruler_height, "white", "black", 2) + self.svg.addElement(body) + + # add a units label + units = SVGdraw.text((self.scale / 2), + (self.ruler_height - self.scale / 5), + self.units, font_height) + self.svg.addElement(units) + + self.point = 0.0 + + + # find the appropriate subunit marker + self.subunit_marks = 1 + + while self.scale / self.subunit_marks >= font_height * 3: + if self.subunit_marks == 1: + self.subunit_marks += 3 + else: + self.subunit_marks = self.subunit_marks * 2 + + # for every unit + for i in range(self.ruler_length): + + # place subunit marks + for i2 in range(self.subunit_marks): + self.__drawline(0.3) + + self.__drawline(0.6) + self.svg.addElement(SVGdraw.text((self.point - font_height * 1.4), + (self.ruler_height * 0.6 - 5), + str(i + 1), font_height)) + + + self.drawing.setSVG(self.svg) + + def output(self): + import cStringIO + xml = cStringIO.StringIO() + xml.write("\n") + xml.write("\n") + self.svg.toXml(0,xml) + + return(xml.getvalue()) + + def write_svg_to_file(self, filename='output.svg'): + self.drawing.toXml(filename) + + def __drawline(self, size): + + self.point = self.point + (self.scale / (1 + self.subunit_marks)) + line = SVGdraw.line(self.point, 0, self.point, + (self.ruler_height * size), "black", 2) + self.svg.addElement(line) + +