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
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
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
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
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:

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