Somehow, one of the brackets that supports the small shelf inside the freezer of our Whirlpool refrigerator went missing over the many intervening years and repairs; we never used that shelf and stashed it in a closet almost immediately after getting the refrigerator, so not having the bracket didn’t matter. We recently set up a chest freezer in the basement for all the garden veggies that used to fill all the space available and decided to (re-)install the shelf, which meant we needed a bracket.
It’s impossible to figure out exactly which “shelf stud” in that list would solve the problem, but one of the upper-left pair in that set seems to be about right. On the other paw, I don’t need all the other brackets and doodads and screws, sooo… I can probably make one.
Start with a few measurements, then doodle up the general idea:

A bit of OpenSCAD solid modeling:

The yellow bars support the ceiling of that big dovetail, which would otherwise sag badly. The OEM bracket has nicely rounded corners on the base and a bit of an overall radius at the end of the post; this was pretty close and easier to do.
Now it’s time to Fire the Thing-O-Matic…
I switched from blue to white filament during the print, because I figured I’d print another one after I got the sizes right, so it emerged with an attractive blue base:

A better view of the support structure:

Two of the bars snapped off cleanly, but the third required a bit of scraping:

Somewhat to my surprise, Prototype 001 slipped snugly over the matching dovetail on the freezer wall, with about the same firm fit as the OEM brackets:

And it works perfectly, apart from that attractive blue base that I suppose we’ll get used to after a while:

I have no idea whether ABS is freezer-rated. It seems strong enough and hasn’t broken yet, so we’ll declare victory and keep the source code on tap.
The whole project represents about an hour of hammering out OpenSCAD code for the solid model and another hour of printing, which means I’d be better off to just buy the parts kit and throw away the unused bits. Right?
I loves me my Thing-O-Matic…
The OpenSCAD source code:
// Shelf support bracket
// for Whirlpool freezer
// Ed Nisley KE4ZNU Octoboer 2012
//include </mnt/bulkdata/Project Files/Thing-O-Matic/MCAD/units.scad>
//include </mnt/bulkdata/Project Files/Thing-O-Matic/Useful Sizes.scad>
// Layout options
Layout = "Build";
// Overall layout: Show Build
// Printing plates: Build
// Parts: Post Base Keystone Support
ShowGap = 10; // spacing between parts in Show layout
//- Extrusion parameters must match reality!
// Print with +1 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
//----------------------
// Dimensions
PostLength = 17.5;
PostWidth = 8.2;
PostHeight = 14.4;
PostOffset = 4.4;
PostTopWidth = 4.0;
PostTopHeight = 4.2;
BaseLength = 22.6;
BaseWidth = 20.8;
BaseThick = 5.0;
KeystoneOffset = 3.4;
KeyThick = IntegerMultiple(3.0,ThreadThick);
KeyBase = 2.5;
SlotOpening = 11.63;
//----------------------
// 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) {
Range = floor(50 / Space);
for (x=[-Range:Range])
for (y=[-Range:Range])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-------------------
// Component parts
//--- Post
module Post(h=PostLength) {
PostTopAngle = atan((PostWidth - PostTopWidth)/(2*PostTopHeight));
PostBottomRadius = PostWidth/2;
PostPolyTop = [PostTopWidth/2,0];
PostPolyBottom = [PostWidth/2,-PostTopHeight];
hull() {
linear_extrude(height=h) {
polygon(points=[
[-PostPolyTop[0],PostPolyTop[1]],
PostPolyTop,
PostPolyBottom,
[-PostPolyBottom[0],PostPolyBottom[1]]
]);
translate([0,-PostHeight + PostBottomRadius])
circle(r=PostBottomRadius,$fn=4*8);
}
}
}
//--- Base block
module Base() {
linear_extrude(height=BaseThick)
square([BaseWidth,BaseLength],center=true);
}
//-- Keystone slot
module Keystone() {
Tx = SlotOpening/2 + KeyBase;
rotate([90,0,0])
linear_extrude(height=BaseLength)
polygon(points=[
[-Tx,KeyThick],
[ Tx,KeyThick],
[ SlotOpening/2,0],
[ SlotOpening/2,-Protrusion],
[-SlotOpening/2,-Protrusion],
[-SlotOpening/2,0]
]);
}
//--- Support structure
module Support() {
SupportLength = BaseLength - 2*ThreadWidth;
SupportWidth = 2*ThreadWidth;
SupportHeight = KeyThick - Protrusion;
SupportPeriod = 7.0*ThreadWidth;
SupportBeams = 3; // must be odd -- choose to fit
SIndex = floor((SupportBeams - 1)/2);
for (i=[-SIndex:SIndex])
translate([(i*SupportPeriod - SupportWidth/2),-(SupportLength + ThreadWidth),0])
color("Yellow") cube([SupportWidth,SupportLength,SupportHeight]);
}
//--- The whole thing!
module Bracket(ShowSupp) {
union() {
difference() {
Base();
translate([0,(BaseLength/2 - KeystoneOffset),0])
Keystone();
}
translate([0,(BaseLength/2 - PostOffset),BaseThick - Protrusion])
Post(h=(PostLength + Protrusion));
}
if (ShowSupp)
translate([0,(BaseLength/2 - KeystoneOffset),0])
Support();
}
//----------------------
// Build it!
ShowPegGrid();
if (Layout == "Show")
Bracket(false);
if (Layout == "Build")
Bracket(true);
if (Layout == "Post")
Post();
if (Layout == "Base")
Base();
if (Layout == "Keystone")
Keystone();
if (Layout == "Support") {
Support();
% Keystone();
}
























