All of the plastic pads vanished from the legs of a steel shelf unit somewhere along the way:

Some solid modeling produced a suitable replacement shape:

A few prototypes (with a broken OEM version at lower left) matched the model to reality:

They’re natural & black TPU, because the job requirements include being tough and bendy:

Each one takes about half an hour to ooze from the Makergear M2, so after verifying the prototype’s fit, printing four at a time makes sense:

The OpenSCAD code includes the pegs in the original and the first chunky TPU version:

It turns out they don’t have any obvious benefit in a TPU pad, so they’re disabled in the code.
Now those legs sit firmly on the floor and the post tops aren’t nearly so threatening.
The OpenSCAD source code as a GitHub Gist:
| // Steel Shelf Foot Pads | |
| // Ed Nisley – KE4ZNU | |
| // 2026-04-18 | |
| include <BOSL2/std.scad> | |
| /* [Hidden] */ | |
| Protrusion = 0.01; | |
| NumSides = 4*9; | |
| $fn=NumSides; | |
| Clearance = 1.0/2; | |
| WallThick = 1.0 + Clearance; | |
| BaseThick = 2.0; | |
| PadOAH = BaseThick + 11.0; | |
| RollID = 6.4; | |
| RollOD = 7.4 + Clearance; | |
| RollOffset = 29.5; | |
| LegThick = 0.5 + 2*Clearance; | |
| Pins = [ | |
| [-(RollOD/2), (RollOffset + RollOD/2),0], | |
| [(RollOffset + RollOD/2), -(RollOD/2),0], | |
| ]; | |
| //—– | |
| // Build things | |
| union() { | |
| difference() { | |
| union() { | |
| for (pin = Pins) | |
| translate(pin) | |
| cyl(PadOAH,d=RollOD + 2*WallThick,anchor=BOTTOM); | |
| translate([-(WallThick + LegThick),-(WallThick + LegThick),0]) | |
| cuboid([2*WallThick + LegThick,WallThick + LegThick + Pins[0].y,PadOAH], | |
| anchor=BOTTOM+LEFT+FRONT); | |
| translate([-(WallThick + LegThick),-(WallThick + LegThick),0]) | |
| cuboid([WallThick + LegThick + Pins[1].x,2*WallThick + LegThick,PadOAH], | |
| anchor=BOTTOM+LEFT+FRONT); | |
| cyl(PadOAH,r=(WallThick + LegThick),anchor=BOTTOM); | |
| } | |
| up(BaseThick) | |
| cyl(PadOAH,r=LegThick,anchor=BOTTOM); | |
| up(BaseThick) | |
| for (pin = Pins) | |
| translate(pin) | |
| cyl(PadOAH,d=RollOD,anchor=BOTTOM); | |
| up(BaseThick) { | |
| translate(Pins[0]) | |
| cuboid([RollOD/2,RollOD/2,PadOAH],anchor=BOTTOM+LEFT+BACK); | |
| translate(Pins[1]) | |
| cuboid([RollOD/2,RollOD/2,PadOAH],anchor=BOTTOM+RIGHT+FRONT); | |
| } | |
| up(BaseThick) { | |
| fwd(LegThick) | |
| cuboid([LegThick,Pins[0].y + LegThick,PadOAH],anchor=BOTTOM+RIGHT+FRONT); | |
| left(LegThick) | |
| cuboid([Pins[1].x + LegThick,LegThick,PadOAH],anchor=BOTTOM+LEFT+BACK); | |
| } | |
| } | |
| if (false) | |
| for (pin = Pins) | |
| translate(pin) { | |
| cyl(PadOAH,d=RollID/2,anchor=BOTTOM); | |
| for (a = [0,90]) | |
| zrot(a) | |
| cuboid([1.0,RollID – 2*Clearance,PadOAH],anchor=BOTTOM); | |
| } | |
| } | |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.