infty = 200; eps = 0.01; wall = 1.5; ziptie_w = 4; ziptie_h = 3; x_sep = 36; corner_l = 9; corner_w = 3; hole1_yoff = 20; hole2_yoff = 10; body_w = 2*(hole1_yoff+ziptie_h/2+corner_w); body_l = x_sep + 2*ziptie_w + 2*corner_w; hook_w = 2; hook_l = 3; hook_hole = 2; difference() { union() { translate([-body_l/2, -body_w/2, 0]) cube([body_l, body_w, wall]); // support raised corners for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) { translate([body_l/2-corner_w, body_w/2-corner_l, 0]) cube([corner_w, corner_l, 2*wall]); translate([x_sep/2-corner_w, body_w/2-corner_l, 0]) cube([corner_w, corner_l, 2*wall]); } // rubber hooks for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1]) { translate([body_l/2-eps, body_w/2-hook_w, 0]) cube([hook_w+hook_hole+eps, hook_w, wall]); translate([body_l/2+hook_hole, body_w/2-hook_w-hook_l, 0]) cube([hook_w, hook_l+hook_hole+2*hook_w, wall]); translate([body_l/2+hook_hole-hook_l, body_w/2+hook_hole, 0]) cube([hook_w+hook_l, hook_w, wall]); } } // center hole translate([-x_sep/2+corner_w, -body_w/2+corner_l, -eps]) cube([x_sep-2*corner_w, body_w-2*corner_l, 2*wall+2*eps]); // ziptie angles for (x = [-1, 1]) for (y = [-1, 1]) for (y1 = [-hole2_yoff, hole1_yoff]) scale([x, y, 1]) translate([x_sep/2, y1, wall]) rotate([-40, 0, 0]) translate([0, -ziptie_h/2, -infty/2]) cube([ziptie_w, ziptie_h, infty]); }