Angled Pipe Coupler

An angled male-female pipe coupler.
Beware of using PVC pipes on the female side, PVC expands when it gets hot and will put a lot of force on the coupler.
The pipe sizes, angles, etc. are configurable in the SCAD file.
$fn=80;
module corner(diameter, angle, bendRadius, legLengthA, legLengthB) {
legLengthB=legLengthB-2.5;
translate([-bendRadius,0,0]) rotate([0,0,-angle]) {
rotate_extrude(angle=angle,convexity=10) {
translate([bendRadius,0,0]) {
circle(d=diameter);
}
}
rotate([180+(90-angle)+0.05,90,0]) translate([0,-bendRadius,0]) cylinder(d=diameter,h=legLengthA);
translate([bendRadius,0.05,0]) rotate([90,0,0]) cylinder(d=diameter,h=legLengthB);
}
}
module maleSide(angle, outerDiameter, wall, bendRadius, length) {
difference() {
corner(outerDiameter,angle,bendRadius,10,length+10);
corner(outerDiameter-(wall*2),angle,bendRadius,10+1,length+10+1);
}
}
module femaleSide(wallThickness, innerDiameter, maleSideOuterDiameter, depth) {
module flare() {
difference() {
cylinder(d2=innerDiameter+(wallThickness*2),d1=maleSideOuterDiameter,h=10);
translate([0,0,-0.001]) cylinder(d2=innerDiameter,d1=maleSideOuterDiameter-(wallThickness*2),h=10+0.02);
}
}
module engagement() {
difference() {
cylinder(d=innerDiameter+(wallThickness*2), h=depth);
translate([0,0,-0.001]) cylinder(d=innerDiameter, h=depth+0.002);
}
}
flare();
translate([0,0,10]) engagement();
}
module coupler(maleSideOuterDiameter, maleSideLength, femaleSideInnerDiameter, femaleSideDepth, bendAngle, wallThickness, bendRadius) {
maleSide(bendAngle,maleSideOuterDiameter,wallThickness, bendRadius, maleSideLength);
translate([0,10,0]) rotate([-90,90,0]) femaleSide(wallThickness, femaleSideInnerDiameter, maleSideOuterDiameter, femaleSideDepth);
%translate([0,80,0]) rotate([90,0,0]) cylinder(d=femaleSideInnerDiameter,h=40);
}
coupler(
24.6, // male side OD
25, // male length
25, // female side ID
20, // female side depth
90, // angle
2, // wall thickness
48, // bend radius
);