$fn = 64; // --- Parameters --- rail_thickness = 5; // Thickness of the rail rail_height = 25; // Height of the rail wall = 3; // Wall thickness of the attachment clip_length = 40; // Length of the rail clip along the rail holder_inner_dia = 35; // Inner diameter for the scoop handle holder_height = 30; // Height of the scoop holder section slot_width = 18; // Width of the front opening to slide the handle in // --- Main Model --- difference() { // Solid body union() { // Rail clip body cube([clip_length, rail_thickness + (wall * 2), rail_height + wall]); // Connection bridge between clip and holder translate([0, rail_thickness + wall, 0]) cube([clip_length, (holder_inner_dia / 2) + wall, holder_height]); // Scoop holder outer cylinder translate([clip_length / 2, rail_thickness + (wall * 2) + (holder_inner_dia / 2), 0]) cylinder(h=holder_height, d=holder_inner_dia + (wall * 2)); } // --- Cutouts --- // 1. Rail slot (cut from bottom up) translate([-1, wall, -1]) cube([clip_length + 2, rail_thickness, rail_height + 1]); // 2. Scoop holder center hole (tube for the handle) translate([clip_length / 2, rail_thickness + (wall * 2) + (holder_inner_dia / 2), -1]) cylinder(h=max(holder_height, rail_height + wall) + 2, d=holder_inner_dia); // 3. Scoop holder front slot (opening for the scoop neck) translate([(clip_length - slot_width) / 2, rail_thickness + (wall * 2) + (holder_inner_dia / 2), -1]) cube([slot_width, holder_inner_dia + wall + 2, max(holder_height, rail_height + wall) + 2]); }