Neale Pickett
·
2025-10-24
body.scad
1include <common.scad>
2use <MCAD/regular_shapes.scad>
3
4body_height = 189.68 + 25; // add 25 for built-in barrel
5
6rev = "preview";
7stamp = str(rev);
8
9module body() {
10 d1 = 17.0;
11 d2 = 20.4;
12 toneholes = [
13 [40, 7.0],
14 [66, 8.5],
15 [81, 7.0],
16 [106.5, 7.0],
17 [125.0, 7.5],
18 [144.4, 7.0],
19 ];
20
21
22 union() {
23 difference() {
24 // Combine cylinders to make it look curvy
25 union() {
26 bend_bot = 100;
27 bend_top = 180;
28 cylinder(h=body_height, d1=d1, d2=(d1+d2)/2);
29 translate([0, 0, bend_bot]) cylinder(h=bend_top-bend_bot, d1=d1, d2=d2);
30 translate([0, 0, bend_top]) cylinder(h=body_height-bend_top, d=d2);
31 }
32
33 // Inner bore, the most important part of the whole instrument!
34 translate([0, 0, -1]) cylinder(h=body_height+2, d1=id_bot, d2=id_top);
35
36 // Tone holes
37 for (hole = toneholes) {
38 translate([0, 0, hole[0]]) tonehole(d=hole[1]);
39 }
40
41 // Mortise
42 translate([0, 0, body_height-25]) {
43 d = 16.9;
44 cylinder(h=25, d=d);
45 translate([0, 0, -d/2]) cylinder(h=d/2, d1=0, d2=d);
46 }
47
48 translate([0, 0, 4]) intersection() {
49 cylinder_tube(50, d1/2+0.5, 1);
50 union() {
51 rotate([90, 90, -90]) {
52 linear_extrude(height=d1, convexity=4) {
53 translate([-8, -5]) import("ruby.svg");
54 }
55 }
56 rotate([90, 90, -160]) {
57 linear_extrude(height=d1, convexity=10) {
58 text(stamp, size=2, halign="right", valign="center");
59 }
60 }
61 }
62 }
63 }
64
65 // Rings
66 translate([0, 0, body_height-1.5]) torus((d2+3)/2, (d2-3)/2);
67 difference() {
68 // Fat one at the bottom, for good bed adhesion
69 translate([0, 0, 0]) torus((d1+3)/2, (d1-3)/2);
70 translate([0, 0, -25]) cube(50, center=true);
71 }
72 }
73}
74
75body();