eps=0.01; infty=400; off_center = 112; ext_angle = 56; main_depth = 42; module off_c() { translate([0, -off_center, 0]) children(); }; module off_c_rot(angle) { off_c() rotate([0, 0, angle]) translate([0, off_center, 0]) children(); } module interdental_hole() { translate([0, 0, -infty/2]) cylinder(r=4.1, h=infty); translate([0, 0, 20]) scale ([2, 1, 1]) sphere(10, center=true); } module toothbrush_hole() { difference() { union() { translate([0, 0, 2]) cylinder(r1=4, r2=8, h = 13); translate([0, 0, -1]) cylinder(r=4, h = 3+eps); }; translate([-infty/2, -4.5-infty, -infty/2]) cube(infty); } translate([-3, 0, -infty/2]) cube([6, infty, infty]); } module body() { intersection() { off_c() rotate([0, 0, 0]) { cylinder(r = main_depth + off_center, h = 12, $fn = 60); //translate([0, 0, 12-eps]) // cylinder(r1 = 150, r2 = 0,h = 10, $fn = 60); }; translate([-infty/2, 0, -infty/2]) cube(infty); off_c_rot(ext_angle/2) translate([0, -infty/2, -infty/2]) cube(infty); off_c_rot(-ext_angle/2) translate([0, -infty/2, -infty/2]) scale([-1, 1, 1]) cube(infty); }; // 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); // off_c() cube(1, center=true); }; module body_neg() { // screw head hole rotate([-90, 0, 0]) translate([0,-6,5]) cylinder(r=3.5, h=infty); // screw head rotate([-90, 0, 0]) translate([0,-6,-infty/2]) cylinder(r=1.75, h=infty, $fn=6); for (angle = [-24:6:24]) { off_c_rot(angle) translate([0, 38, 0]) render() toothbrush_hole(); for (dist = [17,27]) off_c_rot(angle) translate([0, dist, 0]) interdental_hole(); } } difference() { body(); body_neg(); }