Bathroom Door Retainer

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:

Bathroom Door Retainer - Slic3r
Bathroom Door Retainer – Slic3r

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:

Bathroom Door Retainer - installed
Bathroom Door Retainer – installed

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

Bathroom Door Retainer - bump
Bathroom Door Retainer – bump

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();
}