$fn = 64; // --- Parameters --- cable_diameter = 8.2; // 8mm cable + 0.2mm clearance for fit num_clips = 5; // Number of clips in the strip wall_thickness = 2.5; // Thickness of the clip walls base_thickness = 2.0; // Thickness of the mounting base clip_spacing = 14.0; // Distance between clip centers strip_width = 10.0; // Width of the strip opening_width = 5.5; // Snap-in opening width (smaller than cable) screw_hole_dia = 3.5; // Diameter of mounting screw holes end_padding = 10.0; // Extra space at ends for screw holes // --- Calculated Values --- outer_radius = (cable_diameter / 2) + wall_thickness; inner_radius = cable_diameter / 2; total_length = (num_clips * clip_spacing) + (end_padding * 2); difference() { union() { // Base plate translate([0, -strip_width/2, 0]) cube([total_length, strip_width, base_thickness]); // Clip Array for (i = [0 : num_clips - 1]) { // Position each clip along the strip translate([end_padding + (i * clip_spacing) + (clip_spacing/2), 0, outer_radius]) { difference() { // Main clip body rotate([90, 0, 0]) cylinder(h=strip_width, r=outer_radius, center=true); // Inner cable hole rotate([90, 0, 0]) cylinder(h=strip_width + 1, r=inner_radius, center=true); // Snap-in opening with chamfered lead-in (V-shape) rotate([90, 0, 0]) linear_extrude(height=strip_width + 1, center=true) polygon([ [-opening_width/2, inner_radius * 0.2], [opening_width/2, inner_radius * 0.2], [opening_width/2 + 2, outer_radius + 1], [-opening_width/2 - 2, outer_radius + 1] ]); } } } } // Mounting screw holes // Left hole translate([end_padding/2, 0, -1]) cylinder(h=base_thickness + 2, d=screw_hole_dia); // Right hole translate([total_length - end_padding/2, 0, -1]) cylinder(h=base_thickness + 2, d=screw_hole_dia); }