GCMC Radial Text

The Tektronix Circuit Computer needs text along radial lines:

Tek CC - original RC arrow layout
Tek CC – original RC arrow layout

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:

Radial text testcase
Radial text testcase

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

Tek CC - radial text example
Tek CC – radial text example

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