-
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 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 The model now sports a little ball to secure the retainer against the towel bar:

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:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// 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(); }