$fn = 64; // Parameters cable_diameter = 5.2; // Target cable diameter + 0.2mm clearance num_clips = 5; // Number of clips in the strip clip_spacing = 12; // Distance between clip centers wall_thickness = 2.2; // Thickness of the clip walls base_thickness = 2.5; // Thickness of the base strip strip_width = 12; // Width of the strip (depth of the clips) opening_width = 3.5; // Width of the snap-in opening end_margin = 10; // Extra space at ends for mounting holes // Calculated values inner_r = cable_diameter / 2; outer_r = inner_r + wall_thickness; strip_length = (num_clips - 1) * clip_spacing + 2 * end_margin; difference() { // Main body (extruded 2D profile) translate([0, strip_width / 2, 0]) rotate([90, 0, 0]) linear_extrude(height = strip_width) { difference() { union() { // Base plate square([strip_length, base_thickness]); // Clip bodies for (i = [0 : num_clips - 1]) { translate([end_margin + i * clip_spacing, base_thickness + outer_r - 0.5]) { circle(r = outer_r); // Support block connecting circle to base translate([-outer_r, -(outer_r - 0.5)]) square([outer_r * 2, outer_r - 0.5]); } } } // Clip cutouts for (i = [0 : num_clips - 1]) { translate([end_margin + i * clip_spacing, base_thickness + outer_r - 0.5]) { // Inner cable hole circle(r = inner_r); // Snap-in straight opening translate([-opening_width / 2, 0]) square([opening_width, outer_r + 2]); // V-shaped chamfer for easy cable insertion translate([0, outer_r - 0.8]) polygon([ [-opening_width / 2, 0], [opening_width / 2, 0], [opening_width / 2 + 1.5, 2], [-opening_width / 2 - 1.5, 2] ]); } } } } // Mounting hole 1 (with countersink) translate([end_margin / 2, 0, -0.1]) { cylinder(r = 1.75, h = base_thickness + 1); // M3 screw clearance translate([0, 0, base_thickness - 1.5]) cylinder(r1 = 1.75, r2 = 3.5, h = 1.6); } // Mounting hole 2 (with countersink) translate([strip_length - end_margin / 2, 0, -0.1]) { cylinder(r = 1.75, h = base_thickness + 1); translate([0, 0, base_thickness - 1.5]) cylinder(r1 = 1.75, r2 = 3.5, h = 1.6); } }