Mary wanted a rigid cap for a Clover seam ripper that came with a small plastic sheath, so I called one from the vasty digital deep:

The solid model looks about like you’d expect, with a brim around the bottom to paste it on the platform:

I added a slightly tapered entry to work around the usual tolerance problems:

The taper comes from a hull wrapped around eight small spheres:

That’s surprisingly easy to accomplish, at least after you get used to this sort of thing:
hull() { // entry taper for (i=[-1,1] , j=[-1,1]) translate([i*(HandleEntry[0]/2 - StemRadius),j*(HandleEntry[1]/2 - StemRadius),0]) sphere(r=StemRadius,$fn=4*4); for (i=[-1,1] , j=[-1,1]) translate([i*(HandleStem[0]/2 - StemRadius),j*(HandleStem[1]/2 - StemRadius),HandleEntry[2] - StemRadius]) sphere(r=StemRadius,$fn=4*4); }
The side walls are two threads thick and, at least in PETG, entirely too rigid to slide on easily. I think a single-thread wall with a narrow ridge would provide more spring; if this one gets too annoying, I’ll try that.
The OpenSCAD source code as a GitHub gist:
// Clover seam ripper cap | |
// Ed Nisley KE4ZNU - April 2016 | |
//- Extrusion parameters - must match reality! | |
// Build with a 5 mm brim to keep it glued to the platform | |
ThreadThick = 0.25; | |
ThreadWidth = 0.40; | |
Protrusion = 0.1; | |
//------ | |
// Dimensions | |
StemRadius = 0.50; // corner radius | |
HandleStem = [6.1, 7.1, 9.0]; | |
HandleEntry = HandleStem + [1.0,1.0,-4.0]; // Z is -(straight part of stem) | |
Cap = [8.5,11.0,45.0]; // XY exterior, Z interior | |
//---------------------- | |
//- Build it | |
difference() { | |
union() { | |
translate([0,0,Cap[2]/2]) // main body column | |
cube(Cap,center=true); | |
translate([-Cap[0]/2,0,Cap[2]]) // rounded cap | |
rotate([0,90,0]) | |
cylinder(d=Cap[1],h=Cap[0],$fn=8*4); | |
translate([Cap[0]/2 - Protrusion,0,(Cap[2] + Cap[1]/2)/2]) // text | |
rotate([0,90,0]) | |
linear_extrude(height=ThreadWidth,convexity=10) | |
text("Mary Nisley",halign="center",valign="center",size=0.5*Cap[1],font="Arial"); | |
} | |
hull() // stem + blade clearance | |
for (i=[-1,1] , j=[-1,1]) | |
translate([i*(HandleStem[0]/2 - StemRadius),j*(HandleStem[1]/2 - StemRadius),-Protrusion]) | |
cylinder(r=StemRadius,h=Cap[2] + Protrusion,$fn=4*4); | |
hull() { // entry taper | |
for (i=[-1,1] , j=[-1,1]) | |
translate([i*(HandleEntry[0]/2 - StemRadius),j*(HandleEntry[1]/2 - StemRadius),0]) | |
sphere(r=StemRadius,$fn=4*4); | |
for (i=[-1,1] , j=[-1,1]) | |
translate([i*(HandleStem[0]/2 - StemRadius),j*(HandleStem[1]/2 - StemRadius),HandleEntry[2] - StemRadius]) | |
sphere(r=StemRadius,$fn=4*4); | |
} | |
} |