--- /dev/null
+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_hole = 1.5;
+
+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_hole, 0])
+ cube([hook_w, 2*hook_hole+2*hook_w, wall]);
+ translate([body_l/2, body_w/2+hook_hole, 0])
+ cube([hook_w+hook_hole, 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]);
+}