LENGTH = 100; WIDTH = 60; HEIGHT = 30; CORNER_RAD = 5; CUTOUT_LENGTH = 8; CUTOUT_WIDTH = 10; TAB_WIDTH = 20; TAB_LENGTH = 20; TAB_HEIGHT = 3; TAB_HOLE_RAD = 3; SCREEN_WIDTH = 40; SCREEN_LENGTH = 60; $fn=512; module rounded_box(d,r) { hull() { translate([d[0]/2-r,d[1]/2-r,0]) cylinder(r=r, h=r); translate([d[0]/-2+r,d[1]/2-r,0]) cylinder(r=r, h=r); translate([d[0]/2-r,d[1]/-2+r,0]) cylinder(r=r, h=r); translate([d[0]/-2+r,d[1]/-2+r,0]) cylinder(r=r, h=r); translate([d[0]/2-r,d[1]/2-r,d[2]-r]) rotate([90,0,0]) sphere(r=r); translate([d[0]/-2+r,d[1]/2-r,d[2]-r]) rotate([90,0,0]) sphere(r=r); translate([d[0]/2-r,d[1]/-2+r,d[2]-r]) rotate([90,0,0]) sphere(r=r); translate([d[0]/-2+r,d[1]/-2+r,d[2]-r]) rotate([90,0,0]) sphere(r=r); } } module tab(d,hole_rad=2) { difference() { translate([d[0]/-2,0,0]) cube(d); translate([0,d[1]/2,0]) cylinder(r=hole_rad, h=d[2]); } } difference() { rounded_box([LENGTH,WIDTH,HEIGHT], r=CORNER_RAD); rounded_box([LENGTH-3,WIDTH-3,HEIGHT-1.5], r=CORNER_RAD); translate([0,0,HEIGHT]) cube([SCREEN_LENGTH,SCREEN_WIDTH,10], center=true); translate([LENGTH/-2+CUTOUT_LENGTH/2,0,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); translate([LENGTH/-2+CUTOUT_LENGTH/2,WIDTH/4,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); translate([LENGTH/-2+CUTOUT_LENGTH/2,WIDTH/-4,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); translate([LENGTH/2-CUTOUT_LENGTH/2,0,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); translate([LENGTH/2-CUTOUT_LENGTH/2,WIDTH/4,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); translate([LENGTH/2-CUTOUT_LENGTH/2,WIDTH/-4,HEIGHT-CUTOUT_WIDTH/2]) cube([CUTOUT_LENGTH,CUTOUT_WIDTH,CUTOUT_WIDTH], center=true); } translate([0,WIDTH/2,0]) tab([TAB_WIDTH,TAB_LENGTH,TAB_HEIGHT], hole_rad=TAB_HOLE_RAD); translate([0,WIDTH/-2,0]) rotate([0,0,180]) tab([TAB_WIDTH,TAB_LENGTH,TAB_HEIGHT], hole_rad=TAB_HOLE_RAD);