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