Those simple floor brush strips for the Samsung vacuum cleaner worked moderately well, but the urethane adhesive didn’t have enough grip on the plastic strips. Having just run out of that batch, I made up another set with slightly undercut holes:

That’s half a thread width on each side, just enough to give the adhesive something to grab. Such is the plan, anyway.
I taped the strips to a pair of credit cards (actually, flat cards without embossed characters), slathered a thin layer of urethane atop them, and laid on squares of the same wool fabric I used the last time:

Then I piled a steel block atop an aluminum slab on both arrays, fast forwarded a day, peeled and flexed and cut the strips apart:

The urethane foamed through the holes as I hoped and (seems to have) locked the fabric in place, at least well enough to withstand some experimental bending on the workbench.
Now, to see how they stand up to actual use…
The OpenSCAD source code:
// Samsung Vacuum cleaner nozzle floor strips // Ed Nisley KE4ZNU January 2013 // November 2013 - adapt to M2, enlarge holes Layout = "Build"; // Show, Build //- Extrusion parameters must match reality! // Print with +0 shells and 3 solid layers ThreadThick = 0.25; ThreadWidth = 0.4; HoleWindage = 0.75; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; // make holes end cleanly //---------------------- // Dimensions Body = [6.0,59.0,3*ThreadThick]; // width, length, thick Tab1 = [4.5,5.0,0.0]; // width, length, offset from centerline Tab2 = [3.5,5.0,0.5]; HoleOC = 8.0; // adhesive anchoring holes HoleDia = 2.0; HoleSides = 4; HoleMax = floor(Body[1]/(2*HoleOC)); echo("HoleMax: ",HoleMax); //---------------------- // 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); } module ShowPegGrid(Space = 10.0,Size = 1.0) { Range = floor(50 / Space); for (x=[-Range:Range]) for (y=[-Range:Range]) translate([x*Space,y*Space,Size/2]) %cube(Size,center=true); } module BackingStrip() { difference() { union() { translate([0,0,Body[2]/2]) cube(Body,center=true); translate([Tab1[2],-1*Body[1]/2,Body[2]/2]) cube([Tab1[0],2*Tab1[1],Body[2]],center=true); translate([Tab2[2],+1*Body[1]/2,Body[2]/2]) cube([Tab2[0],2*Tab2[1],Body[2]],center=true); } for (i = [-HoleMax:HoleMax]) translate([0,i*HoleOC,-Protrusion]) rotate(45) { PolyCyl(HoleDia,(Body[2] + 2*Protrusion),HoleSides); PolyCyl((HoleDia + ThreadWidth),(ThreadThick + Protrusion),HoleSides); } } } //---------------------- // Build it! ShowPegGrid(); if (Layout == "Show") BackingStrip(); if (Layout == "Build") rotate(90) BackingStrip();