keyboard_switch_width = 19.0500; keyboard_switch_length = 19.0500; keyboard_switch_leg_length = 3.30; keyboard_switch_height = 11.10; keyboard_switch_sizes = [ [0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5], [1.25, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.25], [1.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.75], [1.0, 1.25, 1.25, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] ]; keyboard_pcb_width = 13.5 * keyboard_switch_width; keyboard_pcb_length = 5.0 * keyboard_switch_length; keyboard_pcb_height = 1.600; keyboard_pcb_screw_holes = [ [ 4.7625, 85.7250], [ 66.6750, 85.7250], [161.9250, 85.7250], [238.1250, 85.7250], [ 61.9125, 47.6250], [138.1125, 47.6250], [214.3125, 47.6250], [ 20.2406, 9.5250], [123.8250, 9.5250], [238.1250, 9.5250] ]; module keyboard_switch() { width = 14.00; length = 14.92; height = 11.10; cube([width, length, height], true); } module keyboard_deck(wall_width) { key_switch_footprint = [15.25, 15.25]; eps = 0.01; function add(v) = [for(p=v) 1]*v; function slice(v, x, y) = [for (i=[x:y]) v[i]]; function addrange(v, x, y) = add(slice(v, x, y)); module screw_holes() { pcb_screw_diameter = 2.5; for (screw_hole = keyboard_pcb_screw_holes) { translate([screw_hole[0], screw_hole[1], -eps]) cylinder(h=wall_width+2*eps, d=pcb_screw_diameter); } } module key_switch_plate(key_switch_size) { plate_width = keyboard_switch_width * key_switch_size; plate_length = keyboard_switch_length; if (key_switch_size <= 0.5) { cube([keyboard_switch_width * key_switch_size, keyboard_switch_length, wall_width]); } else { hole_width = key_switch_footprint[0]; hole_length = key_switch_footprint[1]; hole_x = plate_width / 2 - hole_width / 2; hole_y = plate_length / 2 - hole_length / 2; difference() { cube([plate_width + eps, plate_length + eps, wall_width]); translate([hole_x, hole_y, -eps]) cube([hole_width, hole_length, wall_width + 2*eps]); } } } module walls() { wall_height = keyboard_switch_height - wall_width; /* Upper */ translate([-wall_width, keyboard_pcb_length, 0]) cube([keyboard_pcb_width + 2 * wall_width, wall_width, wall_height + eps]); /* Right */ translate([keyboard_pcb_width, -wall_width, 0]) cube([wall_width, keyboard_pcb_length + 2 * wall_width, wall_height + eps]); /* Lower */ translate([-wall_width, -wall_width, 0]) cube([keyboard_pcb_width + 2 * wall_width, wall_width, wall_height + eps]); /* Left */ translate([-wall_width, -wall_width, 0]) cube([wall_width, keyboard_pcb_length + 2 * wall_width, wall_height + eps]); } module body() { rows = len(keyboard_switch_sizes); for (i = [0: rows-1]) { y = keyboard_switch_length * (rows - 1 - i); key_switch_row = keyboard_switch_sizes[i]; cols = len(key_switch_row); for (j = [0: cols-1]) { x = keyboard_switch_width * ((j == 0)? 0: addrange(key_switch_row, 0, j-1)); key_switch_size = key_switch_row[j]; translate([x, y, 0]) key_switch_plate(key_switch_size); } } } difference() { body(); screw_holes(); } walls(); }