import argparse from dxfwrite import DXFEngine as dxf parser = argparse.ArgumentParser( description='Generate foldable boxes. Exports in .dxf format') parser.add_argument('length', metavar='l', type=float, help="inner length of box") parser.add_argument('width', metavar='w', type=float, help="inner width of box") parser.add_argument('height', metavar='h', type=float, help="inner height of box") parser.add_argument('thickness', metavar='t', type=float, help="thickness of material") parser.add_argument('output', metavar='o', type=str, help="output .dxf file") parser.add_argument('--lid', help="generate a lid") args = parser.parse_args() LENGTH = args.length WIDTH = args.width HEIGHT = args.height THICKNESS = args.thickness def add_line(start, end, c): drawing.add(dxf.line(start, end, color=c, layer='LINES')) drawing = dxf.drawing(args.output) drawing.add_layer('LINES') BLACK = 3 RED = 1 # bottom box add_line((THICKNESS,0), (LENGTH-THICKNESS,0), RED) add_line((0,0), (0,WIDTH), RED) add_line((LENGTH,0), (LENGTH,WIDTH), RED) add_line((THICKNESS,WIDTH), (LENGTH-THICKNESS,WIDTH), RED) add_line((THICKNESS,WIDTH/3), (THICKNESS*2,WIDTH/3), BLACK) add_line((THICKNESS*2,WIDTH/3), (THICKNESS*2,WIDTH/3*2), BLACK) add_line((THICKNESS*2,WIDTH/3*2), (THICKNESS,WIDTH/3*2), BLACK) add_line((THICKNESS,WIDTH/3*2), (THICKNESS,WIDTH/3), BLACK) add_line((LENGTH-THICKNESS,WIDTH/3), (LENGTH-THICKNESS*2,WIDTH/3), BLACK) add_line((LENGTH-THICKNESS*2,WIDTH/3), (LENGTH-THICKNESS*2,WIDTH/3*2), BLACK) add_line((LENGTH-THICKNESS*2,WIDTH/3*2), (LENGTH-THICKNESS,WIDTH/3*2), BLACK) add_line((LENGTH-THICKNESS,WIDTH/3*2), (LENGTH-THICKNESS,WIDTH/3), BLACK) # left side add_line((THICKNESS,0), (-HEIGHT,0), BLACK) add_line((-HEIGHT,0), (-HEIGHT, WIDTH), RED) add_line((-HEIGHT,WIDTH), (THICKNESS,WIDTH), BLACK) add_line((-HEIGHT,0), (-HEIGHT-THICKNESS,0), BLACK) add_line((-HEIGHT-THICKNESS,0), (-HEIGHT-THICKNESS, WIDTH), RED) add_line((-HEIGHT-THICKNESS,WIDTH), (-HEIGHT,WIDTH), BLACK) x = -HEIGHT-THICKNESS add_line((x,0), (x-HEIGHT/3,0), BLACK) add_line((x-HEIGHT/3,0), (x-HEIGHT/3,-THICKNESS), BLACK) add_line((x-HEIGHT/3,-THICKNESS), (x-HEIGHT/3*2,-THICKNESS), BLACK) add_line((x-HEIGHT/3*2,-THICKNESS), (x-HEIGHT/3*2,0), BLACK) add_line((x-HEIGHT/3*2,0), (x-HEIGHT,0), BLACK) add_line((x-HEIGHT,0), (x-HEIGHT,WIDTH/3), BLACK) add_line((x-HEIGHT,WIDTH/3), (x-HEIGHT-THICKNESS,WIDTH/3), BLACK) add_line((x-HEIGHT-THICKNESS,WIDTH/3), (x-HEIGHT-THICKNESS,WIDTH/3*2), BLACK) add_line((x-HEIGHT-THICKNESS,WIDTH/3*2), (x-HEIGHT,WIDTH/3*2), BLACK) add_line((x-HEIGHT,WIDTH/3*2), (x-HEIGHT,WIDTH), BLACK) add_line((x-HEIGHT,WIDTH), (x-HEIGHT/3*2,WIDTH), BLACK) add_line((x-HEIGHT/3*2,WIDTH), (x-HEIGHT/3*2,WIDTH+THICKNESS), BLACK) add_line((x-HEIGHT/3*2,WIDTH+THICKNESS), (x-HEIGHT/3,WIDTH+THICKNESS), BLACK) add_line((x-HEIGHT/3,WIDTH+THICKNESS), (x-HEIGHT/3,WIDTH), BLACK) add_line((x-HEIGHT/3,WIDTH), (x,WIDTH), BLACK) # right side add_line((LENGTH-THICKNESS,0), (LENGTH+HEIGHT,0), BLACK) add_line((LENGTH+HEIGHT,0), (LENGTH+HEIGHT, WIDTH), RED) add_line((LENGTH+HEIGHT, WIDTH), (LENGTH-THICKNESS,WIDTH), BLACK) add_line((LENGTH+HEIGHT,0), (LENGTH+HEIGHT+THICKNESS,0), BLACK) add_line((LENGTH+HEIGHT+THICKNESS,0), (LENGTH+HEIGHT+THICKNESS, WIDTH), RED) add_line((LENGTH+HEIGHT+THICKNESS,WIDTH), (LENGTH+HEIGHT,WIDTH), BLACK) x = LENGTH+HEIGHT+THICKNESS add_line((x,0), (x+HEIGHT/3,0), BLACK) add_line((x+HEIGHT/3,0), (x+HEIGHT/3,-THICKNESS), BLACK) add_line((x+HEIGHT/3,-THICKNESS), (x+HEIGHT/3*2,-THICKNESS), BLACK) add_line((x+HEIGHT/3*2,-THICKNESS), (x+HEIGHT/3*2,0), BLACK) add_line((x+HEIGHT/3*2,0), (x+HEIGHT,0), BLACK) add_line((x+HEIGHT,0), (x+HEIGHT,WIDTH/3), BLACK) add_line((x+HEIGHT,WIDTH/3), (x+HEIGHT+THICKNESS,WIDTH/3), BLACK) add_line((x+HEIGHT+THICKNESS,WIDTH/3), (x+HEIGHT+THICKNESS,WIDTH/3*2), BLACK) add_line((x+HEIGHT+THICKNESS,WIDTH/3*2), (x+HEIGHT,WIDTH/3*2), BLACK) add_line((x+HEIGHT,WIDTH/3*2), (x+HEIGHT,WIDTH), BLACK) add_line((x+HEIGHT,WIDTH), (x+HEIGHT/3*2,WIDTH), BLACK) add_line((x+HEIGHT/3*2,WIDTH), (x+HEIGHT/3*2,WIDTH+THICKNESS), BLACK) add_line((x+HEIGHT/3*2,WIDTH+THICKNESS), (x+HEIGHT/3,WIDTH+THICKNESS), BLACK) add_line((x+HEIGHT/3,WIDTH+THICKNESS), (x+HEIGHT/3,WIDTH), BLACK) add_line((x+HEIGHT/3,WIDTH), (x,WIDTH), BLACK) # back side add_line((THICKNESS,0), (THICKNESS,HEIGHT/-3), RED) add_line((THICKNESS,HEIGHT/-3), (THICKNESS,HEIGHT/-3*2), BLACK) add_line((THICKNESS,HEIGHT/-3*2), (THICKNESS,-HEIGHT), RED) add_line((THICKNESS,-HEIGHT), (LENGTH-THICKNESS,-HEIGHT), BLACK) add_line((LENGTH-THICKNESS,-HEIGHT), (LENGTH-THICKNESS,HEIGHT/-3*2), RED) add_line((LENGTH-THICKNESS,HEIGHT/-3*2), (LENGTH-THICKNESS,HEIGHT/-3), BLACK) add_line((LENGTH-THICKNESS,HEIGHT/-3), (LENGTH-THICKNESS,0), RED) add_line((THICKNESS,-HEIGHT/3), (THICKNESS*2,-HEIGHT/3), BLACK) add_line((THICKNESS*2,-HEIGHT/3), (THICKNESS*2,-HEIGHT/3*2), BLACK) add_line((THICKNESS*2,-HEIGHT/3*2), (THICKNESS,-HEIGHT/3*2), BLACK) add_line((WIDTH/-2+THICKNESS,0), (WIDTH/-2+THICKNESS,-HEIGHT), BLACK) add_line((WIDTH/-2+THICKNESS,-HEIGHT), (THICKNESS,-HEIGHT), BLACK) add_line((LENGTH-THICKNESS,-HEIGHT/3), (LENGTH-THICKNESS*2,-HEIGHT/3), BLACK) add_line((LENGTH-THICKNESS*2,-HEIGHT/3), (LENGTH-THICKNESS*2,-HEIGHT/3*2), BLACK) add_line((LENGTH-THICKNESS*2,-HEIGHT/3*2), (LENGTH-THICKNESS,-HEIGHT/3*2), BLACK) add_line((LENGTH+WIDTH/2-THICKNESS,0), (LENGTH+WIDTH/2-THICKNESS,-HEIGHT), BLACK) add_line((LENGTH+WIDTH/2-THICKNESS,-HEIGHT), (LENGTH-THICKNESS,-HEIGHT), BLACK) # front side add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT/3), RED) add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT/3*2), BLACK) add_line((THICKNESS,WIDTH), (THICKNESS,WIDTH+HEIGHT), RED) add_line((THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT), BLACK) add_line((LENGTH-THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), RED) add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), (LENGTH-THICKNESS,WIDTH+HEIGHT/3), BLACK) add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3), (LENGTH-THICKNESS,WIDTH), RED) add_line((THICKNESS,WIDTH+HEIGHT/3), (THICKNESS*2,WIDTH+HEIGHT/3), BLACK) add_line((THICKNESS*2,WIDTH+HEIGHT/3), (THICKNESS*2,WIDTH+HEIGHT/3*2), BLACK) add_line((THICKNESS*2,WIDTH+HEIGHT/3*2), (THICKNESS,WIDTH+HEIGHT/3*2), BLACK) add_line((WIDTH/-2+THICKNESS,WIDTH), (WIDTH/-2+THICKNESS,WIDTH+HEIGHT), BLACK) add_line((WIDTH/-2+THICKNESS,WIDTH+HEIGHT), (THICKNESS,WIDTH+HEIGHT), BLACK) add_line((LENGTH-THICKNESS,WIDTH+HEIGHT/3), (LENGTH-THICKNESS*2,WIDTH+HEIGHT/3), BLACK) add_line((LENGTH-THICKNESS*2,WIDTH+HEIGHT/3), (LENGTH-THICKNESS*2,WIDTH+HEIGHT/3*2), BLACK) add_line((LENGTH-THICKNESS*2,WIDTH+HEIGHT/3*2), (LENGTH-THICKNESS,WIDTH+HEIGHT/3*2), BLACK) add_line((LENGTH+WIDTH/2-THICKNESS,WIDTH), (LENGTH+WIDTH/2-THICKNESS,WIDTH+HEIGHT), BLACK) add_line((LENGTH+WIDTH/2-THICKNESS,WIDTH+HEIGHT), (LENGTH-THICKNESS,WIDTH+HEIGHT), BLACK) drawing.save()