inner_ring(); outer_ring(); spokes(); module inner_ring() { difference() { cylinder(h=4, d=70, $fn=500); translate([0, 0, -1]) cylinder(h=6, d=55, $fn=500); } } module outer_ring() { difference() { union() { cylinder(h=4, d=210, $fn=500); bend1(); bend2(); ring(); } translate([0, 0, -1]) cylinder(h=6, d=195, $fn=500); translate([-220, -150, -10]) cube([220, 300, 200]); } } module spokes() { for (a = [-55 : 27.5 : 55]) { rotate([0, 0, a]) translate([30, -5, 0]) cube([70, 10, 4]); } translate([0, 30, 0]) cube([10, 70, 4]); translate([0, -100, 0]) cube([10, 70, 4]); } module bend1() { translate([0, 0, 10]) rotate_extrude($fn=500) translate([105, 0, 0]) difference() { circle(d=20, $fn=500); circle(d=12, $fn=500); translate([-10, 0, 0]) square(20); translate([-20, -10, 0]) square(20); } } module bend2() { translate([0, 0, 75]) rotate_extrude($fn=500) translate([100, 0, 0]) difference() { circle(d=30, $fn=500); circle(d=22, $fn=500); translate([-20, -40, 0]) square(40); translate([-30, 0, 0]) rotate([0, 0, -15]) square(60, center=true); } } module ring() { difference() { union() { translate([0, 0, 10]) cylinder(h=65, d=230, $fn=500); difference() { translate([-13, 0, 44]) // torus(i=57, o=147, xs=0.5, $fn=500); torus2(r1=101, r2=45, xs=0.6, $fn=500); cube([200, 200, 200]); } } translate([0, 0, -20]) cylinder(h=150, d=221, $fn=500); for (a = [-84 : 6 : 84]) { for (h = [15 : 18 : 69]) { p = (a + 84) / 168; d = 10 * pow(p, 0.8); rotate([0, 0, a]) translate([100, 0, h]) rotate([0, 90, 0]) cylinder(h=50, d=d, $fn=50); } } for (a = [-87 : 6 : 87]) { for (h = [24 : 18 : 63]) { p = (a + 87) / 174; d = 10 * pow(p, 0.8); rotate([0, 0, a]) translate([100, 0, h]) rotate([0, 90, 0]) cylinder(h=50, d=d, $fn=50); } } } } module torus(i, o, xs=1.0, ys=1.0) { r = (o - i) / 2; rotate_extrude() translate([i + r, 0, 0]) scale([xs, ys, 1.0]) circle(r); } module torus2(r1, r2, xs=1.0, ys=1.0) { rotate_extrude() translate([r1, 0, 0]) scale([xs, ys, 1.0]) circle(r2); }