// ============================================================ // Elbow Inlet Adapter // 40 OD vertical stub -> smooth 90 deg bend -> 70 mm run // // Bore profile (per spec): // * 35 mm ID through the vertical leg and the whole elbow // * necks 35 -> 30 mm over the first 10 mm of the run (venturi) // * widens 30 -> 32.1 mm over the remaining 60 mm (opening) // Outer profile: // * 40 mm OD through leg + elbow, then a single gradual taper // down to the opening OD; wall never below `tip_wall`. // // The bend is a swept quarter-torus (not a mitred joint), which // is kinder to both airflow and layer adhesion. // ============================================================ /* [Vertical inlet leg] */ // Outer diameter of the vertical stub and elbow inlet_od = 40; // Inner diameter through the leg and elbow inlet_id = 35; // Straight rise before the bend starts ("goes up a few mm") leg_h = 5; /* [Elbow] */ // Centerline bend radius. Must be > inlet_od / 2 (else the torus // self-intersects). Bigger = gentler sweep but taller part. bend_r = 24; /* [Horizontal run] */ // Length of the straight run after the bend run_len = 70; // The bore necks from inlet_id down to throat_id over this length throat_len = 10; // Narrowest bore diameter throat_id = 30; // Bore diameter at the opening (sized to accept your mating part) tip_id = 32.1; // Wall thickness at the opening tip_wall = 2.5; /* [Quality] */ $fa = 1.5; $fs = 0.4; // ---------------- derived ---------------- tip_od = tip_id + 2 * tip_wall; // 37.1 at defaults elbow_exit = [bend_r, 0, leg_h + bend_r]; // where the run begins eps = 0.01; // quarter-torus sweep: starts at [0,0,leg_h] pointing +Z, // exits at elbow_exit pointing +X. Pass a 2D child (circle) to sweep. module elbow_sweep() { translate([bend_r, 0, leg_h]) mirror([1, 0, 0]) rotate([90, 0, 0]) rotate_extrude(angle = 90) translate([bend_r, 0]) children(); } // everything solid (no bore) module solid() { cylinder(h = leg_h + eps, d = inlet_od); // leg elbow_sweep() circle(d = inlet_od); // bend translate(elbow_exit) // run rotate([0, 90, 0]) cylinder(h = run_len, d1 = inlet_od, d2 = tip_od); } // the complete air path, slightly over-extended at both open ends module bore() { translate([0, 0, -1]) cylinder(h = leg_h + 1 + eps, d = inlet_id); elbow_sweep() circle(d = inlet_id); translate(elbow_exit) rotate([0, 90, 0]) { // venturi neck: 35 -> 30 over throat_len translate([0, 0, -eps]) cylinder(h = throat_len + 2*eps, d1 = inlet_id, d2 = throat_id); // gradual widening: 30 -> 32.1 over the rest, punched past the tip widen = run_len - throat_len; slope = (tip_id - throat_id) / widen; translate([0, 0, throat_len]) cylinder(h = widen + 1, d1 = throat_id, d2 = tip_id + slope * 1); } } module adapter() { difference() { solid(); bore(); } } adapter(); // Printing: stand it on the big opening face (run vertical, leg // curving over at the top). The sweep keeps overhangs gradual; // a little tree support under the leg stub is all it needs.