Start battery case generator
This commit is contained in:
		
							
								
								
									
										85
									
								
								battery-case-generator.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										85
									
								
								battery-case-generator.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
#!/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)
 | 
			
		||||
 | 
			
		||||
GRID   = args.hole+args.padding
 | 
			
		||||
RADIUS = args.hole/2
 | 
			
		||||
DIMX   = 2*(args.dimension+2)*GRID
 | 
			
		||||
DIMY   = (args.dimension+2)*GRID
 | 
			
		||||
PI3    = math.pi/3
 | 
			
		||||
 | 
			
		||||
def draw_grid(cx, cy):
 | 
			
		||||
    for row in range(-int(args.dimension/2), int((args.dimension+1)/2)):
 | 
			
		||||
        cyr = cy+GRID*row*math.sin(PI3)
 | 
			
		||||
        num_col = args.dimension-abs(row)
 | 
			
		||||
        cxr = cx-.5*GRID*(num_col-1.0)
 | 
			
		||||
        for col in range(num_col):
 | 
			
		||||
            print('<circle cx="%.2f" cy="%.2f" r="%.2f" stroke="black" fill="none"/>' % (cxr+col*GRID, cyr, RADIUS))
 | 
			
		||||
 | 
			
		||||
def draw_plane(cx, cy, interior=False):
 | 
			
		||||
    radius = GRID*args.dimension*0.5+args.outside_padding
 | 
			
		||||
    if not interior:
 | 
			
		||||
        radius += args.thickness
 | 
			
		||||
    turtle       = svgturtle.SvgTurtle(cx, cy)
 | 
			
		||||
    turtle.penup()
 | 
			
		||||
    turtle.forward(radius)
 | 
			
		||||
    turtle.right(120)
 | 
			
		||||
    turtle.pendown()
 | 
			
		||||
    if interior:
 | 
			
		||||
        leg = (radius-args.horizontal_finger-args.kerf)/2
 | 
			
		||||
        for side in range(6):
 | 
			
		||||
            turtle.forward(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(leg)
 | 
			
		||||
            turtle.right(60)
 | 
			
		||||
    else:
 | 
			
		||||
        for side in range(6):
 | 
			
		||||
            turtle.forward(radius)
 | 
			
		||||
            turtle.right(60)
 | 
			
		||||
    print('<path d="%s" fill="none" stroke="black"/>' % turtle.to_s())
 | 
			
		||||
 | 
			
		||||
print('<svg viewBox="0 0 %.2f %.2f" width="%.2fmm" height="%.2fmm" stroke-width="0.1" xmlns="http://www.w3.org/2000/svg">' % (DIMX, DIMY, DIMX, DIMY))
 | 
			
		||||
draw_grid(GRID*(0.5*args.dimension+1), GRID*(0.5*args.dimension+1))
 | 
			
		||||
draw_plane(GRID*(0.5*args.dimension+1), GRID*(0.5*args.dimension+1), True)
 | 
			
		||||
draw_plane(GRID*(1.5*args.dimension+3), GRID*(0.5*args.dimension+1))
 | 
			
		||||
print('</svg>')
 | 
			
		||||
		Reference in New Issue
	
	Block a user