inner_d = 38; outer_d = 44; wall_thickness = 1.5; diaphragm_thickness = 0.8; cable_thickness = 4; base_h = 4; shader_h = 6; holder_h = 16; epsilon = 0.01; module diaphragm() { cylinder(h=diaphragm_thickness, r = outer_d/2 + wall_thickness-epsilon); }; module shader() { difference() { cylinder(r=outer_d/2 + wall_thickness, h = shader_h); translate([0, 0, -epsilon/2]) cylinder(r1 = outer_d/2+wall_thickness/2, r2=outer_d/2+wall_thickness/2-(2/5)*(outer_d-inner_d), h = shader_h + epsilon); }; }; module base() { difference() { cylinder(r = outer_d/2 + wall_thickness, h = base_h + epsilon); translate([0, 0, - epsilon/2]) cylinder(r = inner_d/2, h = base_h + 2*epsilon); }; }; module outer_clip() { difference() { cylinder(r = outer_d/2 + wall_thickness, h = holder_h-base_h); translate([0, 0, -epsilon/2]) cylinder(r = outer_d/2, h = holder_h - base_h + epsilon); }; intersection() { difference() { cylinder(r = outer_d/2 + wall_thickness - epsilon, h = holder_h-base_h-epsilon); translate([-50, -(inner_d-3)/2, -epsilon]) cube([100, inner_d-3, 100]); }; rotate_extrude() translate([outer_d/2+1.5, holder_h-base_h-1, 0]) circle(r = 2); }; }; module belt_clip() { intersection() { // belt clip arc difference() { cylinder(r = outer_d/2 + 2*wall_thickness + cable_thickness, h = shader_h + holder_h); translate([0, 0, -epsilon/2]) cylinder(r = outer_d/2 + wall_thickness + cable_thickness, h = shader_h + holder_h + epsilon); }; translate([0, -6, 0]) cube([outer_d + 4*wall_thickness + 2*cable_thickness + epsilon, 12, shader_h + holder_h]); }; difference() { // connect the clip to the body rotate([0, 0, -10]) translate([outer_d/2-3, 0, 0]) cylinder(r = cable_thickness + 2*wall_thickness + 3, h = shader_h + holder_h); translate([0, 0, -epsilon/2]) cylinder(r = outer_d/2 + wall_thickness - epsilon, h = shader_h + holder_h + epsilon); translate([0, -4, -epsilon/2]) cube([outer_d/2 + 2*wall_thickness + cable_thickness + epsilon, 20, holder_h + shader_h + epsilon]); }; intersection() { // hold the cable in position rotate([0, 0, 10]) translate([outer_d/2+2*wall_thickness + cable_thickness, 0, 0]) cylinder(r = 2.75, h = shader_h + holder_h); translate([0, 0, -epsilon/2]) cylinder(r = outer_d/2 + 2*wall_thickness + cable_thickness, h = shader_h + holder_h + epsilon); }; }; module main() { shader(); translate([0, 0, shader_h]) color([1, 0.5, 0.5, 0.2]) diaphragm(); translate([0, 0, shader_h-epsilon]) base(); translate([0, 0, shader_h+base_h-2*epsilon]) outer_clip(); belt_clip(); }; main($fn = 128);