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 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.
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();