This isn’t quite the smoothly rounded clip I had in mind:

It seems somewhat better looking than the square design, though:

I ran off a few of both styles to have some on hand:

They’re in a bag until I install the new LED strips and needle light.
The OpenSCAD source code:
// LED Cable Clips
// Ed Nisley - KE4ZNU - October 2014
Layout = "Oval"; // Oval Square Build
//- Extrusion parameters must match reality!
ThreadThick = 0.20;
ThreadWidth = 0.40;
HoleWindage = 0.2; // extra clearance
Protrusion = 0.1; // make holes end cleanly
AlignPinOD = 1.70; // assembly alignment pins: filament dia
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
//----------------------
// Dimensions
Base = [12.0,12.0,IntegerMultiple(2.0,ThreadThick)]; // base over sticky square
CableOD = 2.0;
BendRadius = 3.0;
Bollard = [BendRadius,(sqrt(2)*Base[0]/2 - CableOD - BendRadius),2*CableOD];
B_BOT = 0;
B_TOP = 1;
B_LEN = 2;
NumSides = (Shape == "Square") ? 5*4 : 6*3;
//----------------------
// Useful routines
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
FixDia = Dia / cos(180/Sides);
cylinder(r=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
module ShowPegGrid(Space = 10.0,Size = 1.0) {
RangeX = floor(100 / Space);
RangeY = floor(125 / Space);
for (x=[-RangeX:RangeX])
for (y=[-RangeY:RangeY])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-- Square clip with central bollard
module SquareBollard() {
intersection() {
translate([0,0,(Base[2] + Bollard[B_LEN])/2]) // overall XYZ outline
cube(Base + [0,0,Bollard[2]],center=true);
union() {
translate([0,0,Base[2]/2]) // oversize mount base
scale([2,2,1])
cube(Base,center=true);
for (i=[-1,1] , j=[-1,1]) { // corner bollards
translate([i*Base[0]/2,j*Base[1]/2,(Base[2] - Protrusion)])
rotate(180/NumSides)
cylinder(r=Bollard[B_BOT],h=(Bollard[B_LEN] + Protrusion),center=false,$fn=NumSides);
translate([0,0,(Base[2] - Protrusion)]) // center tapered bollard
cylinder(r1=Bollard[B_BOT],r2=Bollard[B_TOP],
h=(Bollard[B_LEN] + Protrusion),
center=false,$fn=NumSides);
}
}
}
}
//-- Oval clip with central passage
module OvalPass() {
intersection() {
translate([0,0,(Base[2] + Bollard[B_LEN])/2]) // overall XYZ outline
cube(Base + [0,0,2*CableOD],center=true);
union() {
translate([0,0,Base[2]/2]) // oversize mount base
scale([2,2,1])
cube(Base,center=true);
for (j=[-1,1]) // bending ovals
translate([0,j*Base[1]/2,(Base[2] - Protrusion)])
resize([Base[0]/0.75,0,0])
cylinder(d1=0.75*(Base[1]-CableOD),d2=(Base[1]-CableOD)/cos(180/NumSides),
h=(Bollard[B_LEN] + Protrusion),
center=false,$fn=NumSides);
}
}
/*
# translate([0,0,6])
rotate([0,90,0])
cylinder(d=CableOD,h=10,center=true,$fn=48);
*/
}
//----------------------
// Build it
ShowPegGrid();
if (Layout == "Square")
SquareBollard();
if (Layout == "Oval")
OvalPass();