I made the pencil guides to help Mary design ruler quilting patterns, but sometimes she must line up the ruler with a feature on an existing pattern. To that end, we now have a reticle guide:

The general idea is that it’s easier to see the pattern on paper through the crosshair than through a small hole. You put the button over a feature, align the reticle, put the ruler against the button, replace it with pencil guide, and away you go.
The solid model looks much more lively than you’d expect:

Printing up a pair of each button produces the same surface finish as before; life is good!
The OpenSCAD source code as a GitHub Gist:
| // Quilting Ruler Adapters | |
| // Ed Nisley KE4ZNU October 2016 | |
| //- Extrusion parameters must match reality! | |
| 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); | |
| //———- | |
| // Dimensions | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| Offset = 0.25 * inch; | |
| Template = [2.0,2*Offset,3.0]; | |
| NumSides = 16*4; | |
| HoleSides = 8; | |
| //———————- | |
| // 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(d=(FixDia + HoleWindage),h=Height,$fn=Sides); | |
| } | |
| //———- | |
| // Build them | |
| translate([-Template[OD],0,0]) | |
| difference() { | |
| cylinder(d=Template[OD],h=Template[LENGTH],$fn=NumSides); | |
| translate([0,0,-Template[LENGTH]]) | |
| PolyCyl(Template[ID],3*Template[LENGTH],HoleSides); | |
| translate([0,0,-Protrusion]) | |
| cylinder(d1=2*Template[ID],d2=Template[ID],h=Template[LENGTH]/3 + Protrusion,$fn=HoleSides); | |
| translate([0,0,Template[LENGTH] + Protrusion]) | |
| mirror([0,0,1]) | |
| cylinder(d1=2*Template[ID],d2=Template[ID],h=Template[LENGTH]/3 + Protrusion,$fn=HoleSides); | |
| } | |
| translate([Template[OD],0,0]) | |
| difference() { | |
| cylinder(d=Template[OD],h=Template[LENGTH],$fn=NumSides); | |
| for (a=[45,135]) | |
| rotate(a) | |
| cube([0.70*Template[OD],0.15*Template[OD],3*Template[LENGTH]],center=true); | |
| } | |























