#!/usr/bin/env python3 import math import sys import argparse import svgturtle parser = argparse.ArgumentParser(description='Generate a hexagonal battery case') 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('--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('--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') args = parser.parse_args() assert (args.dimension % 2) == 1 BATTERY = { 'AAA': [10.5, 44.5], 'AA': [14.5, 50.5], 'C': [26.2, 50.0], 'D': [34.2, 61.5], } if args.hole in BATTERY: dim = BATTERY[args.hole] args.hole = dim[0] if args.height == None: args.height = dim[1] else: args.hole = float(args.hole) assert(args.height != None) args.kerf2 = args.kerf/2 args.grid = args.hole+args.padding args.radius = args.hole/2 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.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 args.n_ver_fingers = int(args.height/args.vertical_finger/2) args.vertical_finger = args.height/args.n_ver_fingers/2 DIMX = 2.9*args.grid*args.dimension DIMY = 3.8*args.grid*args.dimension PI3 = math.pi/3 def draw_grid(cx, cy): for row in range(-int(args.dimension/2), int((args.dimension+1)/2)): cyr = cy+args.grid*row*math.sin(PI3) num_col = args.dimension-abs(row) cxr = cx-.5*args.grid*(num_col-1.0) for col in range(num_col): print('' % (cxr+col*args.grid, cyr, args.radius)) def draw_plane(cx, cy, interior=False): if interior: edge = args.interior_edge else: edge = args.exterior_edge turtle = svgturtle.SvgTurtle(cx, cy) turtle.penup() turtle.forward(edge) turtle.right(120) turtle.pendown() if interior: for side in range(6): turtle.forward(args.interior_leg) turtle.left(90) turtle.forward(args.thickness) turtle.right(90) turtle.forward(args.horizontal_finger+args.kerf) turtle.right(90) turtle.forward(args.thickness) turtle.left(90) turtle.forward(args.interior_leg) turtle.right(60) else: for side in range(6): for finger in range(args.n_hor_fingers): turtle.forward(args.exterior_leg if finger == 0 else args.horizontal_finger+args.kerf) turtle.right(90) turtle.forward(args.thickness) turtle.left(90) turtle.forward(args.horizontal_finger-args.kerf) turtle.left(90) turtle.forward(args.thickness) turtle.right(90) turtle.forward(args.exterior_leg) turtle.right(60) print('' % turtle.to_s()) def draw_side(x0, y0, h, slots): turtle = svgturtle.SvgTurtle(x0, y0+args.thickness) for finger in range(args.n_hor_fingers): turtle.forward(args.exterior_leg-args.kerf if finger == 0 else args.horizontal_finger-args.kerf) turtle.left(90) turtle.forward(args.thickness) turtle.right(90) turtle.forward(args.horizontal_finger+args.kerf) turtle.right(90) turtle.forward(args.thickness) turtle.left(90) turtle.forward(args.exterior_leg-args.kerf-args.thickness) turtle.right(90) for finger in range(args.n_ver_fingers): turtle.forward(args.vertical_finger-(args.kerf/2 if finger==0 else args.kerf)) turtle.left(90) turtle.forward(args.thickness) turtle.right(90) turtle.forward(args.vertical_finger+args.kerf) turtle.right(90) if finger < args.n_ver_fingers-1: turtle.forward(args.thickness) turtle.left(90) turtle.forward(args.exterior_edge-args.thickness) turtle.right(90) for finger in range(args.n_ver_fingers): turtle.forward(args.vertical_finger-(args.kerf/2 if finger==0 else args.kerf)) turtle.left(90) turtle.forward(args.thickness) turtle.right(90) turtle.forward(args.vertical_finger+args.kerf) turtle.right(90) if finger < args.n_ver_fingers-1: turtle.forward(args.thickness) turtle.left(90) print('' % turtle.to_s()) for slot in slots: x = x0+args.exterior_slot y = y0+slot w = args.horizontal_finger-args.kerf h = args.thickness-args.kerf print('' % (x, y, w, h)) print('' % (DIMX, DIMY, DIMX, DIMY)) draw_grid(0.65*args.grid*args.dimension, 0.60*args.grid*args.dimension) draw_plane(0.65*args.grid*args.dimension, 0.60*args.grid*args.dimension, True) draw_grid(1.90*args.grid*args.dimension, 0.60*args.grid*args.dimension) draw_plane(1.90*args.grid*args.dimension, 0.60*args.grid*args.dimension, True) draw_plane(0.65*args.grid*args.dimension, 1.90*args.grid*args.dimension) draw_side(0.05*args.grid*args.dimension, 2.50*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) draw_side(0.75*args.grid*args.dimension, 2.50*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) draw_side(1.45*args.grid*args.dimension, 2.50*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) draw_side(2.15*args.grid*args.dimension, 2.50*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) draw_side(1.35*args.grid*args.dimension, 1.25*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) draw_side(2.05*args.grid*args.dimension, 1.25*args.grid*args.dimension, args.height, [args.height*.3, args.height*.7]) print('')