Having just emptied a propane tank while making bacon, I couldn’t find any of the wrench adapters I made to remove the QD adapter from the tank’s POL fitting. With memory of the broken garden valve wrench still fresh, I tweaked the solid model to include a trio of 1 mm music wire reinforcements:

Holes that small require clearing with a 1 mm drill, after which ramming the wires in place poses no problem:

Except for the one that got away:

The music wire came from a coil and each snippet required gentle straightening; perhaps that one wasn’t sufficiently bar-straight.
Anyhow, I printed two tools for that very reason:

They’re now where I can’t miss ’em the next time I need them, although that’s not where the previous ones reside.
The OpenSCAD source code as a GitHub Gist:
// Propane tank QD connector adapter tool | |
// Ed Nisley KE4ZNU November 2012 | |
// 2018-04-08 toss MCAD includes overboard | |
// 2020-07-27 add reinforcing rods | |
//- Extrusion parameters must match reality! | |
// Print with about half a dozen perimeter threads and 50% infill | |
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 | |
inch = 25.4; | |
//---------------------- | |
// Dimensions | |
WrenchSize = (5/8) * inch; // across the flats | |
WrenchThick = 10; | |
NoseDia = 8.6; | |
NoseLength = 9.0; | |
LockDia = 12.5; | |
LockRingLength = 1.0; | |
LockTaperLength = 1.5; | |
TriDia = 15.1; | |
TriWide = 12.2; // from OD across center to triangle side | |
TriOffset = TriWide - TriDia/2; // from center to triangle side | |
TriLength = 9.8; | |
NeckDia = TriDia; | |
NeckLength = 4.0; | |
RebarOD = 1.0; // music wire pin 1 mm = 39 mil | |
RebarLength = WrenchThick + NeckLength + TriLength; | |
//---------------------- | |
// 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); | |
} | |
//------------------- | |
// Build it... | |
$fn = 4*6; | |
union() { | |
translate([0,0,(WrenchThick + NeckLength + TriLength - LockTaperLength - LockRingLength + Protrusion)]) | |
cylinder(r1=NoseDia/2,r2=LockDia/2,h=LockTaperLength); | |
translate([0,0,(WrenchThick + NeckLength + TriLength - LockRingLength)]) | |
cylinder(r=LockDia/2,h=LockRingLength); | |
difference() { | |
union() { | |
translate([0,0,WrenchThick/2]) | |
cube([WrenchSize,WrenchSize,WrenchThick],center=true); | |
cylinder(r=TriDia/2,h=(WrenchThick + NeckLength +TriLength)); | |
cylinder(r=NoseDia/2,h=(WrenchThick + NeckLength + TriLength + NoseLength)); | |
} | |
for (a=[-1:1]) { | |
rotate(a*120) | |
translate([(TriOffset + WrenchSize/2),0,(WrenchThick + NeckLength + TriLength/2 + Protrusion/2)]) | |
cube([WrenchSize,WrenchSize,(TriLength + Protrusion)],center=true); | |
} | |
for (a=[-1:1]) { | |
rotate(a*120 + 60) | |
translate([NoseDia/2,0,-Protrusion]) | |
PolyCyl(RebarOD,RebarLength,6); | |
} | |
} | |
} |