← Back to Models
Customizable Liquid Funnel

Customizable Liquid Funnel

by Mach3 ·

Perfect Funnel. You know you can't pour boiling water into a PLA funnel, right?

Interactive Preview & Customizer

3D STL viewer with browser-based OpenSCAD rendering on parameter changes.

Loading previewLoading preview...

The diameter of the wide opening at the top (sits on the bed)

step 1

The height of the conical section

step 1

The inner diameter of the spout exit

step 1

The length of the spout tube

step 1

Thickness of the funnel walls

step 0.5

Add external air-vent ribs?

Number of vent ribs

step 1

How far the rib sticks out (automatically capped by Rim Width)

step 0.5

Diameter of the rounded rib profile

step 0.5

Add a reinforced rim at the top?

Extra width of the top rim

step 0.5

Height of the rim

step 0.5

Add a hanging loop?

Diameter of the hanging hole

step 1

Smoothness of the model

WASM compiler loads on first parameter change.
Download current STL

Prompt

create deeply customizable funnel (for liquids)

OpenSCAD Code

/* [Global] */

// The diameter of the wide opening at the top (sits on the bed)
top_diameter = 80; // [20:1:300]

// The height of the conical section
funnel_height = 60; // [10:1:200]

// The inner diameter of the spout exit
spout_inner_diameter = 10; // [2:1:100]

// The length of the spout tube
spout_length = 30; // [0:1:200]

// Thickness of the funnel walls
wall_thickness = 1.6; // [0.4:0.4:4.0]

/* [Air Vent Ribs] */

// Add external air-vent ribs?
add_vent_ribs = true;

// Number of vent ribs
rib_count = 4; // [2:1:12]

// How far the rib sticks out (automatically capped by Rim Width)
rib_protrusion = 2.0; // [0.5:0.5:10.0]

// Diameter of the rounded rib profile
rib_width = 3.0; // [1.0:0.5:8.0]

/* [Features] */

// Add a reinforced rim at the top?
add_rim = true;

// Extra width of the top rim
rim_width = 4.0; // [1.0:0.5:10.0]

// Height of the rim
rim_height = 3.0; // [1.0:0.5:10.0]

// Add a hanging loop?
add_hanging_loop = true;

// Diameter of the hanging hole
hanging_hole_dia = 10; // [3:1:25]

/* [Quality] */

// Smoothness of the model
$fn = 64; // [32, 64, 128, 256]

/* [Hidden] */
r_top_outer = top_diameter / 2;
r_top_inner = r_top_outer - wall_thickness;
r_spout_outer = (spout_inner_diameter / 2) + wall_thickness;
r_spout_inner = spout_inner_diameter / 2;

// Limit rib height to rim width
actual_rib_h = min(rib_protrusion, rim_width);

// 2D Profile for Rim and Loop (Flat bottom, rounded top)
module half_round_profile(w, h) {
    hull() {
        square([w, 0.1]); // Flat bottom
        square([0.1, h]); // Inner wall
        translate([w - (h/2), h/2]) circle(d = h); // Rounded outer top corner
    }
}

module funnel_assembly() {
    difference() {
        union() {
            // 1. Main Cone
            cylinder(h = funnel_height, r1 = r_top_outer, r2 = r_spout_outer);
            
            // 2. Spout
            translate([0, 0, funnel_height])
            cylinder(h = spout_length, r1 = r_spout_outer, r2 = r_spout_outer * 0.9);
            
            // 3. Flat-Bottom Rim
            if (add_rim) {
                rotate_extrude()
                translate([r_top_outer, 0, 0])
                half_round_profile(rim_width, rim_height);
            }
            
            // 4. Integrated Hanging Loop
            if (add_hanging_loop) {
                // X Position: Rim edge + radius of the hole. 
                // This makes the hole tangent to the rim edge.
                loop_x_pos = r_top_outer + rim_width + (hanging_hole_dia / 2);
                loop_ring_thickness = 3.5;
                
                translate([loop_x_pos, 0, 0])
                difference() {
                    hull() {
                        // The loop ring itself
                        rotate_extrude()
                        translate([hanging_hole_dia/2, 0, 0])
                        half_round_profile(loop_ring_thickness, rim_height);
                        
                        // Wide Bridge back to the funnel body for strength
                        translate([-loop_x_pos + r_top_outer + 1, -(hanging_hole_dia/2 + loop_ring_thickness), 0])
                        cube([0.1, (hanging_hole_dia + loop_ring_thickness*2), rim_height]);
                    }
                    // The actual hole
                    translate([0, 0, -1])
                    cylinder(h = rim_height + 2, d = hanging_hole_dia);
                }
            }
            
            // 5. Tapered Ribs with Flat Base
            if (add_vent_ribs) {
                for (i = [0 : rib_count - 1]) {
                    rotate([0, 0, i * (360 / rib_count)])
                    hull() {
                        // Rib Base - Outer (Flat on bed)
                        translate([r_top_outer + actual_rib_h - (rib_width/2), 0, 0])
                        cylinder(d = rib_width, h = 0.1);
                        
                        // Rib Base - Inner (Flat on bed)
                        translate([r_top_outer, 0, 0])
                        cylinder(d = rib_width, h = 0.1);
                        
                        // Rib Tip - Rounded (High Z)
                        translate([r_spout_outer, 0, funnel_height])
                        sphere(d = 0.5);
                    }
                }
            }
        }
        
        // --- HOLLOWING ---
        translate([0, 0, -0.1])
        cylinder(h = funnel_height + 0.1, r1 = r_top_inner, r2 = r_spout_inner);
        
        translate([0, 0, funnel_height - 0.1])
        cylinder(h = spout_length + 0.2, r1 = r_spout_inner, r2 = r_spout_inner * 0.9);
    }
}

funnel_assembly();