使用AutoCAD的用户都有这样的感受:所使用的仿宋体汉字与小字体的数字字母写在一起时大小不协调,数字字母显得比汉字大,汉字中的一些符号位置偏低,影响美观,因而希望通过修改汉字形文件来改变这种状况。但修改汉字形文件,需要ASCII码的源形文件(.shp),通常我们只有编译后的二进制汉字形文件(.shx),没有汉字的源形文件。汉字形文件是大字体形文件,笔者经过探索,弄清了编译后的大字体形文件的结构以及几个在参考资料上不见公布的形定义特殊码含义,据此编制了将二进制大字体形文件转换为源形文件的程序,并且对得到的源形文件进行修改,编译得到了令人满意的二进制仿宋体形文件。下面就是具体的实现步骤。 )wdTs>W7
@q/E)M?
一、二进制大字体形文件的结构 l1#F1q`^t
K
Ml>~r
----二进制大字体形文件由3部分组成:文件头、索引部分和形定义部分。 Yk @/+PE
E9 6`
aF{]
----1.文件头 chs] ,7R
S:YQVj
----文件头包括大字体版本、索引项数、换码范围个数、始码1、终码1、始码2、终码2等等,例: HB:VpNFn
nd3n 'b
----“AutoCAD-86bigfont1.0”0D0A1A0800 ve&"x Nz<
C(!A% >
------------------大字体版本 nA4PY]
1wTPT,k
----CD2B----0300----A100----A300----A600----A600 (@nEe?
RIV
+ _}R
---索引项数---换码数-----始码1----终码1------始码2----终码2 O+ghw1/
@F/yc
----2.索引部分 yO*HJpc
+DwE~l
----每个索引项8个字节,包括编码、形定义字节数及形定义在形文件中的偏移位置,例: kPvR ,
/]>8V'e\
----0000----0E00----935E0100 ,C;%AS/
#C#*yE
----编码-------长度---------偏移 ?Jy/]j5fI
,We'AR3X
----3.形定义部分 @CNe)&U
zbgH}6b
----编码为0的形定义格式比较特殊,为字体名、0、字高、向下、方式、0,例: efXiZ
sp8P[W1a
----“HZ1/6/92”----00----7F----00----02----00 b2Oj 1dP1
0qp Pz|h
-------字体名---------------字高----向下----方式 p{0NKyOvU
>j6"\1E+Dz
----其他编码的形定义以1个字节00或2个字节3000开头,其后为有效形定义字节。 C.N#y`g
a%XF"*^v
二、大字体源形文件的格式 N;mJHr3[F
G:4'')T
----*BIGFONT字符数目,换码范围个数,始码1,终码1,…… 9YEE.=]T
hUP?r/B
----*0,4,字体名 3](At%ss
'izv[{!n{
----字高,向下,方式,0 7w5C
NV
U%V4@iz~\m
----*编码1,定义字节数,形名称 ln*jak RrC
sDl@
----字节1,字节2,…,0 ^`+Kjhht
GWW#\0*Bn
----…… =HHtLW.|,
-jWXE
----字节可以采用十六进制表示,高4位表示矢量长度(从1至F,即最长为15),低4位表示矢量方向(见图1),并且必须前导一个0作为十六进制表示的标记。字节也可以采用十进制表示,此时不需前导任何0,但可带负号,它们通常用于表示特殊码、位移量或比例因子。 #I}w$j
i
AOv>O52F/Q
----下面给出特殊码及它们的含义: )Nt'Z*K*
n=A}X4^
----0形定义结束 Vu5Djx'
,{Ga7rH*
----1落笔 %G/(7l[W
W4&Itj
----2抬笔 .kc{)d*0K
Oh;V%G
----3用下一字节除矢量长度 IylfMwLC
AYsiaSTRqW
----4用下一字节乘矢量长度
Fp~0 ^
'b:UafV
----5进栈 QP7N#mh
r*f:%epB%
----6出栈 OMm'm\+/
[Wn6d:
----7引用下一字节编码的形定义 4Ul*`/d
nj=nSD
----8由下两个字节给出X和Y位移量(可用圆括号括起来) *0/%R{+S
F@<^
----9后跟有多个X和Y位移量,并需要(0,0)结束 1
&-%<o
kJ"}JRA<
----10由下2个字节(半径,方向)定义一个圆,方向取值范围为010~070,高4位表示方向,低4位为0 &UIS