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() {
difference() {
union() {
for (i=[0,1], j=[0,1])
translate([i*(BarClipRad + DoorOffset + DoorThick + WallThick - CornerRad),j*(BarClipRad - CornerRad)])
rotate(TowelBarAngle) // towel bar shape
translate([0,-TowelBarSide/sqrt(2)]) // make access slot
module Latch() {
difference() {
translate([BarClipRad + DoorOffset,-BarClipRad/2,-Protrusion])
cube([DoorThick,BarClipOD,RetainerDepth + Protrusion],center=false);
// Build it!
if (Layout == "Show") {
if (Layout == "Build") {

8 thoughts on “Bathroom Door Retainer

  1. That’s a very nice gizmo and it really shows off the high quality of your prints!

    1. 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 …

    1. 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 …

  2. smooth curvy objects requiring alignment pins, support material, and epoxy coatings

    Except for the smooth part, you’ve described my next print to the dot :)
    Maybe I should stick to OpenSCAD to save myself :)

  3. I wonder how long until someone forgets the door is latched and that strategic weak point delaminates to save the towel bar :)

    1. And more importantly, will Ed then proceed to print a whole new one or glue this one back together – a real cliffhanger :)

Comments are closed.