// card: 38 x 76 // 1.5 corner radius // 3.5 hole 2 from edge $fn = 500; card_x = 76; card_y = 38; card_z = 1; card_cr = 1.5; card_hole_inset = 2; card_hole_r = 1.75; card_hole_top_r = 3.75; border = 1; overhang = 1; base = 0.6; top = 0.6; cr = 1; incline = 1.3; e = 0.02; difference() { // Outer shape hull() for (x=[-1, 1], y=[-1, 1]) { translate([x * ((card_x / 2) + border), y * ((card_y / 2) + border), 0]) { cylinder(h=(base + card_z + top - cr), r1=(incline * cr), r2=cr); translate([0, 0, base + card_z + top - cr]) sphere(r=cr); } } // Card cutout hull() for (x=[-1, 1], y=[-1, 1]) { translate([x * ((card_x / 2) - card_cr), y * ((card_y / 2) - card_cr), base]) cylinder(h=card_z, r=card_cr); } // Window cutout hull() for (x=[-1, 1], y=[-1, 1]) { translate([x * ((card_x / 2) - overhang - cr), y * ((card_y / 2) - overhang - cr), base]) { cylinder(h=(card_z + top + e), r=cr); } } // Holes for (x=[-1, 1]) { translate([x * ((card_x / 2) - card_hole_inset - card_hole_r), 0, -e]) { cylinder(h=(e + base + card_z + top + e), r=card_hole_r); translate([0, 0, base + card_z]) cylinder(h=(e + top + e), r=card_hole_top_r); } } }