Customizable Liquid Funnel
by Mach3 ·
Perfect Funnel. You know you can't pour boiling water into a PLA funnel, right?
Interactive Preview & Customizer
3D preview with OpenSCAD rendering on parameter changes.
The diameter of the wide opening at the top (sits on the bed)
The height of the conical section
The inner diameter of the spout exit
The length of the spout tube
Thickness of the funnel walls
Add external air-vent ribs?
Number of vent ribs
How far the rib sticks out (automatically capped by Rim Width)
Diameter of the rounded rib profile
Add a reinforced rim at the top?
Extra width of the top rim
Height of the rim
Add a hanging loop?
Diameter of the hanging hole
Smoothness of the model
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();

