可以使用特殊代码创建其他几何格式并指定特定动作。

包含三字符(矢量长度规范)的字符串中的第二个字符必须为 0,也可以指定特殊代码数字。例如,008 和 8 都是有效的特殊代码定义。

定义字节代码

代码

说明

000

形定义结束

绘图模式在绘制每个形的开始时激活。当绘图模式打开(代码 1)时,一个矢量说明将绘制一条直线;当绘图模式关闭(代码 2)时,矢量说明只移到新位置,而不绘制直线。

001

激活绘图模式(落笔)

002

取消激活绘图模式(提笔)

003

矢量长度除以下一个字节

SHAPE 命令指定的高度最初作为单个正交矢量(方向为 0、4、8 或 C)的长度。代码 3 将矢量长度除以下一个字节。代码 4 将矢量长度乘以下一个字节。代码 3 和 4 后跟一个定义字节,该字节包含一个整数缩放比例(1 到 255)。

如果要用形高度来指定整个形的尺寸,并要用矢量长度 10 绘制,则可用 3,10 缩放高度定义。缩放比例在同一形中是累计的,即,乘以 2 后再乘以 6,结果缩放比例为 12。通常用户需要在形的结尾恢复原缩放比例,尤其是对子形和字体形。程序不会为用户重置比例因子。

004

矢量长度乘以下一个字节

005

将当前位置入栈

可以弹出所压入的任何值。位置堆栈只能保存四个位置值。如果由于过多的压入操作或弹出丢失而造成堆栈溢出,则在绘制形时将显示如下消息:

位置堆栈上溢,位于形 nnn

与此类似,如果试图从堆栈中弹出过多的位置值,则在绘制形时将显示如下消息:

位置堆栈下溢,位于形 nnn

006

将当前位置出栈

007

绘制编号由下一个字节指定的子形

对于非 Unicode 字体,代码 7 后面的定义字节是 1 到 255 之间的形数字编号。对于 Unicode 字体,代码 7 后面的定义字节是 1 到 65535 之间的形数字编号。应当将 Unicode 形编号计作两个字节。

此编号的形(在同一形文件中)在此时绘制。绘图模式不会为新形重置。当子形绘制结束后,继续绘制当前形。

008

由下两个字节指定的 X-Y 位移

法向矢量定义字节只能在十六个预定义的方向上绘制,并且最大长度为 15。这些限制使形定义更为有效,但有时会变得过于局限。代码 8 指定由下两个字节指定的 X-Y 位移。代码 8 后必须跟两个定义字节:

8,X-displacement,Y-displacement

X-Y 位移的范围为从 -128 到 +127。前面的 + 可选,并且可用括号增强可读性。下例中的矢量向左绘制(或移动)10 个单位,再向上绘制(或移动)3 个单位。

8,(-10,3)

在两个位移定义字节之后,形返回法向矢量模式。

用代码 9 可绘制一系列非标准矢量。代码 9 可以指定任意数量的 X-Y 位移对。由 (0,0) 对终止。下例绘制三个非标准矢量后返回法向矢量模式。

9,(3,1),(3,2),(2,-3),(0,0)

必须用 (0,0) 对作为 X-Y 位移对序列的结尾,以便程序识别后面的法向矢量或特殊代码。

009

乘以 X-Y 位移,以 (0,0) 结尾

00A

由下两个字节定义的八分圆弧

此圆弧称为八分圆弧,因为它跨越一个或多个 45 度的八分圆,起点和端点都在八分圆边界上。八分圆从时钟的 3 点的位置逆时针编号,如下图所示:

圆弧定义为:

10,radius,(-)0SC

半径可以是 1 到 255 之间的任意值。第二个定义字节指定圆弧的方向(如果为正,则为逆时针;如果为负,则为顺时针)、开始八分圆(s,值为 0 到 7)和跨越的八分圆数(c,值为 0 到 7。其中 0 等于八个八分圆或整个圆)。可用括号增强可读性。例如,考虑如下形定义片段:

...012,10,(1,-032),01E,...

此代码依次分别绘制:向右上的一个单位矢量、从八分圆 3 开始的顺时针圆弧(半径为一个单位,跨越两个八分圆)和向右下的一个单位矢量,如下图所示:

00B

由下两个字节定义的部分圆弧

其定义使用五个定义字节:

11,start_offset,end_offset,high_radius,radius,(-)0SC

start_offsetend_offset 表示与圆弧起点和端点所在的八分圆边界的距离。high_radius 表示半径的高八位有效数字,当 radius 不大于 255 时其值为 0。将 high_radius 值与 256 相乘并加上 radius 值,可生成大于 255 的圆弧半径。radius 和最后的定义字节与八分圆弧的定义(代码 00A,如前所述)一样。

确定起始偏移的方法是先计算起始八分圆的边界(45 度的倍数)与圆弧起点之间所差的度数,然后用这个差值乘以 256 再除以 45。如果圆弧从八分圆边界开始,则其 start offset 为 0。

end offset 的计算方式是相似的,但必须用最后一个八分圆边界与圆弧端点之间所差的度数进行计算。如果圆弧在八分圆边界终止,则其 end offset 为 0。

例如,从 55 度到 95 度,半径为 3 个单位的特殊圆弧编码如下:

11,(56,28,0,3,012)

解释如下:

start_offset     = 56 because ((55 - 45) * 256 / 45) = 56 
end_offset       = 28 because ((95 - 90) * 256 / 45) = 28
high_radius      = 0  because (radius < 255) 
radius           = 3 
starting octant  = 1  because arc starts in the 45 degree octant
ending octant    = 2  because arc ends in the 90 degree octant

00C

X-Y 位移和凸度定义的圆弧

它们与代码 8 和 9 相似,在代码 8 和 9 中通过指定 X-Y 位移来绘制圆弧。而在代码 00C 和 00D 中通过将凸度因子应用到位移矢量来绘制圆弧。代码 00C 绘制一段圆弧,而代码 00D 绘制多段圆弧段 (polyarcs),直到该圆弧被 (0,0) 位移终止为止。

代码 00C 后必须跟上三个描述圆弧的字节:

0C,X-displacement,Y-displacement,Bulge

XY 位移和凸度(用于指定圆弧的曲率)的取值范围均为 -127 到 +127。如果位移指定的直线段长度为 D,垂直于该线段中点的距离为 H,则凸度的幅值为 ((2 * H / D) * 127)。如果圆弧从当前位置到新位置是顺时针走向的,则符号为负。

半圆的凸度为 127(或 -127),是用这些代码所能表示的最大的单段圆弧(用两个连续的圆弧段表示更大的圆弧)。凸度定义可以为 0,表示直线段。但是,用代码 8 表示直线段在形说明中只占一个字节。

多段圆弧代码(00D 或 13)后面可跟 0 或多个圆弧段定义,最后被 (0,0) 位移终止。请注意,最后一个位移之后不能再指定凸度。例如,字母 S 可以如下定义:

13,(0,5,127),(0,5,-127),(0,0)

零凸度线段用于在多段圆弧中表示直线段,它们相当有用。与终止多段圆弧、插入直线段后再开始另一多段圆弧这种方法相比,其效率要高得多。

在圆弧段和多段圆弧定义中不能使用数字 -128。

00D

乘指定凸度的圆弧

00E

只有当文字是垂直的,才会处理下一个命令

在字符定义中遇到此特殊代码时,下一代码是否进行处理由该字符的方向决定。如果方向为垂直的,则下一代码被处理;如果方向为水平的,则下一代码被忽略。

在水平文字中,每个字符的起点是基线的左端;在垂直文字中,起点为字符上方正中。在每个字符的结尾,通常需要用提笔线段绘至下个字符的起点。对水平文字,该线段是向右绘制的;而对垂直文字,该线段是向下绘制的。特殊代码 00E (14) 主要用于调整不同的起点和端点,使同一字符形定义可用于水平文字,也可用于垂直文字。例如,如下对大写 D 的定义可用于水平文字,也可用于垂直文字。

*68,22,ucd 
2,14,8,(-2, 6),1,030,012,044,016,038,2,010,1,06C,2,050,
14,8,(-4,-3),0
,