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