--- /dev/null
+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();
+}
+