cylindertransport.py

Mon, 03 Apr 2017 03:15:12 +0200

author
mdd
date
Mon, 03 Apr 2017 03:15:12 +0200
changeset 3
d8745f771267
parent 2
9ec8fa3d0348
child 4
f62562506053
permissions
-rw-r--r--

objectoriz0r with separate calculation and rendering

0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
1 from math import sqrt
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
2 from PIL import Image, ImageDraw, ImageFont
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
3 import argparse, sys
2
9ec8fa3d0348 cleanup
mdd
parents: 1
diff changeset
4 from data import CYLINDER, PIPES
9ec8fa3d0348 cleanup
mdd
parents: 1
diff changeset
5 from config import FONTBASE
1
14a420653a5f output openscad script
mdd
parents: 0
diff changeset
6
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
7 def offset(r1, r2):
2
9ec8fa3d0348 cleanup
mdd
parents: 1
diff changeset
8 return (2*sqrt(r1*r2))
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
9
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
10 class CylinderSpacerCalculator:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
11 def __init__(self, cylinders = ["10", "10"], space_min = 10):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
12 self.cylinders = cylinders
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
13 self.space_min = space_min
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
14 self.font = FONTBASE + "arial.ttf"
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
15 self.scad = "// Color support only in compile mode (F5)\n" +\
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
16 "include <cylindertransport.scad>\n"
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
17 self.circles = []
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
18 self.spacings = []
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
19 self.margin = 20
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
20
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
21 def calc_min(self, r1, r2):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
22 # stupider annaehreungsversuch, bis sich die beiden Tauchflaschen r1 und r2 nicht mehr beruehren
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
23 for p in PIPES:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
24 i = p[1] / 2
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
25 if i>r1 or i>r2:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
26 return None
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
27 x1 = offset(r1, i)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
28 x2 = offset(r2, i)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
29 x = (x1 + x2) - (r1+r2)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
30 if x >= self.space_min:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
31 print "%s Pipe (%.1fmm), Cylinder spacing: %imm" % (p[0], p[1], x)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
32 return [r1, i, r2, p[0]]
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
33 return None
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
34
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
35 def _circle(self, x, r, txt = "", size = 1.0):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
36 self.circles.append([
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
37 x, r, txt, size
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
38 ])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
39
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
40 def _calculate(self):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
41 # first bottle spacer
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
42 r1 = CYLINDER[self.cylinders[0]][0] / 2
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
43 r2 = CYLINDER[self.cylinders[1]][0] / 2
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
44 r1, r2, r3, dn = self.calc_min(r1, r2)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
45 x = self.margin + r2 # start offset x
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
46 self._circle(x, r2, dn, 0.5)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
47 self.scad += "spacer(%i, %i, %i, %i);\n" % (
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
48 x, r2, r3, CYLINDER[self.cylinders[0]][1])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
49 x = x + offset(r2, r3)
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
50
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
51 for i in range(0, len(self.cylinders)-1):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
52 r1 = CYLINDER[self.cylinders[i]][0] / 2
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
53 r2 = CYLINDER[self.cylinders[i+1]][0] / 2
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
54 r1, r2, r3, dn = self.calc_min(r1, r2)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
55 # draw cylinder
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
56 self._circle(x, r1, "Tank " + self.cylinders[i])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
57 self.scad += "tank(%i, %i, %i);\n" % (
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
58 x, r1, CYLINDER[self.cylinders[i]][1])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
59 sx1 = x+r1
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
60 x = x + offset(r1, r2)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
61 # draw right spacer
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
62 self._circle(x, r2, dn, 0.5)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
63 self.scad += "spacer(%i, %i, %i, %i);\n" % (
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
64 x, r2, r1, CYLINDER[self.cylinders[i]][1])
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
65 x = x + offset(r2, r3)
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
66 sx2 = x-r3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
67 if i == (len(self.cylinders) - 2):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
68 # draw last bottle
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
69 self._circle(x, r3, "Tank " + self.cylinders[i+1])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
70 self.scad += "tank(%i, %i, %i);\n" % (
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
71 x, r3, CYLINDER[self.cylinders[i+1]][1])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
72 x = x + offset(r2, r3)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
73
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
74 self.spacings.append([sx1, sx2])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
75
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
76 # last bottle spacer pipe
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
77 self._circle(x, r2, dn, 0.5)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
78 self.scad += "spacer(%i, %i, %i, %i);\n" % (
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
79 x, r2, r3, CYLINDER[self.cylinders[i+1]][1])
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
80 return int(x + r2 + self.margin)
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
81
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
82 def render_image(self):
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
83 width = self._calculate()
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
84 image = Image.new('1', (width, 250)) # create new image
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
85 draw = ImageDraw.Draw(image)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
86 # draw calculated circles
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
87 for circle in self.circles:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
88 x, r, txt, size = circle
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
89 draw.arc([x - r, 0, x + r, 2 * r], 0, 360, 'white')
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
90 if txt != "":
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
91 font = ImageFont.truetype(self.font, int(24 * size))
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
92 tox, toy = draw.textsize(txt, font=font)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
93 draw.text((x - tox / 2, r - toy / 2), txt, font=font, fill='#ffffff')
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
94
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
95 # draw the spacing between cylinders
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
96 spacerY1 = 200
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
97 spacerY2 = 220
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
98 for spacing in self.spacings:
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
99 sx1, sx2 = spacing
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
100 draw.line((sx1, spacerY1, sx1, spacerY2), fill='#ffffff')
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
101 draw.line((sx2, spacerY1, sx2, spacerY2), fill='#ffffff')
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
102 txt = "%imm" % (sx2 - sx1)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
103 font = ImageFont.truetype(FONTBASE+"arial.ttf", 12)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
104 tox, toy = draw.textsize(txt, font=font)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
105 draw.text((sx1 + (sx2 - sx1) / 2 - tox / 2,
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
106 spacerY2 + toy / 2), txt, font=font, fill='#ffffff')
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
107
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
108 return image
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
109
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
110 if __name__ == "__main__":
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
111 parser = argparse.ArgumentParser(description = \
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
112 "Calculate spacer pipes for pressure cylinder transport\n" +\
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
113 "Known cylinder types:\n" + ", ".join(sorted(CYLINDER.keys())) )
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
114 parser.add_argument('cylinders', metavar = 'cylinder',
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
115 type = str, nargs = '+', help = 'cylinder types')
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
116 parser.add_argument('--space', dest='space_min',
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
117 type = int, default=10,
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
118 help='minimum space between cylinders (mm)')
0
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
119
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
120 args = parser.parse_args()
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
121
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
122 for test in args.cylinders:
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
123 if not test in CYLINDER.keys():
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
124 print "Cylinder type '%s' is unknown" % test
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
125 sys.exit(1)
007bbb709982 cylinder transport spacer calculation
mdd
parents:
diff changeset
126
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
127 obj = CylinderSpacerCalculator(
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
128 args.cylinders, args.space_min)
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
129
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
130 image = obj.render_image()
1
14a420653a5f output openscad script
mdd
parents: 0
diff changeset
131 image.show()
14a420653a5f output openscad script
mdd
parents: 0
diff changeset
132
14a420653a5f output openscad script
mdd
parents: 0
diff changeset
133 print "\n------------ START SCAD SCRIPT ------------"
3
d8745f771267 objectoriz0r with separate calculation and rendering
mdd
parents: 2
diff changeset
134 print obj.scad + "------------ END SCAD SCRIPT ------------"

mercurial