1 from math import sqrt |
1 from math import sqrt |
2 from PIL import Image, ImageDraw, ImageFont |
2 from PIL import Image, ImageDraw, ImageFont |
3 import argparse, sys |
3 import argparse, sys |
|
4 from data import CYLINDER, PIPES |
|
5 from config import FONTBASE |
4 |
6 |
5 # pfad zu den TTF files (arial.ttf) |
7 SCADSCRIPT = "// Color support only in compile mode (F5)\ninclude <cylindertransport.scad>\n" |
6 FONTBASE = "/usr/share/fonts/truetype/msttcorefonts/" |
|
7 |
|
8 SPACE_MIN = 10 # minimum offset between bottles |
|
9 |
|
10 SCADSCRIPT = "include <cylindertransport.scad>\n" |
|
11 |
|
12 # Durchmesser, Laenge, Volumen und Gewicht der verfuegbaren Tauchflaschen |
|
13 CYLINDER = { |
|
14 "03" : [100, 515, 3, 4.7], |
|
15 "05" : [140, 466, 5, 5.7], |
|
16 "07" : [140, 605, 7, 8.8], |
|
17 "08" : [171, 490, 8, 10.4], |
|
18 "10" : [171, 595, 10, 12.4], |
|
19 "12S" : [204, 550, 12, 15.4], |
|
20 "12L" : [171, 690, 12, 14.5], |
|
21 "15" : [204, 640, 15, 18.1], |
|
22 } |
|
23 |
|
24 PIPES = [ |
|
25 ["DN8", 13.5], |
|
26 ["DN10", 17.2], |
|
27 ["DN15", 21.3], |
|
28 ["DN20", 26.9], |
|
29 ["DN25", 33.7], |
|
30 ["DN32", 42.4], |
|
31 ["DN40", 48.3], |
|
32 ["DN50", 60.3], |
|
33 ["DN65", 76.1], |
|
34 ["DN80", 88.9], |
|
35 ["DN100", 114.3], |
|
36 ["DN125", 139.7], |
|
37 ["DN150", 168.3], |
|
38 ] |
|
39 |
8 |
40 def offset(r1, r2): |
9 def offset(r1, r2): |
41 o = (2*sqrt(r1*r2)) |
10 return (2*sqrt(r1*r2)) |
42 #print "offset %i" % o |
|
43 return o |
|
44 |
11 |
45 def calc_min(r1, r2): |
12 def calc_min(r1, r2, space_min): |
46 # stupider annaehreungsversuch, bis sich die beiden Tauchflaschen r1 und r2 nicht mehr beruehren |
13 # stupider annaehreungsversuch, bis sich die beiden Tauchflaschen r1 und r2 nicht mehr beruehren |
47 #print "r1=%.0f r2=%.0f" % (r1, r2) |
|
48 for p in PIPES: |
14 for p in PIPES: |
49 i = p[1] / 2 |
15 i = p[1] / 2 |
50 if i>r1 or i>r2: |
16 if i>r1 or i>r2: |
51 print "spacer radius > r1 or r2, abort" |
17 print "spacer radius > r1 or r2, abort" |
52 return None |
18 return None |
53 x1 = offset(r1, i) |
19 x1 = offset(r1, i) |
54 x2 = offset(r2, i) |
20 x2 = offset(r2, i) |
55 x = (x1 + x2) - (r1+r2) |
21 x = (x1 + x2) - (r1+r2) |
56 if x >= SPACE_MIN: |
22 if x >= space_min: |
57 print "%s Pipe (%.1fmm), Cylinder spacing: %imm" % (p[0], p[1], x) |
23 print "%s Pipe (%.1fmm), Cylinder spacing: %imm" % (p[0], p[1], x) |
58 return [r1, i, r2, p[0]] |
24 return [r1, i, r2, p[0]] |
59 return None |
25 return None |
60 |
26 |
61 def circ(draw, x, r, txt = "", txtfactor = 1.0): |
27 def circ(draw, x, r, txt = "", txtfactor = 1.0): |
67 |
33 |
68 |
34 |
69 def draw_bottles(draw, args): |
35 def draw_bottles(draw, args): |
70 global SCADSCRIPT |
36 global SCADSCRIPT |
71 bottles = args.cylinders |
37 bottles = args.cylinders |
72 SPACE_MIN = args.space_min |
|
73 |
38 |
74 spacerY1 = 200 |
39 spacerY1 = 200 |
75 spacerY2 = 220 |
40 spacerY2 = 220 |
76 # first bottle spacer |
41 # first bottle spacer |
77 r1 = CYLINDER[bottles[0]][0] / 2 |
42 r1 = CYLINDER[bottles[0]][0] / 2 |
78 r2 = CYLINDER[bottles[1]][0] / 2 |
43 r2 = CYLINDER[bottles[1]][0] / 2 |
79 x = 20 + r1 # start offset x |
44 x = 20 + r1 # start offset x |
80 r1, r2, r3, dn = calc_min(r1, r2) |
45 r1, r2, r3, dn = calc_min(r1, r2, args.space_min) |
81 circ(draw, x, r2, dn, 0.5) |
46 circ(draw, x, r2, dn, 0.5) |
82 SCADSCRIPT = SCADSCRIPT + "spacer(%i, %i, %i, %i);\n" % ( |
47 SCADSCRIPT = SCADSCRIPT + "spacer(%i, %i, %i, %i);\n" % ( |
83 x, r2, r3, CYLINDER[bottles[0]][1]) |
48 x, r2, r3, CYLINDER[bottles[0]][1]) |
84 x = x + offset(r2, r3) |
49 x = x + offset(r2, r3) |
85 |
50 |
86 for i in range(0, len(bottles)-1): |
51 for i in range(0, len(bottles)-1): |
87 r1 = CYLINDER[bottles[i]][0] / 2 |
52 r1 = CYLINDER[bottles[i]][0] / 2 |
88 r2 = CYLINDER[bottles[i+1]][0] / 2 |
53 r2 = CYLINDER[bottles[i+1]][0] / 2 |
89 r1, r2, r3, dn = calc_min(r1, r2) |
54 r1, r2, r3, dn = calc_min(r1, r2, args.space_min) |
90 # draw bottle |
55 # draw bottle |
91 circ(draw, x, r1, "Tank "+bottles[i]) |
56 circ(draw, x, r1, "Tank "+bottles[i]) |
92 SCADSCRIPT = SCADSCRIPT + "tank(%i, %i, %i);\n" % ( |
57 SCADSCRIPT = SCADSCRIPT + "tank(%i, %i, %i);\n" % ( |
93 x, r1, CYLINDER[bottles[i]][1]) |
58 x, r1, CYLINDER[bottles[i]][1]) |
94 sx1 = x+r1 |
59 sx1 = x+r1 |
128 parser = argparse.ArgumentParser(description="Calculate spacer pipes for pressure cylinder transport\n" + |
93 parser = argparse.ArgumentParser(description="Calculate spacer pipes for pressure cylinder transport\n" + |
129 "Known cylinder types:\n" + ", ".join(sorted(CYLINDER.keys())) ) |
94 "Known cylinder types:\n" + ", ".join(sorted(CYLINDER.keys())) ) |
130 parser.add_argument('cylinders', metavar='cylinder', type=str, nargs='+', |
95 parser.add_argument('cylinders', metavar='cylinder', type=str, nargs='+', |
131 help='cylinder types') |
96 help='cylinder types') |
132 parser.add_argument('--space', dest='space_min', type=int, |
97 parser.add_argument('--space', dest='space_min', type=int, |
133 default=SPACE_MIN, |
98 default=10, |
134 help='minimum space between cylinders (mm)') |
99 help='minimum space between cylinders (mm)') |
135 |
100 |
136 args = parser.parse_args() |
101 args = parser.parse_args() |
137 |
102 |
138 for test in args.cylinders: |
103 for test in args.cylinders: |