From 9e771b31256c759f8f9e45561baebe6e914ced62 Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Mon, 19 May 2025 17:40:17 -0500 Subject: [PATCH] Ctrl keycap replacement. --- replacement-parts/drawer-slide-support.scad | 6 +- replacement-parts/keycaps/ctrl-key.scad | 71 +++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 replacement-parts/keycaps/ctrl-key.scad diff --git a/replacement-parts/drawer-slide-support.scad b/replacement-parts/drawer-slide-support.scad index 52d99c2..217bf8a 100644 --- a/replacement-parts/drawer-slide-support.scad +++ b/replacement-parts/drawer-slide-support.scad @@ -14,8 +14,12 @@ difference() { // channel cube([30, 13, length + 10]); - // angled support + // angled supports (X-axis) translate([16, 9, -8]) rotate([0, -10, 0]) cube([30, 4, length + 10]); + translate([16, 0, -8]) rotate([0, -10, 0]) cube([30, 4, length + 10]); + + // angled supports (y-axis) + translate([0, 12, -1]) rotate([15, 0, 0]) cube([4, 10, 40]); // base cube([50, 32, 4]); diff --git a/replacement-parts/keycaps/ctrl-key.scad b/replacement-parts/keycaps/ctrl-key.scad new file mode 100644 index 0000000..646bd89 --- /dev/null +++ b/replacement-parts/keycaps/ctrl-key.scad @@ -0,0 +1,71 @@ +$fn=180; +ow=23; // outer width +od=18; // outer depth +oh=10; // outer height +ep = 0.01; + +iw=17.4; // inner width +id=12.5; // inner depth +ih=7.6; // inner height + +sphMul = 4; + + +difference() { + translate([-ow/2, -od/2, 0]) union() { + difference() { + union() { + cube([ow, od, oh]); + } + + union() { + color("SlateGray") union() { + // right cut (+x) + rotate([0, 15, 0]) translate([-8, -ep, 0]) cube([8, od + 2*ep, 2*oh]); + + // left cut (-x) + translate([ow, -ep, 0]) rotate([0, -15, 0]) cube([8, od + 2*ep, 2*oh]); + + // front cut (-y) + rotate([-20, 0, 0]) translate([-ep, -8, 0]) cube([ow + 2*ep, 8, 2*oh]); + + // back cut (+y) + translate([-ep, od, 0]) rotate([5, 0, 0]) cube([ow + 2*ep, 8, 2*oh]); + + // top cut + translate([ow/2, od/2 + 6, ow*sphMul + oh - 1.4]) sphere(r=ow*sphMul); + } + + // inside recess + color("SeaGreen") union() { + translate([(ow - iw)/2, (od - id)/2 + 1, -ep]) cube([iw , id, ih + ep]); + translate([(ow - iw)/2, (od - id)/2 + 1, ih]) rotate([0, 15, 0]) translate([0, 0, -ih-ep]) cube([2 , id, ih + ep]); + translate([iw + (ow - iw)/2, (od - id)/2 + 1, ih]) rotate([0, -15, 0]) translate([-2, 0, -ih-ep]) cube([2 , id, ih + ep]); + translate([(ow - iw)/2, (od - id)/2 + 1, ih]) rotate([-20, 0, 0]) translate([0, 0, -ih-ep]) cube([iw , 4, ih + ep]); + } + } + } + + difference() { + cw = 4.3; // cross width + ct = 1.3; // cross thickness + + // inner cylinder + color("DimGray") translate([ow/2, od/2, 1.4]) cylinder(d=5.3, h=ih - 1.4); + + // inner cross recess (post hole) + color("MediumSeaGreen") translate([ow/2, od/2, 1-ep]) union() { + translate([-(ct/2), -(cw/2), 0]) cube([ct, cw, ih - 2 + ep]); + translate([-(cw/2), -(ct/2), 0]) cube([cw, ct, ih - 2 + ep]); + } + } + } + + color("Gainsboro") union() { + translate([-1.8, 0, 0]) rotate([0, 0, 45]) translate([0, od/2 + 2.8, oh-1]) rotate([45, 0, 0]) cube([8, 2, 8], center=true); + translate([1.8, 0, 0]) rotate([0, 0, -45]) translate([0, od/2 + 2.8, oh-1]) rotate([45, 0, 0]) cube([8, 2, 8], center=true); + + translate([-1.8, 1, 0]) rotate([0, 0, 135]) translate([0, od/2 + 2.8, oh-1.8]) rotate([45, 0, 0]) cube([8, 2, 8], center=true); + translate([1.8, 1, 0]) rotate([0, 0, -135]) translate([0, od/2 + 2.8, oh-1.8]) rotate([45, 0, 0]) cube([8, 2, 8], center=true); + } +}