-
Tailor’s Clapper: 3D Printed Finger Grips
With the pockets milled into the oak blocks, the next step is to insert a pair of comfy 3D printed finger grips:

Ironing weight – prototype grip Getting comfy required a bank shot off the familiar chord equation to find the radius of a much larger circle producing the proper depth between the known width. The recess then comes from subtracting a hotdog from a lozenge exactly filling the wood pocket.

Ironing Weight Finger Grip – recess chord A pair of grips takes just under two hours to print while requiring no attention, which I vastly prefer to tending the Sherline.
The wood pocket is 7 mm deep and the grips stand 6.5 mm tall, leaving just enough room for three blobs of acrylic adhesive to hold them together. After squishing the grips into their pockets, a pair of right angles aligned everything while the adhesive cured:

Ironing weight – grip adhesive curing Mary asked for a longer weight for a place mat project, with a slightly narrower block to compensate for the additional length:

Ironing weight – seam ironing B The grip and pocket were the same size, so it was just a matter of tweaking the block size and cutting more wood.
All in all, a quick project with satisfying results!
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// Oak ironing weight finger grips // Ed Nisley KE4ZNU 2023-01 Layout = "Show"; // [Block,Grip,Show,Build] //- Extrusion parameters must match reality! /* [Hidden] */ ThreadThick = 0.25; ThreadWidth = 0.40; HoleWindage = 0.2; Protrusion = 0.1; // make holes end cleanly inch = 25.4; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); ID = 0; OD = 1; LENGTH = 2; //———- // Dimensions // Length along X axis Block = [250.0,50.0,39.0]; // overall wood block BlockRadius = 10.0; CornerRadius = 10.0; Kerf = 0.2; Socket = [160.0,25.0,6.5]; // raw recess into block SocketRadius = Socket.y/2; echo(Socket=Socket,SocketRadius=SocketRadius); WallThick = ThreadWidth; // Thinnest printed wall Clearance = 0.5; // between grip and recess GripBlock = Socket – [2*Clearance,2*Clearance,Clearance]; GripBlockRadius = SocketRadius – Clearance; echo(GripBlock=GripBlock); GripDepth = 5.0; // finger grip recess GripRecess = [GripBlock.x – 2*WallThick,GripBlock.y – 2*WallThick,GripDepth]; GripRecessRadius = GripBlockRadius – WallThick; echo(GripRecess=GripRecess,GripRecessRadius=GripRecessRadius); GripChordRadius = (pow(GripDepth,2) + pow(GripRecess.y,2)/4) / (2*GripDepth); echo(GripChordRadius=GripChordRadius); NumSides = 4*8; //———- // Shapes module WoodBlock() { difference() { hull() for (i=[-1,1], j=[-1,1]) // rounded block translate([i*(Block.x/2 – BlockRadius),j*(Block.y/2 – BlockRadius),-Block.z/2]) cylinder(r=BlockRadius,h=Block.z,$fn=NumSides); for (j=[-1,1]) // grip socket translate([0,j*(Block.y/2 + Protrusion),0]) rotate([j*90,0,0]) hull() { for (i=[-1,1]) translate([i*(Socket.x/2 – SocketRadius),(Socket.y/2 – SocketRadius),0]) cylinder(r=SocketRadius,h=Socket.z + Protrusion,$fn=NumSides); } cube([2*Block.x,2*Block.y,Kerf],center=true); } } module Grip() { difference() { hull() for (i=[-1,1]) // overall grip block translate([i*(GripBlock.x/2 – GripBlockRadius),0,0]) cylinder(r=GripBlockRadius,h=GripBlock.z,$fn=NumSides); hull() { for (i=[-1,1]) // grip recess translate([i*(GripBlock.x/2 – GripRecessRadius – WallThick), 0, GripChordRadius + GripBlock.z – GripDepth]) sphere(r=GripChordRadius,$fn=NumSides); } } } //———- // Build them if (Layout == "Block") WoodBlock(); if (Layout == "Grip") Grip(); if (Layout == "Show") { color("Brown") WoodBlock(); color("Silver") for (j=[-1,1]) translate([0,j*(Block.y/2 – GripBlock.z),0]) rotate([j*-90,0,0]) Grip(); } if (Layout == "Build") { for (i=[-1,1]) translate([i*(Block.y/2 – GripBlock.z),0,0]) rotate([0,0,90]) Grip(); }