infty = 200; eps = 0.01; wall = 1.5; body_l = 70 + 0.5; body_w = 33 + 0.5; body_h = 28 + 0.5; corner_r = 8; corner_side_h = 5; hook_w = 3.5; hook_l = 6; hook_hole_l = 3; hook_hole_w = 2; ziptie_w = 4; ziptie_h = 3; // base plate difference() { hull() { for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) translate([body_l/2 - corner_r, body_w/2 - corner_r, 0]) cylinder(r = corner_r + wall, h = wall); } // translate([-body_l/2+corner_r + hook_l, -body_w/2+corner_r, -eps]) // cube([body_l-2*corner_r-2*hook_l, body_w - 2*corner_r, wall +2*eps]); translate([-body_l/2+corner_r, -body_w/2+corner_r, -eps]) cube([body_l-2*corner_r, body_w - 2*corner_r, wall +2*eps]); // ziptie angles for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) translate([body_l/2-corner_r-hook_l-ziptie_w, body_w/2+wall/2-corner_r/2, wall]) rotate([-40, 0, 0]) translate([0, -ziptie_h/2, -infty/2]) cube([ziptie_w, ziptie_h, infty]); // more space for lens for (x = [-1, 1]) scale([x, 1, 1]) translate([body_l/2, -body_w/2+corner_r, -eps]) cube([wall+eps, body_w-2*corner_r, wall+2*eps]); } // raised corner bottom for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) translate([body_l/2 - corner_r, body_w/2 - corner_r, wall-eps]) difference() { cylinder(r = corner_r + wall, h = wall+eps); translate([-infty, -infty/2, -infty/2]) cube(infty); translate([-infty/2, -infty, -infty/2]) cube(infty); } // raised corner side for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) translate([body_l/2 - corner_r, body_w/2 - corner_r, 2*wall-eps]) difference() { cylinder(r = corner_r + wall, h = corner_side_h+eps); translate([0, 0,-eps]) cylinder(r = corner_r, h = infty); translate([-infty, -infty/2, -infty/2]) cube(infty); // front edges cut rotate([-30, 0, 0]) translate([-infty/2, -infty, -infty/2]) cube(infty); } // rubber band hooks for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) difference() { translate([body_l/2 - corner_r - hook_l, body_w/2 - corner_r, 0]) cube([hook_l, hook_w + corner_r + wall, 2*wall]); translate([body_l/2 - corner_r - hook_hole_l, body_w/2 + wall, -eps]) cube([hook_hole_l + eps, hook_hole_w, 2*wall+2*eps]); }