为叙述方便先定义几个与文字有关的术语,在BASESUPPER DATA(带上标的文字)、BASES UB DATA(带下标的文字)、BASESUPPERSUB DATA(带上下标的文字)的例子中,BASE和DATA称为基本文字,其中BASE又称前导(基本)文字、DATA又称后续(基本)文字,SUPPER称为上标文字, SUB称为下标文字,文字上下标在这里包括文字的上标(Superscript)、下标(Subscript)和上下标。
在AutoCAD中,文字是具有相同高度、高宽比(宽度)、旋转角度、倾斜角度、线型、颜色和字体等属性的字符串,由1个及多个字符组成。由于上下标文字与基本文字高度不同,按此定义,AutoCAD文字显然不能带上下标,因此给使用者带来了很多麻烦。在实际使用中,前导文字、上标文字、下标文字和后续文字必须分多次来写,虽然这样可以应付使用,但是有很多不便:
(1)由于要分次来写所以比较烦琐;
(2)由于基本文字与上下标文字分属不同的实体所以修改起来也比较烦琐;
(3)由于精确定位困难所以图中文字的上下标很难完全一致。
扩充TEXT命令
在AutoCAD各版本中,TEXT命令用于在图中写文字(字符串),只能直接写出基本文字,而不能直接写出带上下标的文字。能否用TEXT命令,在不对AutooCAD程序作任何修改的情况下,扩充TEXT命令的功能,使其也能直接写出带上下标的文字呢?本文得出的结论是肯定的。
要扩允TEXT命令,必须先弄清楚此命令写文字的处理过程:
(1)确定文字(西文字符、汉字)的各种属性;
(2)置"文字解释器"(Translater for text)初值;
(3)读入一行文字;
(4)对此行文字中的每个文字(西方字符为单个字符、汉字为两个字符)按其先后顺序逐个进行以下操作;
(5)落笔(置写方式);
(6)从形文件(西文字符从普通形文件、汉字从多字形文件)中取出对应数据;
(7)文字解释器将取出的数据按其数据定义边解释边写入图中。
要扩充TEXT命令,且又不修改AutoCAD程序,那么只能从此命令所使用的数据上作文章,由以上给出的处理过程可知:TEXT命令所使用的主要数据为形文件(西方字库、汉字字库),即从形文件上作文章。为此,必须要了解形文件,不仅要了解文件格式,更重要的是要了解其中数据的定义。
形文件由形及索引组成,形由形定义命令和向量数据组成,AutoCAD中共有两种形文件:一种是普通形文件(Shape),用单字节作索引(用单个字节作为取出数据的索引),用于建立西方字库,最多可拥有256个形;另一种为多字形文件,(big fo nt)其含义为可容纳许多文字的形文件,用双字节作索引,用于建立汉字字库,最多可拥有256×256=65536个形。虽然这两种文件格式稍有不同,但其形定义完全一样,本篇统称形文件。
从形定义命令表可以看出,1与2、3与4、5与6是三组互为逆操作的命令,分别用于落笔与抬笔控制、向量数据的缩小与放大、当前位置的保存与恢复。
在文字解释器中,用到两个重要的变量:一个是"比例因子",为正实型数,其初数与形文件中的特殊形有关,用于向量数据的比例,其值可由形定义命令3与4加单字节整数(1~255)数据来改变,通过3与4的组合可以为比例因子设置不同的值;另一个是"当前位置",其初值为使用者输入的文字的参考点,其值在写文字过程中随着形定义的变化而随时被改变,其值还可由抬笔加位移来人为地改变,每个文字的起点都由此变量给出,命令5与6可把此变量进栈与出栈,用于此变量的保存与恢复。值得注意的问题是在一个形中3与4、5与6都不一定要成对使用,这是解决问题的关键所在。
现以写同时带上标和下标的文字为例,设上标和下标的文字高度均为基本文字的1/2倍,使用上述3组形定义命令,说明TEXT命令直接写出带上下标文字的方法。以下是TEX T命令中文字解释器的
工作过程:
(1)在A点落笔(使用形定义命令1),开始写前导文字,当前位置为A点,比例因子为文字高度/基线上方向量长度;
(2)写完前导文字BASE后,当前位置为B点;
(3)B点位置进栈(命令5);
(4)进行写上标文字前的位置调整,将写上标文字的起点(当前位置)调整到D点,在B点笔(命令2)、位移到C点(数据OA4)、再位移到D点(数据(010) ;
(5)调整上标文字的高度,将比例因子除2(命令3、数据2),使其高度缩小2倍;
(6)在D点落笔(命令1)后,开始写上标文字SUPPER,写完后当前位置为E点;
(7)B点位置出栈(命令6),回到B点并使其成为当前位置;
(8)进行写下标文字前的位置调整,将写下标文字的起点(当前位置)调整到G点,在B点笔(命令2)、位移到F点(数据04C)、再位移到G点(数据0 20);
(9)在G点落笔(命令1)后,开始写下标文字SUB,写完后当前位置为H点;
(10)恢复后续文字的高度,将比例因子乘2(命令4、数据2),使其高度放大2倍,恢复到基本文字的原有高度;
(11)进行写后续文字前的位置调整,将后续文字的起点(当前位置)调整到J点,在H点抬笔(命令2)、位移到I点(数据010)、再位移到J点(数据024);
(12)在J点落笔(命令1)后,开始写后续文字DATA,写完后当前位置为K点;
(13)到K点整个写文字过程结束。对写带上标或带上下标的文字。
从以上的过程可以看出:不修改AutoCAD程序,只利用AutoCAD现有的功能,已有可能使TE XT命令直接写出带上下标的文字。
分隔文字
在包含前导文字、上标文字、下标文字和后续文字的带上下标文字中,显然必须只要用3个特殊文字来分隔它们,称为分隔文字,取名为"上下标开始"、"上下标隔"和"上下标结束"。在包含前导文字、下标文字和后续文字的带上标文字中,要用两个分隔文字"上标开始"和"上标结束"。在包含前导文字、下标文字和后续文字的带下标文字中,同样也要用两个分隔言文字"下标开始"和"下标结束"。
对带上下标的文字,在前导文字和上标文字之间有分隔文字"上下标开始,这之间要进行上标文字位置和高度的调整;在上标文字和下标文字之间有"上下标分割",这之间要进行下标文字位置的调整;在下标文字和后续文字之间有"上下标结束",这之间要进行后续文字位置和高度的调整。如果这3个分隔文字能完成这些指定功能,那么TEXT命令就能直接写出带上下标的文字。
在带上下标、上标和下标的文字中,并要用到7个分隔文字。如果单个字符表示只能将其插Z入西文字库,而西文字库中的字符有些输入不方便、有些常用不可替代、有些与汉字冲突,可供使用的字符不多,用单个字符表示不方便。如果两个字符表示可将其插入汉字字库,考虑到输入的方便性和直观性,这7个分隔文字用下划线加括号组成,分别为:"_{"(上下标开始)、"_|"(上下标分隔)和"_}"(上下标结束)、"_("(上下标开始)和"_)"(上标结束)、"_["(下标开始)和"_"(下标结束)。
实质上,分隔文字可以看作是特殊的形。在带上下标文字中用到的3个形(分隔文字),定义如下。"上下标开始"为:(1)2(抬笔);(2)5(B点位置进栈);(3)0A4(从B点位移到C点);(4)0 10 (再位移到D点)(5)3及2(向量数据缩小2倍);(6)0(定义结束)。"上下标分隔"为:(1)2(抬笔);(2)6(B点位置出栈);(3)04C(从B点位移到F点);(4)020(再位移到G点);(5)0(定义结束) 。此时,由于向量数据已被缩小2倍;实际长度仅有原来的1/2,故F点到G点的位移020与C点到D点的位移010相同,这样才能保证上标和下标的起点在一条垂线上。"上下标结束"为:
(1)2(抬笔);
(2)3及2(向量数据放大2倍);
(3)5(B点位置进栈);
(4)010(从H点位移到I点);
(5)024( 再位移到J点);
(6)0(定义结束)。在写带上标和带下标文字中用到的另外4个形。
上述用作分隔文字的7个形有了明确的定义。因此只要将这7个形插入到多字形文件(汉字字库)中,就能用TEXT命令直接写出带上下标的文字。形文件有严格、固定、不可阅读的格式,形并不能直接插入,因此只有将这7个形插入到形文件的源文件(SHP文件)中,并对源文件的第一行作相应修改,重新编译后才可使用。表2给出的数据是相对于12(基线上方向量长度)而言的,如果在你的多字形文件中此值不是12,如果你对上下标的位置和高度不满意,可对数据适当修改。使用时,要写同时带上标和下标的文字,只要输入一行文字:BASE_{SUPPER_|SU _}DATA;要写带上标的文字,输入:BASE_(SUPPER_)DATA;要写带下标的文字,入:BASE_ [SUB_]DATA