Sign Specification Proposal

From FlightGear wiki
Jump to navigation Jump to search
Cleanup.png This article may require cleanup to meet the quality standards of the wiki. Please improve this article if you can.

This is a proposal for a sign specification language shared by FlightGear and X-Plane, and to be edited by members of the "sign expert groups" of either project. (Basically, that's Ben SUPNIK and me, Melchior FRANZ. :-)


A sign specification string defines the contents and type of airport signs as described in FAA specification 5345-44f (or later):

The string may only contain ASCII printable characters, it must not contain any whitespace. It is built of instructions and glyph names, the latter of which can be single-letter or multi-letter glyph names.

Instructions are started with an @ as escape character. Both instructions and multi-letter glyph names have to be put in curly braces. single-letter glyph names can be used outside braces, as well as inside. Elements in curly braces have to be separated with commas. Example:


where @Y1 is an instruction, "foo" is a multi-letter glyph, and "2", "3" and "R" are single-letter glyphs. The same could be written as

 {@Y1}{foo}{2}{3}{R}  or  {@Y1,foo,2,3,R}  or  {@Y1,foo}{2,3,R} etc.


Sign Types

These instructions specify sign types. They refer to the sign names in the FAA specification:

L858-Y @Y "Direction, Destination, Boundary" sign (black on yellow)
L858-R @R "Mandatory Instruction" sign (white on red with black outline)
L858-L @L "Location" sign (yellow text and frame on black)
L858-B @B "Runway Distance Remaining" sign (white on black)

These sign type specifiers are used to request FAA signs L858-Y, L858-R, L858-L and L858-B of unspecified size. It is up to the implementation to choose a default size. If the size is known, then a size digit is appended, which also refers to the FAA standard:

Size 1
0.460 m
Size 2
0.610 m
Size 3
0.760 m
Size 4
1.220 m
Size 5
0.760 m
L858-Y @Y1 @Y2 @Y3
L858-R @R1 @R2 @R3
L858-L @L1 @L2 @L3
L858-B @B4 @B5


Signs are associated with a heading. The heading specifies the viewer's heading when (s)he looks at the sign front. An @@ instruction stops the description for the front side and starts the one for the backside. It doesn't affect the sign type:


requests a yellow L858-Y sign of "Size 1", with up-arrow and letters "28R" on the front side, and "10L" of the same type on the backside.

Contents on front and backside may have different lengths. Sign specs without @@ or with no glyphs after it describe a single sided sign.

Glyph Names

Single Letter Glyph Names

These generally stand for themselves. An A glyph will typically produce a sign element showing an "A". Exceptions: "_" stands for a space, and "|" for a sign divider (used for separating sign elements on lighted signs). Example:


uses three single-letter glyphs 2, 8, R, where each of them produces that letter on the sign: "28R". Some characters follow special rules:

{ } may not be used at all -- the symbols are to be referred to via multi-letter glyph names
, @ are only allowed outside of curly braced groups
* (asterix) yields a centered (raised) dot in @Y, @R, and @L

Multi-Letter Glyph Names

^u up arrow
^d down arrow
^l left arrow
^r right arrow
^lu left-up arrow
^ru right-up arrow
^ld left-down arrow
^rd right-down arrow
r1 roman numeral I
r2 roman numeral II
r3 roman numeral III
no-entry no-entry sign (white circle with horizontal bar on red background)
critical ILS Critical Area Boundary sign
safety Runway Safety Area

Note that diagonal arrows always have the right/left letter first, as is common in Cartesian coordinate systems. So it's ^ru (right up), not ^ur. The "caret" symbol has no special meaning. It is not an escape character as the @, but a regular letter. ^ru is a regular multi-letter glyph name.

Mandatory glyphs

@Y A-Z, 0-9, ^l-^rd (8 arrows), * (raised dot), - (hyphen), r1, r2, r3
@R A-Z, 0-9, ^l-^rd (8 arrows), . (raised dot), - (hyphen), r1, r2, r3
@L A-Z, 0-9
@B 0-9

Some glyphs are not associated with a sign type, and do always yield the same symbol, independent of the context. These glyphs do not change the current sign type. Everything that follows will have the same type that was active before them. Such glyphs are:


For example:


describes a sign of type L858-Y/Size-2, with left arrow and letter "B", then a "no-entry" sign (white on red), and finally again in L858-Y/Size 2 letter "B" and a right arrow.

The result of using other glyphs that aren't available for the active sign type is undefined. It is assumed that implementations simply drop them.

Sign Framing

A sign "frame" refers to the bracketing that may visually occur at the edge of a sign or subsection of a sign. Framing of signs in the apt.dat file is done implicitly - the flight simulator adds frames to the sign under three conditions:

  • The beginning and end of each side of the sign are framed.
  • Any sign type declaration causes a frame closing and reopening.
  • The | glyph induces a sign frame to close and reopen.

These methods do not produce double-frames. For example, these two signs would produce the same results.


In the second case, the second @Y command is unnecessary, but does not induce a double-frame even though it is following a, @@ command.

The syntax of the sign spec allows for sign frames to be specified as glyphs, but this is not allowed in apt.dat signs.

It is up to the flight simulator to create the bracketing effect, either by adding additional textured tiles to the signs, or by trimming the tiled boundaries, or some other method.

Some sign types may not support framing - in this case, commands that would induce framing are ignored by the flight simualtor.

Framing is required for @R, @Y and @L signs but not @B signs.

Interface Questions

  • Are multiple sign types with different heights legal in a single sign?

Ben says: I would prefer to declare this illegal in apt.dat. If there is a legitimate use of this, I would like to see a real-world photo. X-Plane's renderer cannot gracefully handle this case, mostly because I don't know what it should look like.

  • What is the effect of double-state changes, e.g. {@Y1,A,@Y1,B}?

Ben says: are we happy saying that double-state changes are no-ops?

  • What is the effect of double-breaks, e..g {@Y}A||B?

Ben says: are we happy saying that double-frame-breaks are no-ops (e.g. || and | are equivalent)?

Implementation Questions

These questions are about rendering and therefore don't have relevance in a spec that does not dictate rendering conformance.

  • Does {@R1}22R{no-entry} have a frame divider between the R and no-entry sign?
  • Does {@Y1}22R{no-entry} have a frame divider between the R and no-entry sign?


(Ben moved some comments to discussion.)

Other comments/change requests for glyphs:

  • Can we use a glyph other than the period for the raised dot glyph? (For example, how about the asterix *)? My concern is that if we ever want period as a glyph we should keep the period character unused for now.
  • I think we should require the digits 0-9 as required glyphs for @L signs. I am not 100% sure of this, but I think that in some large airports, some taxiways are numbered, e.g. B1, B2 and thus the black framed location sign would need numbers and letters.
  • I think we should require the no-entry, safety, and critical signs to be mandatory.
  • I would be okay with having the roman numeral signs be mandatory.

Also for the | glyph: I am not sure, but it looked to me like the FAA spec implies frame dividers do work on unlit signs, e.g. for {^dl,B,|,^l,A} type signs. Do we have any pics of what the unlit signs would look like? (The PDF didn't show on my computer too well.)

Hi guys, a couple of comments:

to be continued ...