制作 AUTOCAD汉字字体文件
电子计算中心李正海
    摘要:介绍 AUTOCAD字体文件的编写方法,编译型字体文件 HZTXT.SHX的结
构和用图形转换生成字体文件的方法。
    关键词:字体文件  形状参数  中文符号
    AUTOCAD绘图软件包用字体文件存储文字的形状参数,实现文字的显示和输出。
字体文件有两种:一种是SHP为扩展名的ASCII码文件,这种文件可用任一种字处理
软件建立;另一种是扩展名为SHX的二进制文件,这种文件是在AUTOCAD环境下,用
COMPILE命令编译SHP文件生成的,其结构比较紧凑,但只使用于AUTOCAD绘图软件包。
    我厂科研所、技术处等单位利用 AUTOCAD绘图软件包进行了大量的计算机绘图
工作。由于 AUTOCAD软件本身不能标注汉字,因此我厂从唐山机车车辆工厂引进了一
套汉字标注系统,但是因为该系统的文字字形很不美观,所以绘图人员强烈要求将该系统
的汉字字体文件更换掉。后来我厂使用一套汉字字体文件的文字宇形比较美观。但是由于
这一套汉字字体文件中不含有中文符号,因此产生了一些新的问题:
    1.因为汉字符号无法显示、处理,因此现有的汉字文本文件不能直接调入到图形中。
    2.由于原汉宇字体文件含有中文符号,以前的图形中存在有大量的中文符号,这些图
形著采用新的汉字字体文件,那么图形中的中文符号都变成了问号。
    3.文字输入时必须使用西文标点,不符合通常的文字输入习惯。
    4.由于中文符号不能由西文符号完全代替,因此有些中文符号必须用另外的一些绘
图命令绘出,操作繁琐,十分不方便。
由于两套汉字字体文件均是扩展名为 SHX的编译型二进制文件,没有 ASCII码
文件,因此笔者根据字体文件的编写方法,分析了 HZTXT.SHX文件的结构,从
提取出汉字的形状参数,利用 AUTOCAO的图形转换生成中文符号的形状参数,
两组数据合并,加上字体的一些整体定义,进入 AUTOCAD后用 COMPILE命令
成出新的完整的汉字字体文件,从而解决了上述的一些问题。制作汉字字体文件的
见图l。
    一、字体文件的编写方法
    为了方便说明,首先介绍 AUTOCAD字体文件的编写方法。
    AUTOCAD用字体文件存贮文宇的形状参数。每个文字都有一个代码,代码有两种:
一种是单字节代码,一种是双字节代码。单字节代码的字体文件称一般字体文件,可以记
录255个符号l双字节代码的字体文件称特殊字体文件,俗称大字体文件,可以记录65525
个符号。中文这类数量巨大的符号,必须用大字体文件记录。
    大字体文件的第一行必须是: * BIGFONT  nchars,nran8es,bl,e1,b2,e2,……
    nchars是文件中字符数目的近似数目,一般要求误差在10%以内,否则文字的查、
显示、处理的速度将大大降低;nranges表示代码有多少个连续区,这些连续区的范围由
bI、e1入2、e2确定,其中 bI、e1为连续区的起始码,b2、e2为连续区的结束码。当 AUTOCAD
系统读到一个代码,其数值在连续区内时,就到大字体文件中读取一个文宇的形状,否则
就到一般字体文件中读取文字的形状。
    在一般字体文件和大字体文件中都必须包含一个编号为0的形状,它描述了文字的一
些自身信息。格式为:
    * 0,4,字体名
    above(上),below(下),mode(方式),O
    above规定了大写字母超出基线向量长度的大小,below规定了文宇在基线下面的向
量长度的大小,这两个值规定了文字的比例因子。当文字为水平方向的通常字体时,mode
为零,当文字为水平或垂直的双向字体时,mode为2;只有当 mode为2时,专用的00E(14)
命令码才起作用。
    文件的以下部分即为文字的形状参数,每个文字的形状参数包括一个标题行: *
Shapenumber,definehytes,shapena2ne
    Bhapenumber为文字的代码,definebytes为描述该文字的形状宇节数,shapenalne为
该文字的名字。若该名字为小写字母,则系统在编译该文字宇体时将其名字忽略。
    标题行之下即为文字的形状描述宇节。一般每个宇节包括矢量的长度和方向代码,高
4位为矢量的长度,低4位为矢量的方向。矢量的单位长度和矢量的方向代码如图2。
  除了绘制矢量外,还有几个专用码,他们的半字节高都为零。它们是:
000一形状定义结束  0O8—由下两个宇节给出 X—Y位移量
001一落笔  009一由(0,0)结束的多个 X—Y位移量字体免费的软件
002一抢笔  00A一由下两个字节定义的八分圆弧
0o3一用下一字节乘矢量长度  oOB一由下五个字节定义的小段
oo4一用下一字节除矢量长度  00C一靠 X—Y位移量和凸度定义的弧
005一将当前集团压人堆栈  00D一多个指定凸度的圆弧
006一从堆栈弹出当前位置  00E一在竖直文本字体时处理以下的字节
007一绘制下一字节给出的子形状编号
二、提取汉字形状参数、构造字体文件
    笔者利用工具软件 PCTOOLS分析得出了 HZTXT. SHX文件的结构。AUTOCAD
的 SHX文件由四个部分组成,即版中域、参数域、索引域和形状描述域。
    版本域记录了该文件生成和使用的 AUTOCAD的版本以及文件的类型。在
HZTXT. SHX文件中,版本域占十七个字节,其内容为:“AutoCAD一86bigfont1.0”。
    参数域记录了索引域每项的字节数、文件中文字的总数目、连续区数和文字的编码区
间的上下限。HZTXT. SHXA文件中,参数域占十个宇节,上述的五个参数各占两个字节。
    形状描述域记录了各个文字的名称和形状的描述参数,每个文字的形状描述参数在
文件的位置与长度根据索引域的定义。
    笔者编写了一个程序,从 HZTXT. SHX文件中提取汉字的形状参数,构造出汉字的
字体文件 HZTXT.SHP。程序的编制原理是利用循环语句,根据文字的代码,逐区逐位地
在文件的索引域中寻匹配的索引项,得到文字形状参数的宇节数及其在文件中的位置,
据此从文件中读取一定数目的字符,加上文字形状的比例因子和一些必要的控制参数,计
算出形状参数的字节数,写入到字体文件中,从而形成汉字的形状参数。
    三、利用中文符号图形,转换生成字体文件
    通常编写字体文件时,首先要精确地绘出图形,再根据图形进行矢量的编码。由于一
个图形符号往往有几十条矢量,加上抬笔、落笔等专用码,可能就有数十个甚至上百个数
据,用这钟方法编写字体文件显然工作量巨大,操作繁琐。因此,笔者利用AUTOCAD软
件首先绘制出符号的图形,然后用 AUTOLISP语言程序提取出图形的矢量信息,再用 C
语言程序把这些矢量信息处理生成出需要的字体文件。这样操作直观明了,管理方便,大
大提高了编写字体文件的效率。除了限于制作文字的字体文件外,还可应用于制作电器符号
、液压符号等数量很大的图形符号库。制作的过程可分为以下三步。
    1.绘制中文符号图形
    利阉人AUTOCAD软件的 LINE画线命令。绘制出 GR2312—8O前三区共282个中文
符号的图形,每个符号都在一个128x128的区域内,按区码从下向上排列,按位码从左向
右排列。
    2.提取图形矢量信息
    符号图形矢量信息的提取原理是:利用循环语句,逐个窗口显示中文符号的图形,选
择窗口中的所有图形,构造出一个实体集,计算出实体集中实体的数目,从实体集逐个地
取出实体,构造出一个关联表,从关联表中提取出实体的类型,判断其是否是直线实体,若
是直线则再从关联表中提取出直线的起始点、终止点坐标,转换成以该图形左下角点为原
点的局部坐标系下的坐标,再把坐标值圆整转换成宇符串,输出到 LINE. DAT文件中。
LINE. DAT文件中一行数据记录一条线段,每个符号的数据之间用一个空行分隔。
    3.转换生成字体文件
    转换生成字体文件的原理是根据 LINE. DAT文件的格式,读取图形的矢量信息加
以处理,生成出字体文件。
    具体而言,程序执行时顺序地读人矢量,若是起始的矢量信息,则写入形状的比例因
子;若已写入了落笔的专用码,又写入一条矢量后,读到的下一条矢量的起始点与上一条
矢量的终止点相同,则直接把当前的位置点移到矢量的终止点,不同则先写入抬笔的专用
码,把当前位置点移动到矢量的起始点,再写入落笔的专用码,然后把当前位置点移动到
矢量的终止点。如此往复,直到读到一个空行,即一个符号的矢量信息结束,写入还原形状
比例因子的专用码,写入符号间位置偏移和符号结束码,统计出形状参数的总字节数。
    因为文件流的逆向读取和形状字节总数的统计比较困难,因此笔者把程序分为两段:
第一段是生成符号的形状描述字节和形状参数的总字节数,把它们分别存储在 HZ,ZK1.SHP、
HZZK2.SHP文件中;第二段是利用循环,从中文符号的第1区到第3区、从第l
位到94位,计算出符号的代码,从 HZZK2. SHP文件中读出形状参数的总字节数,从 HZZK1.SHP
文件中读出符号的形状描述字节,合成出中文符号的字体文件 HZZK3. SHP。
    下表为"一"," V"两个符号在 LINE. DAT文件、HZZK1. SHP文件、HZZK26SHP文
件中的部分:
  四、生成完整的编译型的汉字字体文件
    当 HZZK3. SHP文件和 HZZK0, SHP文件都生成好后,将它们合并,根据大字体文
件的格式规定,加上大字体文件的定义、总文字数目、连参数区数、区间范围,即大字体文
件的第一行。由于在制作文字的形状参数时已调整过文字形状的比例因子,而文字一般都
是水平方向的,所以文宇自身定义信息定义都定为零。一般为了重复 TEXT命令,在第一
行下放后续行.还需要定义一个换行(I,F)。以确定两行文字间的距离。这佯就形成了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。