Neale Pickett
·
2025-12-13
wall-mount.scad
1module commandstrip() {
2 length = 46.0;
3 width = 15.8;
4 thick = 1.2; // They're actually thicker than this, but the strip needs to stick out a little
5 translate([-width/2, 0]) cube([width, length-width, thick]);
6 translate([0, length-width]) cylinder(d=width, h=thick);
7}
8
9module post(d, h=50) {
10 cylinder(h=h, d1=d, d2=d*0.8);
11 cylinder(h=5, d1=d*1.4, d2=d*0.8);
12 translate([0, 0, h]) sphere(d=d*0.8);
13}
14
15width = 125;
16depth = 36;
17height =35;
18
19module WhistleMount(){
20 $fn = 180;
21
22 difference() {
23 intersection() {
24 // Main body
25 translate([0, 0, height/2]) cube([width, depth, height], center = true);
26
27 // Chamfers!
28 translate([0, width * 0.4, 0]) rotate([0, 0, 45]) {
29 cube(width*sqrt(2), center=true);
30 }
31 }
32
33 // Holes for the whistles
34 for (x = [-50, -25, 0, 25, 50]) {
35 translate([x, -7, 5]) rotate([-3, 0, 0]) cylinder(h=300, d=15.5);
36 }
37
38 // Command strips
39 for (x = [-30, 30]) {
40 translate([x, depth/2 + 0.6, 30]) rotate([90, 180, 0]) commandstrip();
41 }
42
43 // Ruby
44 translate([0, -depth/2+0.6, 10]) rotate([90, 0, 0]) linear_extrude(height=50, convexity=10) {
45 scale(1.5) import("ruby.svg", center=true);
46 }
47 }
48}
49
50
51WhistleMount();