← Back to Models
Exhaust hose adapter for small skylight - for 3D printers and others

Exhaust hose adapter for small skylight - for 3D printers and others

by viewprintlab ·

A place to attach a 4" (100mm) hose to vent out a small (18-22") skylight. The goal was to not require permanent mounting, so the intent is to use command strips or mounting tape.

The port as show is 100mm ID - should be 100mm OUTside diameter, didn't catch until I printed. Easy to adjust in SCAD.

The port can be extended to use one of the many magnetic coupling designs to allow for fast disconnect if required (I glued a magnetic mount in).

Screenshots

Model screenshot

Prompt

An adapter for a 4 inch flexible hose to fit in a skylight. The adapter should be U-shaped and able to adjust from 18-22 inches wide. The legs of the adapter should be a fixed 5 inches.

OpenSCAD Code

// --- Parameters (in mm) ---
$fn = 64;
inch = 25.4;

plate_thick = 15; 
leg_length = 5 * inch;
hose_diameter = 4 * inch;
hose_collar_height = 1 * inch;
bar_height = 130; 

// Female arm reduced by 25mm
female_arm_length = (12 * inch) - 25; 
// Male arm length maintained to ensure 22" total reach
male_arm_length = 12 * inch; 

// Width for preview (18 to 22 inches)
total_width_preview = 22 * inch; 

// 5cm requirement (distance from leg edge to hose edge)
dist_from_leg = 50; 
hose_center_x = plate_thick + dist_from_leg + (hose_diameter / 2);

// Tolerances
tol = 0.5;

// Calculated track start to avoid the hose port
track_start_ref = hose_center_x + (hose_diameter/2) + 15;
available_track_len = female_arm_length - track_start_ref;

module port_arm_female() {
    difference() {
        union() {
            // Main Face Plate
            cube([female_arm_length, plate_thick, bar_height]);
            
            // 5-inch Leg (Positive Y)
            cube([plate_thick, leg_length, bar_height]);
            
            // Hose Collar
            translate([hose_center_x, plate_thick, bar_height/2])
            rotate([-90, 0, 0])
            difference() {
                cylinder(d = hose_diameter + 10, h = hose_collar_height);
                translate([0, 0, -1])
                cylinder(d = hose_diameter, h = hose_collar_height + 2);
            }
        }
        
        // Hose Cutout
        translate([hose_center_x, -1, bar_height/2])
        rotate([-90, 0, 0])
        cylinder(d = hose_diameter, h = plate_thick + 2);
        
        // Internal track for the slider 
        translate([track_start_ref, 3, 10])
        cube([available_track_len + 1, plate_thick - 6, bar_height - 20]);
    }
}

module slider_arm_male() {
    // The tongue is sized to match the available track in the female arm
    tongue_len = available_track_len;

    union() {
        // Main Face Plate (The part that stays outside)
        // Calculated to ensure total width can be reached
        outer_body_len = male_arm_length - tongue_len;
        
        translate([tongue_len, 0, 0])
        cube([outer_body_len, plate_thick, bar_height]);
        
        // 5-inch Leg (Positive Y) at the very end
        translate([tongue_len + outer_body_len - plate_thick, 0, 0])
        cube([plate_thick, leg_length, bar_height]);
        
        // Sliding Tongue (Male)
        translate([0, 3 + tol/2, 10 + tol/2])
        cube([tongue_len, plate_thick - 6 - tol, bar_height - 20 - tol]);
    }
}

// --- Assembly View ---
// X-positioning for preview
male_pos_x = total_width_preview - male_arm_length;

port_arm_female();

translate([male_pos_x, 0, 0])
slider_arm_male();

// --- Printing Instructions ---
// 1. Render and export 'port_arm_female()'
// 2. Render and export 'slider_arm_male()'
// Note: If the male arm (approx 304mm) is too long for your bed, 
// you can rotate it diagonally or print it vertically.