A spate of tidying-up led to mounting an outlet strip along the back of a bench:

Rather than drill holes into the top of the bench for those screws, they fit into M4 brass inserts heat-staked into the brackets:

The holes for those inserts aren’t centered side-to-side on the brackets, because the screw holes aren’t centered on the bent-steel angles forming the outlet strip endplates.
The bottom arm on the brackets probably isn’t necessary, but they kept the outlet strip from crawling away while I match-drilled two holes for the screws into the side of the benchtop.
For obvious reasons, the brackets print on their sides:

Another outlet strip from a different manufacturer is, of course, different, but changing three parameters in the OpenSCAD program summons a different bracket from the vasty digital deep:

Parametric modeling and a 3D printer are exactly the right hammers for the job …
The OpenSCAD source code as a GitHub Gist:
| // Shower soap dish | |
| // Ed Nisley – KE4ZNU | |
| // 2026-06-04 | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Show,Build] | |
| /* [Hidden] */ | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; | |
| NumSides = 3*3*4; | |
| Gap = 10.0/2; | |
| $fn=NumSides; | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| BenchThick = 21.0; // workbench top | |
| ScrewOD = 4.0; // into edge of bench | |
| Insert = [4.0,5.5,10.0]; // robust M4 insert | |
| WallThick = 10.0; | |
| BaseThick = 10.0; | |
| OutletBase = [15.0,40.0]; | |
| HoleOffset = 6.5; // from outside edge of bracket | |
| HoleOC = 24.0; | |
| MountOA = [OutletBase.x,OutletBase.y,BenchThick + Insert[LENGTH] + 1.0 + BaseThick]; | |
| //———- | |
| // Build it | |
| module Mount() { | |
| difference() { | |
| cuboid(MountOA,rounding=1.0,anchor=BOTTOM + BACK); | |
| up(BaseThick) | |
| fwd(WallThick) | |
| cuboid([2*MountOA.x,MountOA.y,BenchThick],anchor=BOTTOM + BACK); | |
| up(BaseThick + BenchThick/2) back(Protrusion) | |
| ycyl(OutletBase.y,d=ScrewOD,circum=true,$fn=6,anchor=BACK); | |
| for (j=[-1,1]) | |
| fwd(MountOA.y/2 + j*HoleOC/2) | |
| right(HoleOffset – MountOA.x/2) | |
| up(MountOA.z + Protrusion) | |
| cyl(Insert[LENGTH],d=Insert[OD],circum=true,$fn=6,anchor=TOP); | |
| } | |
| } | |
| //———- | |
| // Build it | |
| if (Layout == "Show") { | |
| left(Gap + MountOA.x/2) | |
| Mount(); | |
| right(Gap + MountOA.x/2) | |
| xflip() Mount(); // mirror for the other end of the outlet strip | |
| } | |
| if (Layout == "Build") { | |
| left(MountOA.z/2) | |
| up(MountOA.x/2) | |
| yrot(90) | |
| Mount(); | |
| fwd(1.5*MountOA.y) | |
| left(MountOA.z/2 – BenchThick/2 – Insert[LENGTH]/2) | |
| zrot(180) | |
| up(MountOA.x/2) | |
| yrot(-90) | |
| xflip() Mount(); // mirror for the other end of the outlet strip | |
| } |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.