module bottom_model() { kbheight = 124; kbwidth = 286; color([0, 0.6, 0.5]) translate([0, -220, 0]) difference() { union() { hull() { translate([width / 2.0 - radius + 24, -height / 2.0 + radius - 4, radius4 / 1.5]) sphere(radius4); translate([-width / 2.0 + radius - 24, -height / 2.0 + radius - 4, radius4 / 1.5]) sphere(radius4); translate([width / 2.0 - radius + 24, height / 2.0 - radius + 4, radius4 / 1.5]) sphere(radius4); translate([-width / 2.0 + radius - 24, , height / 2.0 - radius + 4, radius4 / 1.5]) sphere(radius4); translate([width / 2.0 - radius + 24, -height / 2.0 + radius - 4, 22.0 - radius4 / 1.5]) sphere(radius4); translate([-width / 2.0 + radius - 24, -height / 2.0 + radius - 4, 22.0 - radius4 / 1.5]) sphere(radius4); translate([width / 2.0 - radius + 24, height / 2.0 - radius + 4, 22.0 - radius4 / 1.5]) sphere(radius4); translate([-width / 2.0 + radius - 24 , height / 2.0 - radius + 4, 22.0 - radius4 / 1.5]) sphere(radius4); } hull() { translate([-width / 2.0 + 1, height / 2.0 - 5, radius4 / 1.5 + 4]) rotate(90, [0, 1, 0]) cylinder(width - 2, 8.0, 8.0); translate([-width / 2.0 + 1, height / 2.0 + 10, radius4 / 1.5 + 20.0]) rotate(90, [0, 1, 0]) cylinder(width - 2, 8.0, 8.0); } } union() { translate([0, -110, -100]) cube([15, 220, 200]); translate([-width / 2.0 + 25, kbheight / 2.0, 20]) cube([30, 40, 30]); translate([width / 2.0 - 25 - 30, kbheight / 2.0, 20]) cube([30, 40, 30]); translate([-width / 2.0 - 10.0, height / 2.0 + 10, radius4 / 1.5 + 20.0]) rotate(90, [0, 1, 0]) cylinder(width + 20, 3.5, 3.5); hull() { xpass = kbwidth / 2.0 - radius4 - 3.0; translate([-xpass, -kbheight / 2.0 + 12 + 6, 30]) sphere(radius4); translate([xpass, -kbheight / 2.0 + 12 + 6, 30]) sphere(radius4); translate([-xpass, kbheight / 2.0 + 12 - 6, 30]) sphere(radius4); translate([xpass, kbheight / 2.0 + 12 - 6, 30]) sphere(radius4); translate([-xpass, -kbheight / 2.0 + 12 + 6, 10]) sphere(radius4); translate([xpass, -kbheight / 2.0 + 12 + 6, 10]) sphere(radius4); translate([-xpass, kbheight / 2.0 + 12 - 6, 10]) sphere(radius4); translate([xpass, kbheight / 2.0 + 12 - 6, 10]) sphere(radius4); } // bottom hole translate([-100, -45, -30]) cube([200, 110, 60]); // translate([-width / 2 - 8, -45, 5]) cube([width + 20, 124, 60]); translate([-kbwidth / 2, -85, 16]) cube([kbwidth, 165, 6.5]); translate([-kbwidth / 2 + 2, -85, 2]) cube([kbwidth - 4, 165, 20]); // snap fits translate([0, -height / 2.0 - 3.1, 9]) snapfit_neg(); translate([0, -height / 2.0 - 3.1, 17]) snapfit_neg(); translate([0, height / 2.0 - 1, 9]) rotate(180, [1, 0, 0]) snapfit_neg(); translate([0, height / 2.0 - 1, 17]) rotate(180, [1, 0, 0])snapfit_neg(); translate([19, height / 2.0 - 15, -5]) cube([6, 6, 10]); translate([-10, height / 2.0 - 15, -5]) cube([6, 6, 10]); translate([19, -height / 2.0 + 15, -5]) cube([6, 6, 10]); translate([-10, -height / 2.0 + 15, -5]) cube([6, 6, 10]); } } // snap fits translate([0, -220, 0]) { translate([0, -height / 2.0 - 2.8, 9]) snapfit(); translate([0, -height / 2.0 - 2.8, 17]) snapfit(); translate([0, height / 2.01 - 2, 9]) rotate(180, [1, 0, 0]) snapfit(); translate([0, height / 2.01 - 2, 17]) rotate(180, [1, 0, 0])snapfit(); } }