$fn = 64; // --- Parameters --- cup_height = 45; // Total height of the cup top_diameter = 80; // Outer diameter at the top bottom_diameter = 60; // Outer diameter at the bottom wall_thickness = 2; // Thickness of the walls base_thickness = 3; // Thickness of the bottom base inside_fillet = 8; // Radius of the inside curve (makes scooping tokens easier) chamfer = 1.5; // Bottom chamfer to prevent elephant's foot // --- Calculated Variables --- r2_out = top_diameter / 2; r1_out = bottom_diameter / 2; r2_in = r2_out - wall_thickness; r1_in = r1_out - wall_thickness; // --- Model --- difference() { // Outer Body union() { // Anti-elephant foot chamfer cylinder(h = chamfer, r1 = r1_out - chamfer, r2 = r1_out); // Main tapered body translate([0, 0, chamfer]) cylinder(h = cup_height - chamfer, r1 = r1_out, r2 = r2_out); } // Inner Void (Scoopable Bowl) // Using hull() on a torus and top cylinder creates a perfectly smooth, convex inner bowl hull() { // Top opening (extended slightly to ensure clean cut) translate([0, 0, cup_height]) cylinder(h = 1, r = r2_in); // Bottom fillet ring translate([0, 0, base_thickness + inside_fillet]) rotate_extrude() translate([r1_in - inside_fillet, 0, 0]) circle(r = inside_fillet); } }