$fn = 72; pcb_width = 257.175; pcb_length = 95.250; module keyboard_base_plate(pcb_width, pcb_length) { pcb_clearance_edge = 1.0; pcb_clearance_bottom = 2.0; pcb_screw_hole_diameter = 1.5; thickness = 1.75; corner_radius = thickness / 4; case_color = [0.5, 0.5, 0.5, 1.0]; wall_width = pcb_width + 2 * (pcb_clearance_edge + thickness) - 2 * corner_radius; wall_length = pcb_length + 2 * (pcb_clearance_edge + thickness) - 2 * corner_radius; wall_height = 14.0; bottom_width = 2 * (pcb_clearance_edge) + pcb_width; bottom_length = 2 * (pcb_clearance_edge) + pcb_length; bottom_height = thickness; screw_holes = [ [ 4.8150, 85.7250], [ 66.7322, 85.7250], [161.8150, 85.7250], [238.2500, 85.7250], [ 61.7500, 47.6250], [138.2500, 47.6250], [214.2500, 47.6250], [ 20.0000, 9.5250], [123.8150, 9.5250], [238.2500, 9.5250] ]; module round_corner(translation, rotation) { color(case_color) translate(translation) rotate(rotation) rotate_extrude(angle=90) { intersection() { circle(r=corner_radius); square(corner_radius*2); } } } module round_edge(translation, rotation, length) { color(case_color) translate(translation) rotate(rotation) linear_extrude(length) intersection() { circle(r=corner_radius); square(corner_radius*2); } } module panel(translation, dimensions) { color(case_color) translate(translation) linear_extrude(dimensions[2]) square([dimensions[0], dimensions[1]], false); } module wall_corner(translation, rotation, radius, length) { color(case_color) translate(translation) rotate(rotation) linear_extrude(length) intersection() { circle(r=radius); square([radius, radius], false); } } module screw_post(translation, h, d1, d2) { color(case_color) translate(translation) difference() { cylinder(h=h, r=d1/2.0); cylinder(h=h, r=d2/2.0); } } module ridges(width, height) { horizontal = [ (bottom_length / 3), (bottom_length / 3) * 2 ]; vertical = [ (bottom_width / 3), (bottom_width / 3) * 2 ]; for (y = horizontal) { panel([0 - pcb_clearance_edge, y, 0], [bottom_width, width, height]); } for (x = vertical) { panel([x, 0 - pcb_clearance_edge, 0], [width, bottom_length, height]); } } /* Upper wall */ panel([-pcb_clearance_edge - thickness + corner_radius, pcb_clearance_edge + pcb_length, -thickness + corner_radius], [wall_width, thickness, wall_height + thickness - corner_radius]); /* Right wall */ panel([ pcb_clearance_edge + pcb_width, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [thickness, wall_length, wall_height + thickness - corner_radius]); /* Lower wall */ panel([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness, -thickness + corner_radius], [wall_width, thickness, wall_height + thickness - corner_radius]); /* Left wall */ panel([-pcb_clearance_edge - thickness, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [thickness, wall_length, wall_height + thickness - corner_radius]); /* Upper right wall corner */ wall_corner([thickness + pcb_clearance_edge + pcb_width - corner_radius, thickness + pcb_clearance_edge + pcb_length - corner_radius, -thickness + corner_radius], [0, 0, 0], corner_radius, wall_height + thickness - corner_radius); /* Lower right wall corner */ wall_corner([ thickness + pcb_clearance_edge + pcb_width - corner_radius, 0 - thickness - pcb_clearance_edge + corner_radius, -thickness + corner_radius], [0, 0, 270], corner_radius, wall_height + thickness - corner_radius); /* Lower left wall corner */ wall_corner([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [0, 0, 180], corner_radius, wall_height + thickness - corner_radius); /* Upper left wall corner */ wall_corner([-pcb_clearance_edge - thickness + corner_radius, pcb_clearance_edge + pcb_length + thickness - corner_radius, -thickness + corner_radius], [0, 0, 90], corner_radius, wall_height + thickness - corner_radius); /* Bottom plate */ panel([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness], [bottom_width + 2 * thickness - 2 * corner_radius, bottom_length + 2 * thickness - 2 * corner_radius, thickness]); /* Upper edge */ round_edge([-pcb_clearance_edge - thickness + corner_radius, pcb_clearance_edge + thickness + pcb_length - corner_radius, -thickness + corner_radius], [0, 90, 0], wall_width); /* Right edge */ round_edge([ pcb_clearance_edge + thickness + pcb_width - corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [270, 0, 0], wall_length); /* Lower edge */ round_edge([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [90, 180, 90], wall_width); /* Left edge */ round_edge([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [270, 90, 0], wall_length); /* Upper right corner */ round_corner([pcb_clearance_edge + thickness + pcb_width - corner_radius, pcb_clearance_edge + thickness + pcb_length - corner_radius, -thickness + corner_radius], [90, 90, 90]); /* Lower right corner */ round_corner([ pcb_clearance_edge + thickness + pcb_width - corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [180, 90, 90]); /* Lower left corner */ round_corner([-pcb_clearance_edge - thickness + corner_radius, -pcb_clearance_edge - thickness + corner_radius, -thickness + corner_radius], [-90, 90, 90]); /* Upper left corner */ round_corner([-pcb_clearance_edge - thickness + corner_radius, pcb_clearance_edge + thickness + pcb_length - corner_radius, -thickness + corner_radius], [0, 90, 90]); /* Screw holes */ for (screw_hole = screw_holes) { screw_post([screw_hole[0], screw_hole[1], 0], pcb_clearance_bottom * 2, pcb_screw_hole_diameter * 2, pcb_screw_hole_diameter); } /* Ridges (for rigidity!) */ ridges(thickness * 2, pcb_clearance_bottom / 2); } keyboard_base_plate(pcb_width, pcb_length);