module pill(length, bevel) { hull() { translate([0, 0, (-length / 2) + bevel]) sphere(r = bevel); translate([0, 0, (length / 2) - bevel]) sphere(r = bevel); } } module box_face(length, width, wall_thickness, bevel) { center_width = width - bevel * 2; center_length = length - bevel * 2; hull() { translate([-center_width / 2, -center_length / 2, 0]) pill(wall_thickness, bevel); translate([center_width / 2, -center_length / 2, 0]) pill(wall_thickness, bevel); translate([center_width / 2, center_length / 2, 0]) pill(wall_thickness, bevel); translate([-center_width / 2, center_length / 2, 0]) pill(wall_thickness, bevel); } } module channel(length, width, height) { union() { translate([0, 0, -height / 2 + wall_thickness / 2]) box_face(length, width, wall_thickness, bevel); translate([-width / 2 + wall_thickness / 2, 0, 0]) rotate([0, 90, 0]) box_face(length, height, wall_thickness, bevel); translate([width / 2 - wall_thickness / 2, 0, 0]) rotate([0, 90, 0]) box_face(length, height, wall_thickness, bevel); } } module box(length, width, height) { union() { channel(length, width, height); translate([0, -length / 2 + wall_thickness / 2, 0]) rotate([90, 0, 0]) box_face(height, width, wall_thickness, bevel); translate([0, length / 2 - wall_thickness / 2, 0]) rotate([90, 0, 0]) box_face(height, width, wall_thickness, bevel); } }