+eps = 0.01;
+infty = 300;
+
+spool_r = 100 + 30;
+frame_w = 6.5 + 0.5;
+frame_h = 40 + 0.5;
+
+bearing_d = 15.5;
+bearing_h = 9 + 1;
+bearing_side_off = 3;
+
+holder_w = 5;
+wall = 2;
+
+stem_w = 10;
+fork_w = frame_w + 2*6;
+fork_h = frame_h/3;
+fork_top = 5;
+fork_bottom = 3;
+fork_raised = holder_w + 5;
+
+fork_angle = 20;
+
+module holder() {
+ cylinder(r2 = bearing_d/2 + wall, r1 = bearing_d/2, h = holder_w + bearing_side_off);
+ for (angle = [0:360/5:360])
+ rotate([0, 0, angle]) hull() {
+ cylinder(r = wall, h = holder_w + bearing_h);
+ translate([bearing_d/2 - wall/2, 0, 0])
+ cylinder(r = wall/2, h = holder_w + bearing_side_off+ bearing_h);
+ }
+
+ difference() {
+ union() {
+ hull() {
+ // stem
+ translate([0, -stem_w/2, 0])
+ cube([spool_r, stem_w, holder_w]);
+
+ // fork
+ translate([spool_r, 0, 0])
+ rotate([0, 0, fork_angle])
+ translate([-fork_top, -fork_w/2, 0])
+ cube([fork_top + fork_h, fork_w, holder_w]);
+ }
+ // fork side
+ translate([spool_r, 0, 0])
+ rotate([0, 0, fork_angle])
+ translate([0, frame_w/2, 0])
+ cube([frame_h + wall, fork_w/2-frame_w/2, holder_w]);
+ // raised clip
+ translate([spool_r, 0, 0])
+ rotate([0, 0, fork_angle])
+ translate([-wall, -frame_w/2-wall, 0])
+ cube([frame_h + 2*wall, frame_w+2*wall, fork_raised]);
+ }
+ translate([spool_r, 0, 0])
+ rotate([0, 0, fork_angle]) {
+ // frame
+ translate([0, -frame_w/2, -infty/2])
+ cube([frame_h, frame_w, infty]);
+ // frame hole
+ translate([fork_h, -frame_w/2-wall-eps, -infty/2])
+ cube([frame_h, frame_w+wall+2*eps-fork_bottom, infty]);
+ }
+ }
+}
+
+for (y = [-1, 1]) {
+ scale([1, y, 1])
+ translate([0, 12, 0])
+ holder();
+}
+