--- /dev/null
+$fn=100;
+
+module hose_ferule(t=0.3) { //t = tolerance
+ //thread side
+ translate([0,0,2]) hull() rotate_extrude() translate([(t+13.5-4)/2,0,0]) circle(d=4);
+ cylinder(d=t+13.5, h=2);
+
+ //crimp
+ cylinder(d=t+12, h=30);
+
+ //hose side
+ translate([0,0,10.5]) {
+ translate([0,0,2]) hull() rotate_extrude() translate([(t+13.5-4)/2,0,0]) circle(d=4);
+ translate([0,0,6.5]) hull() rotate_extrude() translate([(t+13.5-4)/2,0,0]) circle(d=4);
+ translate([0,0,2]) cylinder(d=t+13.5, h=6.5-2);
+ }
+
+ //hose
+ translate([0,0,15]) cylinder(d=t+12.5, h=30);
+ translate([0,0,29]) cylinder(d1=t+12.5, d2=20, h=5); //inner bevel
+}
+
+module hose_cone() {
+ difference() {
+ //cone
+ translate([0,0,0.01]) cylinder(d1=23.5, d2=20.5, h=30);
+ //outer bevel
+ rotate_extrude() rotate([0,0,45]) translate([15,30.4,0]) square(5, center=true);
+ hose_ferule();
+ }
+}
+
+module snap_fit(t=0) {
+ hull() {
+ translate([-9,-2,0]) cylinder(d=2+t, h=31);
+ translate([-200,-2,0]) cylinder(d=2+t, h=31);
+ }
+ translate([-11.5,0,0]) cube([5+t,2+t,66], center=true);
+ translate([-9.3,0.6,0]) rotate([0,0,55]) cube([2.5+t,2.5+t,66], center=true);
+}
+
+module cone_cutout(t=0) {
+ difference() {
+ hose_cone();
+ translate([-25,0,0]) cube(50);
+
+ snap_fit(t);
+ mirror([1,0,0]) snap_fit(t);
+ }
+}
+
+// Instantiate
+
+cone_cutout(t=0.3);
+
+translate([0,5,0]) difference() {
+ hose_cone();
+ cone_cutout();
+}