cylindertransport.py

changeset 8
63b6f80e09ef
parent 6
57f17c62c137
child 9
a01a3fd32073
--- a/cylindertransport.py	Mon Apr 03 05:21:33 2017 +0200
+++ b/cylindertransport.py	Mon Apr 03 09:10:41 2017 +0200
@@ -26,10 +26,42 @@
         self.cylinders = cylinders
         self.space_min = space_min
         self.font = FONTBASE + "arial.ttf"
-        self.scad = "// Color support only in compile mode (F5)\n"
+        self.width = 0 # will be calculated
+        self.scad = {
+            "tmpl": """// Color support only in compile mode (F5)
+// cylindertransport.py OpenSCAD script
+module tank(x, r, h) {
+  color("SteelBlue") render() { //rotate([90,0,0]) {
+    translate([x, r, r]) {
+        sphere(r = r); // bottom
+        cylinder(h = h-2*r, r = r);
+    }
+    translate([x, r, h-r]) {
+        sphere(r = r); // top
+        cylinder(h = r*1.4, r = r*0.25);
+    }
+  }
+}
+
+module spacer(x, r, rcyl, h) {
+  color("DarkGrey") render() { //rotate([90,0,0]) {
+    translate([x, r, rcyl]) {
+        difference() {
+            cylinder(h = h-2*rcyl, r = r);
+            cylinder(h = h-2*rcyl, r = r*0.8);
+        }
+    }
+  }
+}
+$fn = 10;
+""",
+            "spacer": "",
+            "cylinder": ""
+            }
         self.circles = []
         self.spacings = []
         self.margin = 20
+        self.scale3d = 0.1
 
     def calc_min(self, r_1, r_2):
         """
@@ -67,8 +99,9 @@
         r_1, r_2, r_3, label = self.calc_min(r_1, r_2)
         posx = self.margin + r_2 # start offset x
         self._circle(posx, r_2, label, 0.5)
-        self.scad += "spacer(%i, %i, %i, %i);\n" % (
-            posx, r_2, r_3, CYLINDER[self.cylinders[0]][1])
+        self.scad["spacer"] += "spacer(%f, %f, %f, %f);\n" % (
+            posx * self.scale3d, r_2 * self.scale3d, r_3 * self.scale3d,
+            CYLINDER[self.cylinders[0]][1] * self.scale3d)
         posx += offset(r_2, r_3)
 
         for i in range(0, len(self.cylinders) - 1):
@@ -77,29 +110,33 @@
             r_1, r_2, r_3, label = self.calc_min(r_1, r_2)
             # draw cylinder
             self._circle(posx, r_1, "Tank " + self.cylinders[i])
-            self.scad += "tank(%i, %i, %i);\n" % (
-                posx, r_1, CYLINDER[self.cylinders[i]][1])
+            self.scad["cylinder"] += "tank(%f, %f, %f);\n" % (
+                posx * self.scale3d, r_1 * self.scale3d,
+                CYLINDER[self.cylinders[i]][1] * self.scale3d)
             sx1 = posx + r_1
             posx += offset(r_1, r_2)
             # draw right spacer
             self._circle(posx, r_2, label, 0.5)
-            self.scad += "spacer(%i, %i, %i, %i);\n" % (
-                posx, r_2, r_1, CYLINDER[self.cylinders[i]][1])
+            self.scad["spacer"] += "spacer(%f, %f, %f, %f);\n" % (
+                posx * self.scale3d, r_2 * self.scale3d, r_1 * self.scale3d,
+                CYLINDER[self.cylinders[i]][1] * self.scale3d)
             posx += offset(r_2, r_3)
             sx2 = posx - r_3
             if i == (len(self.cylinders) - 2):
                 # draw last bottle
                 self._circle(posx, r_3, "Tank " + self.cylinders[i + 1])
-                self.scad += "tank(%i, %i, %i);\n" % (
-                    posx, r_3, CYLINDER[self.cylinders[i + 1]][1])
+                self.scad["cylinder"] += "tank(%f, %f, %f);\n" % (
+                    posx * self.scale3d, r_3 * self.scale3d,
+                    CYLINDER[self.cylinders[i + 1]][1] * self.scale3d)
                 posx += offset(r_2, r_3)
 
             self.spacings.append([sx1, sx2])
 
         # last bottle spacer pipe
         self._circle(posx, r_2, label, 0.5)
-        self.scad += "spacer(%i, %i, %i, %i);\n" % (
-            posx, r_2, r_3, CYLINDER[self.cylinders[-1]][1])
+        self.scad["spacer"] += "spacer(%f, %f, %f, %f);\n" % (
+            posx * self.scale3d, r_2 * self.scale3d, r_3 * self.scale3d,
+            CYLINDER[self.cylinders[-1]][1] * self.scale3d)
         return int(posx + r_2 + self.margin)
 
     def centertext(self, draw, posx, posy, txt, size):
@@ -115,8 +152,8 @@
         """
         Start the calculation and return rendered PIL image object
         """
-        width = self._calculate()
-        image = Image.new('1', (width, 250)) # create new image
+        self.width = self._calculate()
+        image = Image.new('1', (self.width, 250)) # create new image
         draw = ImageDraw.Draw(image)
         # draw calculated circles
         for posx, radius, txt, size in self.circles:
@@ -168,34 +205,11 @@
 
     if (options.scad != ""):
         with open(options.scad, "w") as fd:
-            fd.write("""// cylindertransport.py OpenSCAD script
-module tank(x, r, h) {
-    cap = r;
-    color("SteelBlue") render() rotate([90,0,0]) {
-    translate([x, r, cap]) {
-        sphere(r = r); // bottom
-        cylinder(h = h-2*cap, r = r);
-    }
-    translate([x, r, h-cap]) {
-        sphere(r = r); // top
-        cylinder(h = 30+cap, r = 25);
-    }
-    }
-}
-
-module spacer(x, r, rcylinder, h) {
-    cap = rcylinder;
-
-    color("DarkGrey") render() rotate([90,0,0])
-    translate([x, r, cap]) {
-        difference() {
-            cylinder(h = h-2*cap, r = r);
-            cylinder(h = h-2*cap, r = r-5);
-        }
-    }
-}
-$fn = 20;\n""")
-            fd.write(worker.scad)
+            fd.write(worker.scad["tmpl"])
+            fd.write("translate([%f,0,0]) {\n" % (((worker.width - 2 * worker.margin) / -2)*worker.scale3d)) # center the object
+            fd.write(worker.scad["cylinder"])
+            fd.write(worker.scad["spacer"])
+            fd.write("}\n")
 
 if __name__ == "__main__":
     run()

mercurial