--- /dev/null
+# 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("<?xml version='1.0' encoding='UTF-8'?>\n")
+ xml.write("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www .w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd \">\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)
+
+