--- /dev/null
+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 = 2;
+hook_hole_w = 1.5;
+
+// 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]);
+}
+
+// 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);
+ 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]);
+ }