n_rows = 4;
n_cols = 5;
+/* Number of thumb keys (per hand), try 1 or 2. */
+n_thumb_keys = 1;
+
/* The width of the USB cable hole in the spacer. */
-cable_hole_width = 4;
+cable_hole_width = 12;
/* Vertical column staggering offsets. The first element should
be zero. */
staggering_offsets = [0, 5, 11, 6, 3];
+/* Whether or not to split the spacer into quarters. */
+quarter_spacer = false;
+
+/* Where the top/bottom split of a quartered spacer will be. */
+spacer_quartering_offset = 60;
+
module rz(angle, center=undef) {
/* Rotate children `angle` degrees around `center`. */
translate(center) {
rotate(angle) {
translate(-center) {
for (i=[0:$children-1])
- child(i);
+ children(i);
}
}
}
rotation_y_offset = 1.75 * column_spacing;
for (i=[0:$children-1]) {
rz(angle, [hand_separation, rotation_y_offset]) {
- child(i);
+ children(i);
}
}
}
for (i=[0:$children-1]) {
translate([0.5*hand_separation, /* we get back the full separation
because of mirroring */
- 0]) child(i);
+ 0]) children(i);
}
}
thumb_key_offset = y_offset + 0.5 * column_spacing;
rotate_half() {
add_hand_separation() {
- if (switch_holes == true) {
- switch_hole([x_offset, thumb_key_offset]);
- } else {
- thumb_key([x_offset, thumb_key_offset], key_size);
+ for (j=[0:(n_thumb_keys-1)]) {
+ if (switch_holes == true) {
+ switch_hole([x_offset + j*row_spacing, thumb_key_offset]);
+ } else {
+ thumb_key([x_offset + j*row_spacing, thumb_key_offset], key_size);
+ }
}
for (j=[0:(n_cols-1)]) {
- column([x_offset + (j+1)*row_spacing, y_offset + staggering_offsets[j]], switch_holes, key_size);
+ column([x_offset + (j+n_thumb_keys)*row_spacing, y_offset + staggering_offsets[j]], switch_holes, key_size);
}
}
}
module right_screw_holes(hole_radius) {
/* coordinates of the back right screw hole before rotation... */
- back_right = [(n_cols+1)*row_spacing,
+ back_right = [(n_cols+n_thumb_keys)*row_spacing,
staggering_offsets[n_cols-1] + n_rows * column_spacing];
/* and after */
tmp = rz_fun(back_right, angle, [0, 2.25*column_spacing]);
[row_spacing, 0],
[-nudge, -nudge]);
screw_hole(hole_radius, washer_radius,
- [(n_cols+1)*row_spacing, staggering_offsets[n_cols-1]],
+ [(n_cols+n_thumb_keys)*row_spacing, staggering_offsets[n_cols-1]],
[nudge, -nudge]);
screw_hole(hole_radius, washer_radius,
back_right,
}
/* add the screw hole near the cable hole */
- translate([cable_hole_width + washer_radius - tmp[0],
+ translate([washer_radius - tmp[0] - 0.5*hand_separation,
back_screw_hole_offset]) {
rotate_half() {
add_hand_separation() {
right_half(switch_holes=false, key_size=switch_hole_size + 3);
left_half(switch_holes=false, key_size=switch_hole_size + 3);
}
+ /* add the USB cable hole: */
+ translate([-0.5*cable_hole_width, 2*column_spacing]) {
+ square([cable_hole_width, (2*n_rows) * column_spacing]);
+ }
}
screw_holes(washer_radius);
}
screw_holes(screw_hole_radius);
- /* add the USB cable hole: */
- translate([-0.5*cable_hole_width, 2*column_spacing]) {
- square([cable_hole_width, (2*n_rows) * column_spacing]);
+ }
+}
+
+module spacer_quadrant(spacer_quadrant_number) {
+ /* Cut a quarter of a spacer. */
+ translate([0, spacer_quartering_offset]) {
+ intersection() {
+ translate([0, -spacer_quartering_offset]) { spacer(); }
+ rotate([0, 0, spacer_quadrant_number * 90]) { square([1000, 1000]); }
}
}
}
+module quartered_spacer()
+{
+ /* Assemble all four quarters of a spacer. */
+ spacer_quadrant(0);
+ spacer_quadrant(1);
+ translate([-5,-10]) spacer_quadrant(2);
+ translate([5,-10]) spacer_quadrant(3);
+}
+
/* Create all four layers. */
top_plate();
-translate([300, 150]) { spacer(); }
translate([300, 0]) { switch_plate(); }
translate([0, 150]) { bottom_plate(); }
+translate([300, 150]) {
+ if (quarter_spacer == true) {
+ quartered_spacer();
+ }
+ else {
+ spacer();
+ }
+}