$fn = 64; // --- Parameters --- cable_diameter = 12; // Inner diameter for the cable num_clips = 5; // Number of clips on the strip wall_thickness = 3; // Thickness of the clip walls strip_width = 15; // Width of the strip base_thickness = 3; // Thickness of the bottom base plate snap_opening = 9.5; // Top opening width (smaller than cable to snap in) mount_hole_dia = 4; // Diameter of the end mounting holes mount_margin = 15; // Space at the ends for mounting // --- Derived Values --- outer_diameter = cable_diameter + (wall_thickness * 2); clip_spacing = outer_diameter + 2; strip_length = (mount_margin * 2) + (num_clips * clip_spacing); clip_center_z = base_thickness + (cable_diameter / 2) + 1; // --- Main Geometry --- difference() { // Solid Bodies union() { // Base Strip translate([0, -strip_width / 2, 0]) cube([strip_length, strip_width, base_thickness]); // Clip Bodies for(i = [0 : num_clips - 1]) { x_pos = mount_margin + (clip_spacing / 2) + (i * clip_spacing); // Lower support block (connects cylinder to base) translate([x_pos, 0, clip_center_z / 2]) cube([outer_diameter, strip_width, clip_center_z], center=true); // Upper cylindrical body translate([x_pos, 0, clip_center_z]) rotate([90, 0, 0]) cylinder(h=strip_width, d=outer_diameter, center=true); } } // Subtractions for(i = [0 : num_clips - 1]) { x_pos = mount_margin + (clip_spacing / 2) + (i * clip_spacing); // Cable Hole translate([x_pos, 0, clip_center_z]) rotate([90, 0, 0]) cylinder(h=strip_width + 2, d=cable_diameter, center=true); // Snap Opening Cutout translate([x_pos, 0, clip_center_z + (outer_diameter / 2)]) cube([snap_opening, strip_width + 2, outer_diameter], center=true); // Inner top chamfer for easier cable insertion translate([x_pos, 0, clip_center_z + (outer_diameter / 2) + 1]) cube([snap_opening + 2, strip_width + 2, 2], center=true); } // Mounting Holes translate([mount_margin / 2, 0, -1]) cylinder(h=base_thickness + 2, d=mount_hole_dia); translate([strip_length - (mount_margin / 2), 0, -1]) cylinder(h=base_thickness + 2, d=mount_hole_dia); // Countersinks for mounting holes translate([mount_margin / 2, 0, base_thickness - 1.5]) cylinder(h=2.5, d1=mount_hole_dia, d2=mount_hole_dia + 4); translate([strip_length - (mount_margin / 2), 0, base_thickness - 1.5]) cylinder(h=2.5, d1=mount_hole_dia, d2=mount_hole_dia + 4); }