$fn = 72; pcb_width = 257.175; pcb_height = 95.250; module keyboard_base_plate(pcb_width, pcb_height) { pcb_clearance_edge = 1.0; pcb_clearance_bottom = 2.0; pcb_screw_hole_diameter = 1.5; thickness = 2.0; wall_height = 14.0; corner_radius = thickness / 2.0; screw_holes = [ [ 4.8150, 85.7250], [ 47.4822, 85.7250], [ 85.8150, 85.7250], [123,8150, 85.7250], [161.8150, 85.7250], [199.8150, 85.7250], [251.3150, 66.6750], [ 22.5650, 47.6250], [118.8150, 47.6250], [157.3150, 47.6250], [ 4.7500, 28.5750], [ 29.7500, 28.5750], [227.8150, 28.5750], [251.8150, 28.5750], [ 42.8150, 9.5250], [ 85.8150, 9.5250], [123.8150, 9.5250], [161.8150, 9.5250], [200.3150, 9.5250] ]; module round_corner(translation, rotation) { translate(translation) rotate(rotation) rotate_extrude(angle=90) { intersection() { circle(r=corner_radius); square(corner_radius*2); } } } module round_edge(translation, rotation, length) { translate(translation) rotate(rotation) linear_extrude(length) intersection() { circle(r=corner_radius); square(corner_radius*2); } } module side(translation, dimensions) { translate(translation) linear_extrude(dimensions[2]) square([dimensions[0], dimensions[1]], false); } module wall_corner(translation, rotation, radius, length) { translate(translation) rotate(rotation) linear_extrude(length) intersection() { circle(r=radius); square([radius, radius], false); } } module screw_post(translation, h, d1, d2) { translate(translation) difference() { cylinder(h=h, r=d1/2.0); cylinder(h=h, r=d2/2.0); } } /* Upper right corner */ round_corner([2 * pcb_clearance_edge + pcb_width, 2 * pcb_clearance_edge + pcb_height, 0], [90, 90, 90]); /* Lower right corner */ round_corner([ 2 * pcb_clearance_edge + pcb_width, -2 * pcb_clearance_edge, 0], [180, 90, 90]); /* Lower left corner */ round_corner([-2 * pcb_clearance_edge, -2 * pcb_clearance_edge, 0], [-90, 90, 90]); /* Upper left corner */ round_corner([-2 * pcb_clearance_edge, 2 * pcb_clearance_edge + pcb_height, 0], [0, 90, 90]); /* Upper edge */ round_edge([-2 * pcb_clearance_edge, 2 * pcb_clearance_edge + pcb_height, 0], [0, 90, 0], 2 * thickness + pcb_width); /* Right edge */ round_edge([ 2 * pcb_clearance_edge + pcb_width, -2 * pcb_clearance_edge, 0], [270, 0, 0], 2 * thickness + pcb_height); /* Lower edge */ round_edge([-2 * pcb_clearance_edge, -2 * pcb_clearance_edge, 0], [90, 180, 90], 2 * thickness + pcb_width); /* Left edge */ round_edge([-2 * pcb_clearance_edge, -2 * pcb_clearance_edge, 0], [270, 90, 0], 2 * thickness + pcb_height); /* Upper right wall corner */ wall_corner([2 * pcb_clearance_edge + pcb_width, 2 * pcb_clearance_edge + pcb_height, 0], [0, 0, 0], corner_radius, wall_height); /* Lower right wall corner */ wall_corner([ 2 * pcb_clearance_edge + pcb_width, -2 * pcb_clearance_edge, 0], [0, 0, 270], corner_radius, wall_height); /* Lower left wall corner */ wall_corner([-2 * pcb_clearance_edge, -2 * pcb_clearance_edge, 0], [0, 0, 180], corner_radius, wall_height); /* Upper left wall corner */ wall_corner([-2 * pcb_clearance_edge, 2 * pcb_clearance_edge + pcb_height, 0], [0, 0, 90], corner_radius, wall_height); /* Upper wall */ side([-2 * pcb_clearance_edge, pcb_clearance_edge + pcb_height, 0], [2 * thickness + pcb_width, thickness, wall_height]); /* Right wall */ side([ pcb_clearance_edge + pcb_width, -2 * pcb_clearance_edge, 0], [thickness, 2 * thickness + pcb_height, wall_height]); /* Lower wall */ side([-2 * pcb_clearance_edge, 0 - pcb_clearance_edge - thickness, 0], [ 2 * thickness + pcb_width, thickness, wall_height]); /* Left wall */ side([ 0 - pcb_clearance_edge - thickness, -2 * pcb_clearance_edge, 0], [thickness, 2 * thickness + pcb_height, wall_height]); /* Bottom plate */ side([-2 * pcb_clearance_edge, -2 * pcb_clearance_edge, -thickness / 2], [2 * thickness + pcb_width, 2 * thickness + pcb_height, thickness]); /* Screw holes */ for (screw_hole = screw_holes) { screw_post([screw_hole[0], screw_hole[1], thickness], pcb_clearance_bottom * 2, pcb_screw_hole_diameter * 2, pcb_screw_hole_diameter); } } keyboard_base_plate(pcb_width, pcb_height);