$fn = 300; outer = 25.9; part = "b"; if (part == "a" || part == "*") { difference() { assembly(); clips(mask=true); } } if (part == "b" || part == "*") { intersection() { assembly(); clips(mask=true); } } module tenten() { color("red") union() { difference() { hull() { for (x=[0.75, outer - 0.75], y=[0.75, outer - 0.75]) translate([x, y, 0]) { cylinder(h=30, r=0.75); } } for (t=[[-1, (outer - 9) / 2], [outer - 1.0, (outer - 9) / 2]]) translate([t[0], t[1], -1]) cube([2, 9, 32]); for (t=[[-1, (outer - 9) / 2], [outer - 3, (outer - 9) / 2]]) translate([t[0], t[1] + 1.1, -1]) cube([4, 6.8, 32]); for (t=[[(outer - 9) / 2, -1], [(outer - 9) / 2, outer - 1.0]]) translate([t[0], t[1], -1]) cube([9, 2, 32]); for (t=[[(outer - 9) / 2, -1], [(outer - 9) / 2, outer - 3]]) translate([t[0] + 1.1, t[1], -1]) cube([6.8, 4, 32]); } for (x=[(outer - 9) / 2,(outer - 9) / 2 + 9], y=[1.1,outer-1.1]) { translate([x, y, 0]) cylinder(h=30, d=2.2); translate([y, x, 0]) cylinder(h=30, d=2.2); } } } module assembly() { difference() { union() { hull() { for (x=[1, outer + 3], y=[1, outer]) translate([x, y, 0]) cylinder(h=12, r=1.4); } hull() { for (x=[1.7, outer + 2.3], y=[1.7, outer - 0.7]) translate([x, y, 0]) cylinder(h=20, r=1.2); } } translate([2, -1.01, -1]) tenten(); translate([10, -1, -1]) cube([15, 5, 30]); } clips(); } module clips(mask=false) { translate([-3.51, 1, 0]) { if (mask) { clipmask(); } else { clip(); } } translate([outer + 7.51, 1, 0]) mirror([1, 0, 0]) { if (mask) { clipmask(); } else { clip(); } } translate([3, outer + 4.5, 0]) rotate([0, 0, -90]) { if (mask) { clipmask(); } else { clip(); } } translate([27, outer + 9.5, 0]) mirror([1, 0, 0]) rotate([0, 0, -90]) { if (mask) { clipmask(); } else { clip(); } } } module clip() { difference() { hull() { for (y=[0, 20]) translate([0, y, 0]) { translate([1, 2, 0]) cylinder(h=12, d=4); translate([1, 0, 0]) cube([4, 4, 12]); } } translate([1.2, -1.75, -1]) rotate([0, 0, 25]) cube([2.4, 2, 14]); for (y=[0.8:1.7:18]) translate([2.4, y, -1]) rotate([0, 0, 65]) cube([0.5, 2.0, 14]); for (y=[0.4:1.7:18]) translate([0.7, y, -1]) rotate([0, 0, -65]) cube([0.5, 2.1, 14]); } } module clipmask() { translate([0.3, -1, -1]) cube([2.7, 20.1, 14]); }