$fn = 64; // --- Parameters --- tube_length = 160.0; // Length of the sliding tube (determines max bag width) rod_dia = 5.0; // Diameter of the inner rod tube_od = 12.0; // Outer diameter of the sliding tube tube_id = 6.5; // Inner diameter of the sliding tube (rod + bag clearance) slit_width = 1.5; // Width of the slit for the bag handle_len = 15.0; // Length of the grip handle handle_width = 16.0; // Width of the grip handle transition_len = 12.0; // Length of the taper from handle to rod module inner_rod() { union() { // Grip handle translate([0, -handle_width/2, 0]) cube([handle_len + 0.1, handle_width, rod_dia]); // Tapered transition hull() { translate([handle_len, -handle_width/2, 0]) cube([0.1, handle_width, rod_dia]); translate([handle_len + transition_len, 0, rod_dia/2]) rotate([0, 90, 0]) cylinder(d=rod_dia, h=0.1); } // Main rod translate([handle_len + transition_len - 0.1, 0, rod_dia/2]) rotate([0, 90, 0]) cylinder(d=rod_dia, h=tube_length + 0.1); // Rounded tip translate([handle_len + transition_len + tube_length, 0, rod_dia/2]) sphere(d=rod_dia); } } module outer_tube_profile() { difference() { // Main body difference() { circle(d=tube_od); // Cut right side to make a flat bottom for 3D printing translate([tube_od/2 - 1, -tube_od]) square([tube_od, tube_od * 2]); } // Inner hole circle(d=tube_id); // Slit (on left side, pointing UP when printed) translate([-tube_od, -slit_width/2]) square([tube_od + 0.1, slit_width]); } } module outer_tube() { // Position it next to the inner rod, flat on the print bed translate([0, tube_od + 10, tube_od/2 - 1]) rotate([0, 90, 0]) difference() { linear_extrude(height=tube_length) outer_tube_profile(); // Flare the inner hole at the entry to guide the rod and lock onto taper translate([0, 0, -0.1]) cylinder(d1=tube_od - 2, d2=tube_id, h=15.2); // Flare the slit at the entry to easily catch the bag hull() { translate([-tube_od, -tube_id/2, -0.1]) cube([tube_od, tube_id, 0.1]); translate([-tube_od, -slit_width/2, 15]) cube([tube_od, slit_width, 0.1]); } } } // Render both parts side-by-side inner_rod(); outer_tube();