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 = 8; wall = 2; stem_w = 10; fork_w1 = frame_w/2 + 6; fork_w2 = frame_w/2 + 3; fork_w = fork_w1 + fork_w2; fork_h = frame_h/3; fork_top = 5; fork_bottom = 3; fork_raised = holder_w + 10; fork_angle = 5; 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_w2, 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_w1-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(); }