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