added much of the ruler application
[yourule] / ruler.py
diff --git a/ruler.py b/ruler.py
new file mode 100644 (file)
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("<?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)
+
+

Benjamin Mako Hill || Want to submit a patch?