$fn=64; // --- Parameters --- body_length = 75; // Overall length of the squeezer body_width = 20; // Overall width body_thickness = 6; // Thickness (Z-height when printing) slot_length = 62; // Length of the internal squeezing slot slot_width = 1.2; // Width of the slot (tight enough to squeeze out paste) feed_hole_dia = 5.5; // Larger entry hole to easily insert the edge of the tube // --- Main Shape --- module toothpaste_squeezer() { difference() { // Main solid body hull() { translate([-body_length/2 + body_width/2, 0, 0]) cylinder(h=body_thickness, d=body_width, center=true); translate([body_length/2 - body_width/2, 0, 0]) cylinder(h=body_thickness, d=body_width, center=true); } // Squeezing slot hull() { translate([-slot_length/2 + slot_width/2, 0, 0]) cylinder(h=body_thickness+2, d=slot_width, center=true); translate([slot_length/2 - slot_width/2, 0, 0]) cylinder(h=body_thickness+2, d=slot_width, center=true); } // Feed hole for easy tube insertion translate([slot_length/2 - feed_hole_dia/2 + 1, 0, 0]) cylinder(h=body_thickness+2, d=feed_hole_dia, center=true); // Ergonomic grip grooves along the edges for(x = [-24 : 6 : 20]) { translate([x, body_width/2, 0]) cylinder(h=body_thickness+2, d=2.5, center=true); translate([x, -body_width/2, 0]) cylinder(h=body_thickness+2, d=2.5, center=true); } } } // --- Render --- // Positioned flat on the Z=0 plane for easy 3D printing translate([0, 0, body_thickness/2]) toothpaste_squeezer();