The weather got warm enough to open the windows before pollen season started, which led to the front bathroom door slamming closed in the middle of the night when a gusty rainstorm blew through town. After far too many years, I decided this was an annoyance up with which I need no longer put.
A few minutes with OpenSCAD and Slic3r produces the shape:

It’s basically an extrusion of a 2D shape with a rectangular recess for the door chewed out.
An hour later, it’s in full effect:

The model now sports a little ball to secure the retainer against the towel bar:

Maybe someday I’ll reprint it.
That was easy …
The cast-iron pig sometimes standing guard as a doorstop in the relatively narrow doorway poses a bit of a foot hazard, so he moves into a closet during the off season. He can now remain there, snug and comfy, until a need for ballast arises.
The OpenSCAD source code as a GitHub Gist:
// Bathroom Door Retainer | |
// Ed Nisley KE4ZNU - May 2017 | |
Layout = "Show"; // Show Build | |
//------- | |
//- Extrusion parameters must match reality! | |
ThreadThick = 0.20; | |
ThreadWidth = 0.40; | |
HoleWindage = 0.2; | |
Protrusion = 0.1; // make holes end cleanly | |
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
//------- | |
// Dimensions | |
TowelBarSide = 20.5; // towel bar across flat side | |
TowelBarAngle = 45; // rotation of top flat from horizontal | |
DoorOffset = 16.0; // from towel bar to door | |
DoorThick = 36.5; | |
WallThick = 4.0; // minimum wall thickness | |
RetainerDepth = 10.0; // thickness of retaining notch | |
NumSides = 6*4; | |
CornerRad = WallThick; | |
BarClipOD = TowelBarSide*sqrt(2) + 2*WallThick; | |
BarClipRad = BarClipOD/2; | |
OAH = RetainerDepth + WallThick; | |
module LatchPlan() { | |
union() { | |
linear_extrude(height=OAH,convexity=4) | |
difference() { | |
union() { | |
circle(d=BarClipOD,$fn=NumSides); | |
hull() | |
for (i=[0,1], j=[0,1]) | |
translate([i*(BarClipRad + DoorOffset + DoorThick + WallThick - CornerRad),j*(BarClipRad - CornerRad)]) | |
circle(r=CornerRad,$fn=4*4); | |
} | |
rotate(TowelBarAngle) // towel bar shape | |
square(size=TowelBarSide,center=true); | |
translate([0,-TowelBarSide/sqrt(2)]) // make access slot | |
rotate(-TowelBarAngle) | |
square(size=[2*TowelBarSide,TowelBarSide],center=false); | |
} | |
translate([0,-TowelBarSide/sqrt(2),OAH/2]) | |
rotate([90,0,45]) | |
sphere(r=TowelBarSide/25,$fn=4*3); | |
} | |
} | |
module Latch() { | |
difference() { | |
LatchPlan(); | |
translate([BarClipRad + DoorOffset,-BarClipRad/2,-Protrusion]) | |
cube([DoorThick,BarClipOD,RetainerDepth + Protrusion],center=false); | |
} | |
} | |
//------- | |
// Build it! | |
if (Layout == "Show") { | |
Latch(); | |
} | |
if (Layout == "Build") { | |
translate([0,0,OAH]) | |
rotate([180,0,0]) | |
Latch(); | |
} |
That’s a very nice gizmo and it really shows off the high quality of your prints!
I admit to considerable bias, but Hilbert Curve infill definitely looks less “3D printed” than the usual straight-line pattern. We agreed the latch wasn’t much uglier than a store-bought version (if one existed), which would surely be dead white, smoothly rounded, and a poor fit to both the door and the towel rack.
Getting consistent results required some effort, with the result my much-hacked M2 Just Works with no fuss or muss. Need a shape? Presto! There it is!
Thanks for the good words …
Now is the time to take up Fusion 360 (said he with devilish grin) :)
Aye, you’ll have me designing smooth curvy objects requiring alignment pins, support material, and epoxy coatings. Life is soooo much simpler with OpenSCAD: no temptation to make anything more complicated than absolutely necessary.
Hey, those two rounded corners are a stylin’ thing …
Except for the smooth part, you’ve described my next print to the dot :)
Maybe I should stick to OpenSCAD to save myself :)
I wonder how long until someone forgets the door is latched and that strategic weak point delaminates to save the towel bar :)
And more importantly, will Ed then proceed to print a whole new one or glue this one back together – a real cliffhanger :)
Given how rarely we close the door, the next owner will break it.