From d2a9a0b8e0095c80e467caeddf5e0393b9e04a15 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Wed, 24 Nov 2021 03:16:53 +0100 Subject: [PATCH] Rounded hexagons for interior planes --- battery-case-generator.py | 23 +++++++++++++++++------ svgturtle.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/battery-case-generator.py b/battery-case-generator.py index 246bf70..322360e 100755 --- a/battery-case-generator.py +++ b/battery-case-generator.py @@ -10,10 +10,12 @@ parser.add_argument('--dimension', default=5, type=int, help='Grid dimension') parser.add_argument('--height', type=float, help='Height of battery') parser.add_argument('--hole', default='AA', help='Hole diameter (mm or A, AA, AAA)') parser.add_argument('--kerf', default=.1, type=float, help='Kerf') -parser.add_argument('--horizontal-finger', default=10.0, type=float, help='Width of horizontal fingers') +parser.add_argument('--corner-length', default=4, help='Length of stretch corner in material thicknesses') +parser.add_argument('--stretch', default=1.05, type=float, help='Reduction factor of stretch material') +parser.add_argument('--horizontal-finger', default=5.0, type=float, help='Width of horizontal fingers') parser.add_argument('--vertical-finger', default=5.0, type=float, help='Width of vertical fingers') parser.add_argument('--padding', default=1.5, type=float, help='Padding around holes') -parser.add_argument('--outside-padding', default=2, type=float, help='Extra padding between holes and wall') +parser.add_argument('--outside-padding', default=4, type=float, help='Extra padding between holes and wall') parser.add_argument('--thickness', default=3.0, type=float, help='Thickness of material') parser.add_argument('--lid', default=0.2, type=float, help='How much extra play to give the lid') @@ -39,9 +41,13 @@ else: args.kerf2 = args.kerf/2 args.grid = args.hole+args.padding args.radius = args.hole/2 +args.corner = args.corner_length*args.thickness +args.corner_s = args.corner*args.stretch +args.corner_radius = 3*args.corner_s/math.pi +args.corner_inset = args.corner_s*math.sqrt(3)/math.pi args.interior_edge = args.grid*args.dimension*0.5+args.outside_padding args.exterior_edge = args.interior_edge+args.thickness -args.interior_leg = (args.interior_edge-args.horizontal_finger-args.kerf)/2 +args.interior_leg = (args.interior_edge-args.horizontal_finger-args.kerf)/2-args.corner_inset args.n_hor_fingers = int(args.exterior_edge/args.horizontal_finger/2) args.exterior_leg = (args.exterior_edge-(2*args.n_hor_fingers-1)*args.horizontal_finger+args.kerf)/2 args.exterior_slot = (args.exterior_edge-args.horizontal_finger+args.kerf)/2 @@ -49,6 +55,8 @@ args.n_ver_fingers = int(args.height/args.vertical_finger/2) args.vertical_finger = args.height/args.n_ver_fingers/2 args.slots = [args.vertical_finger*2.5-args.thickness*0.5, args.vertical_finger*4.5-args.thickness*0.5] +print(args, file=sys.stderr) + DIMX = 5.0*args.grid*args.dimension DIMY = 3.0*args.grid*args.dimension PI3 = math.pi/3 @@ -75,8 +83,9 @@ def draw_plane(cx, cy, interior=False): turtle.penup() turtle.forward(edge) turtle.right(120) - turtle.pendown() if interior: + turtle.forward(args.corner_inset) + turtle.pendown() for side in range(5): turtle.forward(args.interior_leg) turtle.left(90) @@ -87,9 +96,11 @@ def draw_plane(cx, cy, interior=False): turtle.forward(args.thickness) turtle.left(90) turtle.forward(args.interior_leg) - turtle.right(60) - turtle.forward(args.interior_edge) + turtle.circle(-args.corner_radius, 60, 5) + turtle.forward(args.interior_edge-2.0*args.corner_inset) + turtle.circle(-args.corner_radius, 60, 5) else: + turtle.pendown() for side in range(5): for finger in range(args.n_hor_fingers): turtle.forward(args.exterior_leg if finger == 0 else args.horizontal_finger+args.kerf) diff --git a/svgturtle.py b/svgturtle.py index 123fc07..4565256 100644 --- a/svgturtle.py +++ b/svgturtle.py @@ -40,6 +40,36 @@ class SvgTurtle(): def right(self, angle): self.heading = (self.heading + angle*self.cvtangle) % math.tau + def circle(self, radius, extent=360, steps=None): + if steps: + w = 1.0*extent/steps + w2 = 0.5*w + l = 2.0*radius*math.sin(w2*math.pi/180.0) + if radius < 0: + l, w, w2 = -l, -w, -w2 + self.left(w2) + for i in range(steps): + self.forward(l) + self.left(w) + self.right(w2) + else: + ra = extent*self.cvtangle + h = self.heading-.5*ra if radius>0 else self.heading+.5*ra + dx = abs(radius)*math.cos(h) + dy = abs(radius)*math.sin(h) + lg = 1 if extent >= 180 else 0 + sw = 0 if radius > 0 else 1 + if self.pen: + self.path += " a %.2f %.2f %.2f %d %d %.2f %.2f" % (radius, radius, extent, lg, sw, dx, dy) + elif self.path != '': + self.path += " m %.2f, %.2f" % (dx, dy) + self.x += dx + self.y += dy + if radius > 0: + self.left(extent) + else: + self.right(extent) + def to_s(self): return self.path