--- /dev/null
+eps = 0.01;
+infty = 100;
+
+wall = 1;
+ziptie_w = 2.5 + 0.5;
+ziptie_h = 2.0 + 0.5;
+
+fork_diam = 30;
+ring_h = 2*wall + ziptie_h;
+
+base_d = 10;
+base_h = 4.5;
+hole_d = 3.5 + 0.5;
+
+// cuircular base with screw hole
+difference() {
+ hull() {
+ cylinder(r = base_d/2, h = base_h);
+ translate([-base_d/2-wall, -base_d/2, 0])
+ cube([wall, base_d, base_h]);
+ }
+ translate([0, 0, -infty/2])
+ cylinder(r = hole_d/2, h = infty);
+ for (angle = [0:30:360]) rotate([0, 0, angle])
+ translate([0, 0, base_h])
+ rotate([0, 90, 0])
+ cylinder(r1 = 0, r2 = 1, h = base_d/2+eps, $fn=4);
+}
+
+// ziptie holding part
+translate([-base_d/2-fork_diam/2 - ring_h, 0, 0])
+intersection() {
+ translate([0, -base_d/2-eps, 0]) cube([infty, base_d+2*eps, 15]);
+
+ translate([0, -base_d/2, base_h])
+ rotate([-90, 0, 0])
+ difference() {
+ scale([1, 0.8, 1])
+ cylinder(r = fork_diam/2 + ring_h, h = base_d);
+ // fork itself
+ translate([0, 0, -eps])
+ cylinder(r = fork_diam/2, h = base_d + 2*eps);
+ // two ziptie holes
+ for (z = [wall, base_d - wall - ziptie_w])
+ translate([0, 0, z])
+ difference() {
+ cylinder(r = fork_diam/2 + wall + ziptie_h,
+ h = ziptie_w);
+ translate([0, 0, -eps])
+ cylinder(r = fork_diam/2 + wall, h = ziptie_w+2*eps);
+ }
+
+}}