使用AutoCAD的用户都有这样的感受:所使用的仿宋体汉字与小字体的数字字母写在一起时大小不协调,数字字母显得比汉字大,汉字中的一些符号位置偏低,影响美观,因而希望通过修改汉字形文件来改变这种状况。但修改汉字形文件,需要ASCII码的源形文件(.shp),通常我们只有编译后的二进制汉字形文件(.shx),没有汉字的源形文件。汉字形文件是大字体形文件,笔者经过探索,弄清了编译后的大字体形文件的结构以及几个在参考资料上不见公布的形定义特殊码含义,据此编制了将二进制大字体形文件转换为源形文件的程序,并且对得到的源形文件进行修改,编译得到了令人满意的二进制仿宋体形文件。下面就是具体的实现步骤。 ]*D=^kA0[
n~@;[=o?5
一、二进制大字体形文件的结构 t[Qf|#g
j!F5gP-l
----二进制大字体形文件由3部分组成:文件头、索引部分和形定义部分。 +7.\>Ucq`
lmfvT}$B
----1.文件头 Et}S*!IS
M2l0x @|
----文件头包括大字体版本、索引项数、换码范围个数、始码1、终码1、始码2、终码2等等,例: Q9Sh2qF^2
VG_ PBG(
----“AutoCAD-86bigfont1.0”0D0A1A0800 uD4on}
*2P%731n5
------------------大字体版本 hxZ5EKBy
qs6r9?KP
----CD2B----0300----A100----A300----A600----A600 Cjc>0)f&.
*c3(,Bmw
---索引项数---换码数-----始码1----终码1------始码2----终码2 6j/g/!9c!
=^\yE"a
----2.索引部分 m&a.i
B
9J+p.N
----每个索引项8个字节,包括编码、形定义字节数及形定义在形文件中的偏移位置,例: zk#"n&u0
d| ;S4m`
----0000----0E00----935E0100 /H3z~PBa
Pqu]?X
----编码-------长度---------偏移 $KHw=<:)/
mE\sD<b
----3.形定义部分 6?i]oy^X]p
nvY%{Zf$}
----编码为0的形定义格式比较特殊,为字体名、0、字高、向下、方式、0,例: D~P3~^
Xt}
4B#
----“HZ1/6/92”----00----7F----00----02----00 3CcCcZ9I
Gj!9#on$7R
-------字体名---------------字高----向下----方式 ,a
2(h
+Np[m$Z*
----其他编码的形定义以1个字节00或2个字节3000开头,其后为有效形定义字节。 ",O |uL
oN({X/P2j
二、大字体源形文件的格式 v]{F.N
VW&EdrR,S
----*BIGFONT字符数目,换码范围个数,始码1,终码1,…… 6Ft?9
B(F:
}$%j} F{
----*0,4,字体名 M$YU_RPl+
Ec'Hlsgh&T
----字高,向下,方式,0 n#$sLXVy
h@AKfE!\~
----*编码1,定义字节数,形名称 ;YN`E
zbY2gq@?
----字节1,字节2,…,0 3V uoDmG
w}|XSJ!
----…… -d>2&)5
vbBNXy/
----字节可以采用十六进制表示,高4位表示矢量长度(从1至F,即最长为15),低4位表示矢量方向(见图1),并且必须前导一个0作为十六进制表示的标记。字节也可以采用十进制表示,此时不需前导任何0,但可带负号,它们通常用于表示特殊码、位移量或比例因子。 X<8?>#
WoV"&9y
----下面给出特殊码及它们的含义: r+:]lO
"%peYNZ&%
----0形定义结束 5}C.^ J`
e'I/}J
----1落笔 WwUhwY1o!L
0Wkk$0h9
----2抬笔 6C'W
|qs8(
5z0
----3用下一字节除矢量长度 kI?+\k\V`
/ <C{$Gu
----4用下一字节乘矢量长度 I4XnJ[N%
/O[<"Wcz
----5进栈 Yyx sj9
z`}z7e'>
----6出栈 $-=xG&fSz
!),eEy
----7引用下一字节编码的形定义 #Mw 6>5}<
yopC
<k
----8由下两个字节给出X和Y位移量(可用圆括号括起来) jFDVd;#CS
vmzc0J+3p
----9后跟有多个X和Y位移量,并需要(0,0)结束 %<)!]8}P*
l*>,K2F
----10由下2个字节(半径,方向)定义一个圆,方向取值范围为010~070,高4位表示方向,低4位为0 *"nN To
CZ33|w
----11用下5个字节(字节1,字节2,字节3,半径,字节5)定义一个圆弧,字节1影响起始角,字节2影响终止角,字节3影响半径,字节5高4位表示方向,低4位决定弧度角 ]z#+3DaH
CM%Rz-c
----12由下3个字节(X位移,Y位移,凸度)定义一个圆弧 'Z*`~,Q
38GkV.e}$
----13定义多段圆弧,并需用(0,0)结束 QArph0e
WKAG)4
----14使后面的一个特殊码不起作用 ["fUSQ
^GpLl
三、编制转换程序的步骤 DFkDlx
,<=gPs;x
----1.读索引项数、换码范围个数及换码。 |*/-~5"
skm~~JM^
----2.将长度不为0的索引项全部读入内存,读入内存的项数即为字符数目。 3D-0
N0o
Q7.jSL6
----3.写源形文件的第一行。 $Ge0<6/
"XQ3mi`y
----4.将读入内存的索引项按编码从小到大顺序排序。因排序时间较长,因此排序每完成一步在屏幕上显示计数,以表示排序正在进行。 iE EP~
a<0q%Ax
----5.处理编码为0的形定义。