The Tektronix Circuit Computer needs text along radial lines:

Fortunately, this doesn’t require nearly as much effort as the text-on-arcs code, because GCMC includes functions to rotate paths around the origin:
return rotate_xy(TextPath,Angle) + CenterPt;
The only trick is figuring out how to handle the justification, given the overall path length:
local pl = TextPath[-1].x;
local ji = (Justify == TEXT_LEFT) ? 0mm :
(Justify == TEXT_CENTERED) ? -pl/2 :
(Justify == TEXT_RIGHT) ? -pl :
0mm;
A testcase showed it worked:

With that in hand, I took the liberty of slightly simplifying the original Tek layout:

If lives depended on it, one could duplicate the Tek layout, but they don’t and I didn’t. Fancy typography isn’t a GCMC thing.
And, yeah, laser printing is way crisper than a pen drawing.
The GCMC source code as a GitHub Gist:
comment("RadialText test"); | |
ctr = [0mm,0mm]; | |
r = 20mm; | |
a = 0deg; | |
tp = scale(typeset("Left Inward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_LEFT,INWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
tp = scale(typeset("Left Outward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_LEFT,OUTWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
a = 90deg; | |
tp = scale(typeset("Right Inward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_RIGHT,INWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
tp = scale(typeset("Right Outward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_RIGHT,OUTWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
a = 180deg; | |
tp = scale(typeset("Center Inward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_CENTERED,INWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
tp = scale(typeset("Center Outward",TextFont),LegendTextSize); | |
tpr = RadialText(tp,ctr,r,a,TEXT_CENTERED,OUTWARD); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
a = 270deg; | |
RadialLegend("Offset to radius",ctr,r,a,TEXT_CENTERED,INWARD,-0.5); | |
goto(ctr); | |
move([0,-2*r,EngraveZ]); | |
goto([r,0mm,-]); | |
circle_cw(ctr); |
//----- | |
// Write text on a radial line | |
function RadialText(TextPath,CenterPt,Radius,Angle,Justify,Orient) { | |
local pl = TextPath[-1].x; // path length | |
local ji = (Justify == TEXT_LEFT) ? 0mm : // justification indent | |
(Justify == TEXT_CENTERED) ? -pl/2 : | |
(Justify == TEXT_RIGHT) ? -pl : | |
0mm; | |
if (Orient == INWARD) { | |
TextPath = rotate_xy(TextPath,180deg); | |
ji = -ji; | |
} | |
TextPath += [Radius + ji,0mm]; | |
return rotate_xy(TextPath,Angle) + CenterPt; | |
} | |
//----- | |
// Draw a radial legend | |
// Offset in units of char height: 0 = baseline on radius, +/- = above/below | |
function RadialLegend(Text,Center,Radius,Angle,Justify,Orient,Offset) { | |
local tp = scale(typeset(Text,TextFont),LegendTextSize) + [0mm,Offset * LegendTextSize.y]; | |
local tpr = RadialText(tp,Center,Radius,Angle,Justify,Orient); | |
feedrate(TextSpeed); | |
engrave(tpr,TravelZ,EngraveZ); | |
} | |