After donating the never–sufficiently-to-be-damned Samsung vacuum cleaner (and all its remaining bags & doodads) to a nonprofit’s tag sale, we picked up a Sears Kenmore Progressive vacuum cleaner that seemed to be the least awful of the current offerings. Unlike all previous vacuum cleaners, its tools & doodads have complex plastic fittings with latches and keyways and all manner of gimcrackery. The designers seem to have hands and legs of far-above-average size, but that’s another rant.
All this came to a head when I attempted to vacuum the fuzz out of the refrigerator’s evaporator coils, because the long snout that reaches the back of the refrigerator doesn’t fit the aperture in the giant handle.
Well, at least I can fix that…
The first step involved modeling the plastic fitting that snaps into the handle:

The latch on the handle snaps into an opening that took some tinkering to reproduce. Stand back, I’m going to use trigonometry:
translate([0,-11.5/2,23.0 - 5.0]) // latch opening cube(Latch); translate([OEMTube[ID1]/2 + EntryHeight/tan(90-EntryAngle),0,0]) // latch ramp translate([(Latch[1]/cos(180/EntrySides))*cos(EntryAngle)/2,0,(Latch[1]/cos(180/EntrySides))*sin(EntryAngle)/2]) rotate([0,-EntryAngle,0]) intersection() { rotate(180/EntrySides) PolyCyl(Latch[1],Latch[0],EntrySides); translate([-(2*Latch[0])/2,0,-Protrusion]) cube(2*Latch[0],center=true); }
Which spits out two suitable shapes with the proper positions and alignments:

The magic wand for the refrigerator originally slid into the Samsung’s metal pipe, so I put a slightly tapered cylinder inside a somewhat more tapered exterior (which seems chunky enough to withstand my flailing around under the refrigerator), then topped it off with the male fitting:

The Kenmore crevice tool snaps under the gargantuan plastic handle, which limits it to being 6.5 inches long, totally unable to reach into any of the nontrivial crevices around here, and in the way when it’s not being used. Some rummaging turned up a longer crevice tool from the Electrolux That Came With The House™, an old-school tool that slipped over its pipe. Modeling a straight cylinder inside a tapered cylinder that fits the tool didn’t take long:

Flushed with success, I found a smaller floor brush than the new Kenmore, with dimensions similar to the Electrolux snout, so another module appeared:

All of them build with the latch end upward to avoid needing support structure, with a 5 mm brim for good platform adhesion:

I printed them during the PDS Mini Maker Faire as examples of Useful Things You Can Do With a 3D Printer:

As I pointed out to nearly everybody, the Big Lie about 3D printing is that you’ll just download somebody else’s model to solve your problem. In general, that won’t work, because nobody else has your problem; if you can’t do solid modeling, there’s no point in you having a 3D printer. There’s also no point in going to Kinko’s to get a standardized 3D printed doodad, because you can just order a better-looking injection-molded part directly from Sears (or an aftermarket source) and be done with it.
I loves me some good OpenSCAD action on my Makergear M2, though…
The OpenSCAD source code:
// Kenmore vacuum cleaner nozzle adapters // Ed Nisley KE4ZNU November 2015 // Layout options Layout = "CreviceTool"; // MaleFitting CoilWand FloorBrush CreviceTool //- Extrusion parameters must match reality! // Print with +1 shells and 3 solid layers ThreadThick = 0.25; ThreadWidth = 0.40; HoleWindage = 0.2; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; // make holes end cleanly //---------------------- // Dimensions ID1 = 0; // for tapered tubes ID2 = 1; OD1 = 2; OD2 = 3; LENGTH = 4; OEMTube = [35.0,35.0,41.7,40.5,30.0]; // main fitting tube EndStop = [OEMTube[ID1],OEMTube[ID2],47.5,47.5,6.5]; // flange at end of main tube FittingOAL = OEMTube[LENGTH] + EndStop[LENGTH]; $fn = 12*4; //---------------------- // 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); } //------------------- // Male fitting on end of Kenmore tools // This slides into the end of the handle or wand and latches firmly in place module MaleFitting() { Latch = [40,11.5,5.0]; // rectangle latch opening EntryAngle = 45; // latch entry ramp EntrySides = 16; EntryHeight = 15.0; // lower edge on *inside* of fitting KeyRadius = 1.0; translate([0,0,6.5]) difference() { union() { cylinder(d1=OEMTube[OD1],d2=OEMTube[OD2],h=OEMTube[LENGTH]); // main tube hull() // insertion guide for (i=[-(6.0/2 - KeyRadius),(6.0/2 - KeyRadius)], j=[-(28.0/2 - KeyRadius),(28.0/2 - KeyRadius)], k=[-(26.0/2 - KeyRadius),(26.0/2 - KeyRadius)]) translate([(i - (OEMTube[ID1]/2 + OEMTube[OD1]/2)/2 + 6.0/2),j,(k + 26.0/2 - 1.0)]) sphere(r=KeyRadius,$fn=8); translate([0,0,-EndStop[LENGTH]]) // wand tube butts against this cylinder(d=EndStop[OD1],h=EndStop[LENGTH] + Protrusion); } translate([0,0,-OEMTube[LENGTH]]) // main bore cylinder(d=OEMTube[ID1],h=2*OEMTube[LENGTH] + 2*Protrusion); translate([0,-11.5/2,23.0 - 5.0]) // latch opening cube(Latch); translate([OEMTube[ID1]/2 + EntryHeight/tan(90-EntryAngle),0,0]) // latch ramp translate([(Latch[1]/cos(180/EntrySides))*cos(EntryAngle)/2,0,(Latch[1]/cos(180/EntrySides))*sin(EntryAngle)/2]) rotate([0,-EntryAngle,0]) intersection() { rotate(180/EntrySides) PolyCyl(Latch[1],Latch[0],EntrySides); translate([-(2*Latch[0])/2,0,-Protrusion]) cube(2*Latch[0],center=true); } } } //------------------- // Refrigerator evaporator coil wand module CoilWand() { union() { translate([0,0,50.0]) rotate([180,0,0]) difference() { cylinder(d1=EndStop[OD1],d2=42.0,h=50.0); translate([0,0,-Protrusion]) cylinder(d1=35.0,d2=35.8,h=100); } translate([0,0,50.0 - Protrusion]) MaleFitting(); } } //------------------- // Refrigerator evaporator coil wand module FloorBrush() { union() { translate([0,0,60.0]) rotate([180,0,0]) difference() { union() { cylinder(d1=EndStop[OD1],d2=32.4,h=10.0); translate([0,0,10.0 - Protrusion]) cylinder(d1=32.4,d2=30.7,h=50.0 + Protrusion); } translate([0,0,-Protrusion]) cylinder(d1=28.0,d2=24.0,h=100); } translate([0,0,60.0 - Protrusion]) MaleFitting(); } } //------------------- // Crevice tool module CreviceTool() { union() { translate([0,0,60.0]) rotate([180,0,0]) difference() { union() { cylinder(d1=EndStop[OD1],d2=32.0,h=10.0); translate([0,0,10.0 - Protrusion]) cylinder(d1=32.0,d2=30.4,h=50.0 + Protrusion); } translate([0,0,-Protrusion]) cylinder(d1=28.0,d2=24.0,h=100); } translate([0,0,60.0 - Protrusion]) MaleFitting(); } } //---------------------- // Build it! if (Layout == "MaleFitting") MaleFitting(); if (Layout == "CoilWand") CoilWand(); if (Layout == "FloorBrush") FloorBrush(); if (Layout == "CreviceTool") CreviceTool();