minimacplus/case/mac.scad

438 lines
14 KiB
OpenSCAD

/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* Jeroen Domburg <jeroen@spritesmods.com> wrote this file. As long as you retain
* this notice you can do whatever you want with this stuff. If we meet some day,
* and you think this stuff is worth it, you can buy me a beer in return.
* ----------------------------------------------------------------------------
*/
//All measurements in mm
$fa=8; //segments/360 degrees
$fs=0.1; //min size of fragment
$fn=32; //override amount of facets
scale=50/300; //1-to-6
wall=2.5; //real mms
overlap=5; //real mms; overlap between halves
overlapth=1.5; //real mms: thickness of material in overlap
//1 - cutout
//2 - full render
//3 - intersection case - pcb
//4 - front half / back half
//5 - front half / back half side-by-side
//6 - back
//7 - front
type=6;
if (type==1) {
difference() {
union() {
mac_half_front(wall, scale, overlap, overlapth);
translate([0,1,0]) mac_half_back(wall, scale, overlap, overlapth);
}
translate([125*scale, -500, -500]) cube([1000, 1000, 1000], false);
}
displaypcb(wall, scale);
translate([0,1,0]) usbserpcb_mounted(wall);
} else if (type==2) {
union() {
mac_half_front(wall, scale, overlap, overlapth);
mac_half_back(wall, scale, overlap, overlapth);
}
displaypcb(wall, scale);
usbserpcb_mounted(wall);
} else if (type==3) {
intersection() {
union() {
mac_half_front(wall, scale, overlap, overlapth);
mac_half_back(wall, scale, overlap, overlapth);
}
displaypcb(wall, scale);
}
} else if (type==4 || type==5) {
translate([0, 10, 0]) union() {
mac_half_back(wall, scale, overlap, overlapth);
usbserpcb_mounted(wall);
}
rotate([0,0,type==5?180:0]) union () {
mac_half_front(wall, scale, overlap, overlapth);
*color("red") displaypcb(wall, scale);
}
} else if (type==6) {
mac_half_back(wall, scale, overlap, overlapth);
} else if (type==7) {
mac_half_front(wall, scale, overlap, overlapth);
}
module mac_half_front(wall, scale, overlap, overlapth) {
union() {
scale(scale) union() {
difference() {
mac_hull(wall/scale);
mac_crack_divider();
}
intersection() {
mac_overlap_inner_edge(overlapth/scale);
difference() {
mac_crack_divider_expanded(-0.8/scale);
mac_crack_divider_expanded(overlap/scale);
}
}
}
difference() {
union() {
//bottom screen tab
translate([17+wall, -1, 8]) rotate([-20, 0, 0]) cube([10, 2, 3]);
//top tab
translate([14.5+wall, 1, 50]) cube([4, 5, 3]);
}
displaypcb(wall, scale);
}
}
}
module mac_half_back(wall, scale, overlap, overlapth) {
union() {
difference() {
union() {
scale(scale) difference() {
intersection() {
mac_hull(wall/scale);
mac_crack_divider();
}
intersection() {
mac_overlap_inner_edge(overlapth/scale);
difference() {
mac_crack_divider();
mac_crack_divider_expanded(overlap/scale);
}
}
}
//front tab for usb-ser conv
translate([wall, 37.7-26-2, 0]) cube([16, 2, wall+1.7]);
//back tabs for usb-ser conv
translate([0, 37-5, wall+1.9]) cube([16+wall, 7, 3]);
}
usb_hole(wall);
mouse_hole(wall);
usbserpcb_mounted(wall);
}
//Enable for signatures in backplate
//Disabled because 3d-printer doesn't really show these...
//translate([wall, 38.2, 8+wall]) rotate([90, 0, 0]) scale(.2) linear_extrude(height = 3.3) import(file = "signatures.dxf");
}
}
module usb_hole(wall) {
w=3; //extra width for bevel
i=0.2; //inset of bevel
translate([16+wall,37.7,wall]) rotate([0,0,180]) union() {
translate([4.5, -100, 1.6]) cube([7.55, 100 , 3.65]);
translate([4.5-w/2, -wall+i-10, 1.6-w/2]) cube([7.55+w, 10 , 3.65+w]);
}
}
module mouse_hole(wall) {
translate([26+wall, 37.7, wall+3.2]) rotate([-90, 0, 0]) cylinder(d=2, 50);
}
module usbserpcb_mounted(wall) {
translate([16+wall,37.7,wall]) rotate([0,0,180]) usbserpcb();
}
module usbserpcb() {
cube([16, 26, 1.6]);
translate([4.5, 0, 1.6]) cube([7.55, 9 , 3.65]);
}
//generates square hull you can cut the inner overlap out of
module mac_overlap_inner_edge(overlapth, isInner) {
difference() {
translate([overlapth, -200, overlapth]) cube([247.6-overlapth*2,500,334-overlapth*2]);
translate([overlapth*2, -200, overlapth*2]) cube([247.6-overlapth*4,500,334-overlapth*4]);
}
}
module mac_hull(wall) {
difference() {
mac_hull_solid(0);
union() {
mac_hull_solid(wall);
translate([0, -25.4, 44.5]) rotate([-5,0, 0]) union() { //Cutout the screen in the back of the frontplate as well
translate([247.6/2, 0, 185]) rotate([90, 0, 0]) scale(1.69) mac_screen_cutout(wall/1.69);
//Cutout fdd slot
translate([129, -5.2, 62.8]) rotate([90,0,0]) fdd_cutout();
}
}
}
}
module displaypcb(wall, scale) {
translate([wall+.6,-1.6,60*scale]) rotate([90-5,180,180]) translate([0, -42, wall-2.05]) union() {
cube([35,42, 0.8]); //main pcb
translate([1, 6.8, 0]) cube([16, 24, 3.6+0.8]); //wroom block
translate([1.6, 0.4, -1.2]) difference() { //screen
cube([32.2, 36.75, 1.2]);
translate([1.5, 2.73, -10+0.7]) cube([28.9, 19.5, 10]);
}
}
}
module mac_hull_solid(shrink) {
rnd=4.5; //rounding of outer case
//ir=0.8; //rounding of outmost screen bezel
//a=-6.18; //angle of front
r=(rnd<shrink)?0.01:rnd-shrink;
difference() {
union() {
difference() {
//Cube that makes up bottom and back of mac
translate([shrink, shrink, shrink]) roundedcube(247.6-shrink*2, 241.3-shrink*2, 310-shrink*2, r);
//cut off bit that sticks through front panel
translate([-500, -1000+150, 150]) cube([1000, 1000, 1000]);
}
//add in rotated front bulk
translate([0, -25.4, 44.5]) rotate([-5,0, 0]) mac_front_bulk(4.5, 2, shrink);
}
union() {
//Cut off diagonal bit in top-back of case
translate([-1, 241-shrink, 266]) rotate([30, 0, 0]) cube([300, 300, 300], false);
//Handle handle
translate([247.6/2,105-shrink,280]) rotate([90+5,0,180]) mac_handle_hole(shrink);
}
}
}
module mac_front_bulk(or, ir, shrink) {
fp_th=5.2; //thickness of front plate)
fp_extra=(shrink<fp_th)?0:shrink-fp_th;
or=(or<shrink)?0.01:or-shrink;
ir=(ir<shrink)?0.01:ir-shrink;
difference() {
union() {
difference() {
translate([0+shrink, -20+shrink, 0+shrink]) roundedcube(247.6-shrink*2, 233.9+20-shrink*2, 292.1-shrink*2, or);
union() {
//Cut off front where faceplate goes
translate([-500, -1000+fp_extra, -500]) cube([1000, 1000, 1000]);
}
}
if (shrink==0) {
mac_front_faceplate(or, ir);
} else {
translate([247.6/2, 50, 185]) rotate([90,0,0])scale([1.69, 1.69, 100]) mac_screen_cutout_back();
}
}
}
}
//negative: handle hole (as in: hole for the handle to carry the mac)
//needs to be bigger when shrink increases
module mac_handle_hole(shrink) {
r=6.4;
difference() {
union() {
hull() {
translate([-97/2+r-shrink, r-shrink ,0]) cylinder(r=r, 200);
translate([97/2-r+shrink, r-shrink ,0]) cylinder(r=r, 200);
translate([-103/2+r-shrink, 46-r ,0]) cylinder(r=r, 200);
translate([103/2-r+shrink, 46-r ,0]) cylinder(r=r, 200);
}
if (shrink==0) {
difference() {
translate([-103/2-r, 46-r, 0]) cube([103+2*r, 200, 200]);
union() {
translate([-103/2-r, 46-r ,0]) cylinder(r=r, 200);
translate([103/2+r, 46-r ,0]) cylinder(r=r, 2200);
}
}
}
}
if (shrink==0) {
//thing where you hold the mac
translate([-100, 35, 0]) rotate([90,0,90]) hull() {
cylinder(d=14.6, 200);
translate([0, 35, 0]) cylinder(d=14.6, 200);
}
}
}
}
//crack divider, but moved up/right to get the overlap edge
module mac_crack_divider_expanded(ex) {
translate([0,ex,ex]) mac_crack_divider();
}
module mac_crack_divider() {
difference() {
rotate([-5, 0, 0]) translate([0, -15, 65]) union() {
hull () {
translate([0,0,0]) rotate([0,90,0]) cylinder(r=1.5, 1000);
translate([0,0,1000]) rotate([0,90,0]) cylinder(r=1.5, 1000);
translate([0,1000,0]) rotate([0,90,0]) cylinder(r=1.5, 1000);
}
translate([-500,20,-500]) cube([1000,1000,1000]);
}
translate([0, 15, 0]) hull() {
translate([-500, 0, -200]) rotate([0,90,0]) cylinder(r=4.5, 1000);
translate([-500, 0, 58.4]) rotate([0,90,0]) cylinder(r=4.5, 1000);
translate([-500, -200, 58.4]) rotate([0,90,0]) cylinder(r=4.5, 1000);
}
}
}
module mac_front_faceplate() {
mac_front_faceplate_outer(4.5, 2);
}
module mac_front_faceplate_outer(or, ir) {
hull() {
//connection to bulk of case
translate([0+or, 0, 0+or]) rotate([90,0,0]) cylinder(1, or);
translate([0+or, 0, 292.1-or]) rotate([90,0,0]) cylinder(1, or);
translate([247.6-or, 0, 0+or]) rotate([90,0,0]) cylinder(1, or);
translate([247.6-or, 0, 292.1-or]) rotate([90,0,0]) cylinder(1, or);
//face of mac
translate([0+3.4+ir, 1-5.2, 0+8+ir]) rotate([90,0,0]) cylinder(1, ir);
translate([0+3.4+ir, 1-5.2, 292.1-10-ir]) rotate([90,0,0]) cylinder(1, ir);
translate([247.6-3.4-ir, 1-5.2, 0+8+ir]) rotate([90,0,0]) cylinder(1, ir);
translate([247.6-3.4-ir, 1-5.2, 292.1-10-ir]) rotate([90,0,0]) cylinder(1, ir);
}
}
//WARNING: Everything inhere is adjusted using the wrong scale because I didn't pay attention. I'm too lazy to fix it all up, so if you use it scale(1.69) it first.
module mac_screen_cutout(depth) {
or=2.5;
ow=123-or*2;
oh=94-or*2;
hull() {
//back cutout; fakes CRT curves
translate([0,0,2.5-depth]) mac_screen_cutout_back();
//very front of bezel
translate([ow/2, oh/2, 5.2-1]) cylinder(1, r=or);
translate([ow/2, -oh/2, 5.2-1]) cylinder(1, r=or);
translate([-ow/2, oh/2, 5.2-1]) cylinder(1, r=or);
translate([-ow/2, -oh/2, 5.2-1]) cylinder(1, r=or);
}
}
//Same scale(1.69) is required here.
module mac_screen_cutout_back() {
intersection() {
intersection() {
union() {
translate([0, 23-(46-42), 0]) scale([246, 46, 1]) cylinder(10, d=1);
translate([0, -23+(46-42), 0]) scale([246, 46, 1]) cylinder(10, d=1);
}
union() {
translate([-56/2, 0, 0]) scale([56, 300, 1]) cylinder(1, d=1);
translate([0, 0, 0]) scale([56, 300, 1]) cylinder(1, d=1);
translate([56/2, 0, 0]) scale([56, 300, 1]) cylinder(1, d=1);
}
}
union() {
dr=6.2;
w=111-dr*2;
h=82-dr*2;
translate([w/2, h/2, 0]) cylinder(10, r=6.2);
translate([w/2, -h/2, 0]) cylinder(10, r=6.2);
translate([-w/2, h/2, 0]) cylinder(10, r=6.2);
translate([-w/2, -h/2, 0]) cylinder(10, r=6.2);
translate([-w/2, -500, 0]) cube([w, 1000, 10]);
translate([-500, -h/2, 0]) cube([1000, h, 10]);
}
}
}
//Negative space of FDD.
module fdd_cutout() {
union() {
fdd_cutout_inner_slot();
fdd_cutout_inner_right();
translate([0,0,0]) fdd_cutout_bezel();
//fdd force eject button
translate([98, -5,-50]) cylinder(100, r=1);
}
}
module fdd_cutout_bezel() {
thickness=1;
union() {
hull() {
translate([0,0,5-thickness]) fdd_cutout_inner_slot();
translate([-10.4, -11.5/2, 0]) flatroundedcube(112.3, 11.5, 10, 1);
}
hull() {
translate([0,0,5-thickness]) fdd_cutout_inner_right();
translate([57.7,-24/2 , 0]) flatroundedcube(44.5, 24, 10, 1);
}
}
}
module fdd_cutout_inner_slot() {
translate([0, -2.6, -5]) cube([93.4, 5.2, 10]);
}
module fdd_cutout_inner_right() {
translate([65.7, -8.9, -5]) flatroundedcube(27.7, 17.8, 10, 2.1);
}
//Cube with 4 edges rounded; front/back are flat
module flatroundedcube(x,y,z,r) {
hull(){
translate([0+r, 0+r, 0]) cylinder(z, r=r);
translate([0+r, y-r, 0]) cylinder(z, r=r);
translate([x-r, 0+r, 0]) cylinder(z, r=r);
translate([x-r, y-r, 0]) cylinder(z, r=r);
}
}
//Cube with all edges rounded
module roundedcube(x, y, z, r) {
if(0) {
cube([x,y,z], false);
} else {
hull() {
translate([0+r,0+r,0+r]) sphere(r);
translate([x-r,0+r,0+r]) sphere(r);
translate([0+r,y-r,0+r]) sphere(r);
translate([x-r,y-r,0+r]) sphere(r);
translate([0+r,0+r,z-r]) sphere(r);
translate([x-r,0+r,z-r]) sphere(r);
translate([0+r,y-r,z-r]) sphere(r);
translate([x-r,y-r,z-r]) sphere(r);
}
}
}