epsilon=0.01; infty=400; module cut_ellipse(height, dist, x) { difference() { translate([0, dist, height/2-x]) rotate([90, 0, 0]) scale([0.6, 1, 1]) cylinder(r=height/2, h=2); translate([0, 0, -infty/2]) cube(infty, center=true); }; }; module clip() { translate([-1.5, 0, -1]) cube([1.5, 8, 9]); translate([0, 0, -1]) difference() { cube([3, 3, 9]); translate([3-epsilon, 3-epsilon, -epsilon]) cylinder(r=3, h=9+2*epsilon); }; translate([0, 0, -1]) difference() { translate([-1, 8, 0]) cylinder(r=2, h=9); translate([-infty/2-1.5+epsilon, 0, 0]) cube(infty, center=true); }; }; module stem() { hull() { cut_ellipse(25, 31, 4); cut_ellipse(10, 24, 6); }; // left-side and right-side clip difference() { union() { translate([3.75, 31-epsilon, 0]) rotate([0, 15, 0]) scale([-1, 1, 1]) clip(); translate([-3.75, 31-epsilon, 0]) rotate([0, -15, 0]) clip(); }; translate([0, 0, -infty/2]) cube(infty, center=true); }; for (dist=[0:9.5:19]) translate([0, dist, 0]) interdental_cylinder(); }; module stem_minus() { for (dist=[0:9.5:19]) translate([0, dist, 0]) interdental_hole(); } module body() { difference() { union() { for (angle=[-24:6:24]) { translate([0, -112, 0]) rotate([0, 0, angle]) translate([0, 130, 0]) difference() { stem(); stem_minus(); } }; translate([0, -112, 0]) difference() { union() { cylinder(r=126, h=11); translate([0, 0, 11-epsilon]) scale([1, 1, 0.07]) sphere(r=126); difference() { union() { difference() { cylinder(r=159, h=11); translate([0,0,-infty/2]) cylinder(r=158, h=infty); }; }; rotate([0, 0, -24]) translate([infty/2, 0, 0]) cube(infty, center=true); rotate([0, 0, 24]) translate([-infty/2, 0, 0]) cube(infty, center=true); }; }; translate([0, 112-infty/2-epsilon, 0]) cube(infty, center=true); /* translate([0, 0, -infty/2-epsilon]) cube(infty, center=true); rotate([0, 0, -28]) translate([infty/2, 0, 0]) cube(infty, center=true); rotate([0, 0, 28]) translate([-infty/2, 0, 0]) cube(infty, center=true); */ }; // rear-side protrusion translate([-50, 1, 6]) rotate([0, 90, 0]) cylinder(r=3, h=40, $fn=4); // rear-side protrusion translate([10, 1, 6]) rotate([0, 90, 0]) cylinder(r=3, h=40, $fn=4); }; // screw head hole rotate([-90, 0, 0]) translate([0,-6,3]) cylinder(r=3.5, h=55); // screw head rotate([-90, 0, 0]) translate([0,-6,-infty/2]) cylinder(r=1.75, h=infty, $fn=6); }; }; module interdental_hole() { translate([0, 0, -infty/2]) cylinder(r=4, h=infty); } module interdental_cylinder() { // translate([-5.5, -5.5, 0]) cube([11, 11, 8]); difference() { cylinder(r=5.5, h=11); translate([-infty/2, 0, 19]) rotate([0, 90, 0]) cylinder(r=9, h=infty); } /* difference() { translate([0, -5.50, 3]) rotate([-90, 0, 0]) cylinder(r=5, h=11); translate([0, 0, -infty/2-epsilon]) cube(infty, center=true); }; */ }; /* for (angle=[-45:18:45]) { rotate([0, 0, angle]) for (dist=[30:10:60]) translate([dist, 0, 0]) difference() { interdental_cylinder(); interdental_hole(); } }; difference() { body(); rotate([-90, 0, 0]) translate([0,-4,3]) cylinder(r=3, h=infty); rotate([-90, 0, 0]) translate([0,-4,-epsilon]) cylinder(r=1.5, h=infty); }; */ body($fn=128); /* difference() { stem(); stem_minus(); }; */