--- /dev/null
+eps = 0.01;
+
+wall = 2;
+top_ins_w = 5;
+top_ins_h = 4;
+x_width = 7;
+y_height = 27;
+y_clip_l = 4;
+y_clip_end_r = 0.75;
+clip_h = 21;
+
+spool_r = 100;
+spool_angle = 15;
+spool_yoff = -(spool_r + wall + 8)*cos(spool_angle);
+spool_xoff = -(spool_r + wall + 8)*sin(spool_angle);
+
+beam_h = 10;
+bearing_zoff = beam_h + wall;
+
+bearing_d = 15 + 0.1;
+bearing_h = 9;
+bearing_r1 = bearing_d/2+wall - bearing_zoff/3;
+
+module extrusion_clip(body_h) {
+translate([-wall, -wall, 0]) cube([wall + x_width+eps, wall, body_h]);
+translate([-wall, -wall, 0]) cube([wall, wall + y_height + eps, body_h]);
+translate([x_width, -wall, 0]) cube([top_ins_w, top_ins_h + wall, body_h]);
+translate([-wall, y_height, 0]) cube([wall+y_clip_l, wall, body_h]);
+
+translate([0, 10, 0]) hull() {
+ translate([-eps, -4, 0]) cube([eps, 8, body_h]);
+ translate([1.5-eps, -3, 0]) cube([eps, 6, body_h]);
+}
+
+translate([y_clip_l-y_clip_end_r, y_height, 0])
+ cylinder(r = y_clip_end_r, h = body_h, $fn = 4);
+}
+
+module bearing_insert() {
+ rotate([0, 0, 30])
+ cylinder(r1 = bearing_r1, r2 = bearing_d/2 + wall, h = bearing_zoff, $fn = 128);
+ for (a = [0:120:360]) rotate([0, 0, a])
+ translate([-wall/2, 0, bearing_zoff]) cube([wall, bearing_d/2, bearing_h]);
+}
+
+module beam() {
+ difference() {
+ hull() {
+ translate([-wall, -wall, 0])
+ cube([wall + x_width + top_ins_w, wall, beam_h]);
+ translate([-wall, -wall, 0])
+ cube([wall, 2*y_height/3 + wall, beam_h]);
+ translate([spool_xoff, spool_yoff, 0])
+ rotate([0, 0, 30])
+ cylinder(r = bearing_r1, h = beam_h, $fn = 6);
+ }
+ translate([0, 0, -eps])
+ cube([x_width+top_ins_w+eps, y_height+eps, beam_h + 2*eps]);
+ }
+}
+
+module holder() {
+ extrusion_clip(body_h = clip_h);
+ translate([spool_xoff, spool_yoff, 0])
+ bearing_insert();
+ beam();
+}
+
+// holder();
+for (x = [-1, 1]) scale([x, 1, 1])
+translate([12, 0, 0])
+rotate([0, 0, spool_angle]) holder();
+