孔凡合,赵卫常,董军朝
(1.河北省地矿局 第十一地质大队,河北 邢台 054000;2.河北省煤田地质局 物测地质队,河北 邢台 054000)
随着计算机的普及,现在大部分的图形制作已实现了数字化。数字化的矢量图形可以在计算机上直接进行坐标量取或工程设计。这些工作充分体现了数字化图高精度的优点,但有时需要将图纸带到施工的现场,在现场量取坐标,此时就需要将图纸打印出来。而现在常用的绘图仪中打印精度最好的也只能达到±0.1%[1],对于50 cm×50 cm的图纸,就是±0.5 mm。而测量规范要求的精度为:地形图图廓线长度误差不得超过±0.2 mm[2],对于50 cm×50 cm的图即是 0.4‰。显然绘图仪的精度不能满足测量规范要求。这需要采用一种方法来提高图纸的打印精度。
对大量的绘图仪所打印图纸进行量测,得到结论:图纸在横向(垂直于图纸的前进方向)误差可以达到0.1‰,能够满足测量中规范的要求,而在纵向(走纸方向),误差较大,即使在对绘图仪多次校正的基础上最好状态也只有1‰。显然单纯从提高绘图仪的打印精度方面下功夫,不能满足图纸在测量规范中的要求,只有从其他方面入手来解决问题。通过对大量图纸的量测数据分析、比较得出:在一定的时间段(十几天或几个月)内或说打印一定量批次图纸时,按一定的图纸校正好的绘图仪,其纵向误差基本趋于一个定值,属于系统误差,可以通过一定的方法进行调整。虽然不能对绘图仪进行改变,但通过将图形文件在纵向校正可提高图纸的打印精度。即如果打印图纸在纵向上延长了 1 mm,可通过将图形文件在计算机中缩短 1 mm×比例尺分母,使打印出来的图纸符合应该打印的长度,从而使图纸满足测量规范的精度要求。反之亦然。
现在的绘图软件所绘制的图形大多能保存为一种通用的文本文件格式,即 DXF文件,DXF文件里含有图形中每个图元的详细信息。为了能对大多数格式的图形进行校正,可以开发一个程序对 DXF文件进行操作,将图形中每个图元的坐标信息进行改变,使图形在一定的方向进行拉伸或压缩来达到图形校正的目的,从而使打印出来的图形达到测量规范的要求。
要想修改DXF文件,首先要了解DXF文件的格式。DXF文件本质上由代码及关联值对组成。代码表明其后面值的类型。使用这些代码和值对,可以将DXF文件组织到由记录组成的区域中,这些记录由代码和数据项目组成。在DXF文件中,每个代码和值都各占一行。每段都以一个后跟字符串SECTION的代码0开始,其后是代码2和表示该段名称的字符串(例如,HEADER)。每段都由定义其元素的代码和值组成。每段都以一个后跟字符串 ENDSEC的代码 0结束。[3]
DXF文件完整的结构如下:
HEADER段,包含图形的基本信息,由 AutoCAD数据库版本号和一些系统变量组成,每个参数都包含一个变量名称及其关联的值。
CLASSES段,包含应用程序定义的类的信息,这些类的实例出现在数据库的 BLOCKS,ENTITIES和OBJECTS段中;类定义在类的层次结构中是固定不变的。
APPID(应用程序标识表)
BLOCK_RECORD(块参照表)
DIMSTYLE(标注样式表)
LAYER(图层表)
LTYPE(线型表)
STYLE(文字样式表)
UCS(用户坐标系表)
(2)当搅拌机将物料倒放到运料卡车上时,卡车需要前后移动,按前后中的顺序分为三堆,以减少粗集料发生离析的现象。
VIEW(视图表)
VPORT(视口配置表 )
BLOCKS段,包含构成图形中每个块参照的块定义和图形图元。
ENTITIES段,包含图形中的图形对象(图元),其中包括块参照(插入图元)。
OBJECTS段,包含图形中的非图形对象,即除图元、符号表记录以及符号表以外的所有对象都存储在此段。
THUMBNAILIM AGE段,包含图形的预览图像数据,此段为可选项。
通过DXF文件编写实现图形的校正似乎很难,但编辑DXF格式文件时可以忽略不需要的信息,而只读取需要的信息。在此要关注的是HEADER段和ENTITIES段。其中 HEADER段里包含了图形的范围。ENTITIES段里包含了图元信息(包括各种图块、线段、填充)的主要内容。要想对图形进行调整,就要对这两个段进行操作。
DXF文件中对图元信息进行描述的数值除坐标数据外都不大,一般在1000以内。测量图形中实际坐标数值都在5位数以上。为此,不必太注重考虑DXF文件中各图元信息的表示方法,而是只注重DXF文件中的数值,读取 DXF文件中的数据,然后将其转化为数值,如果其大于图形的左下角坐标的纵坐标值,则对其进行操作,否则忽略。对于一些绝对坐标值较小的图形,可先用 AutoCAD打开图形,选中所有图形,利用平移命令,将图形平移到纵坐标值大于5位数的位置,再将图形另存为 DXF文件,对图形进行校正。
打印图纸中图形的变形是系统误差,距首先打印边线的距离越远变形越大,据此对图形进行调整。假定南北向的图纸首先打印图纸的底部,即图形中x方向的最小值位置,就将图纸的左下角坐标作为基点,然后根据图形中图元坐标距图形基点的距离进行调整。图元调整数值Δx的数学模型为:
式中,x0为图形左下角的x坐标值;x为每个图元对应的x坐标值;Sx为图形在x方向的最大校正值,拉伸为正值,压缩为负值;lx为图形在x方向的长度。
假定一个50 cm×50 cm的图纸,在正常打印时缩短了 1 mm,那么,这里Sx为1 mm,lx为500 mm。
图1 程序流程图
首先将需要纠正的图形文件生成DXF文件。在这一步用图形编辑软件打开图形,将图形另存为 DXF格式即可实现。程序开发的流程如图1所示。
程序中打开图形模块的功能如图2所示的界面。包括输入需要校正图形的文件名、校正后生成的文件名、图形的左下角坐标x0、图形的长度lx及各方向的修改值Sx等。
程序中读入文件的模块要以行方式来读取数据。用行方式读入数据后,用val函数将其转化为数值类型,然后根据数值的大小,判断其是否为需要修改的坐标信息。判断的方法为:检查数值与图形左下角的纵坐标的差值,如果大于零且小于等于图长则证明为图元的坐标信息,需要对其进行修改;否则直接写入到修改后形成的文件。
程序数据修改模块:用读入的数据,根据式(1)计算与图形下边缘的距离,依比例对图元的坐标信息进行校正。修改完成后,将修改的数据写入到文件中。
程序的运行界面如图2所示。在提示窗口中输入需要校正文件的路径及文件名、校正好后生成的文件名,如果已校正文件名不输入,程序会自动根据需校正文件名,生成后面加“JZ”的文件;在相应文本框中根据提示输入图形的实际长度、宽度和图形的左下角坐标值以及左上角、右上角的纵向和横向校正值。数据输入完成后,左键单击“校正”按钮,程序即会对DXF文件进行修改,并将修改后的数据保存在校正后的文件中。此时用绘图软件打开这个修改后的DXF文件,再进行图形打印,即可使打印图形达到测量规范要求的精度。
图2 程序运行界面图
通过上述的方法,在不能改变绘图仪打印精度的情况下,利用编程修改图形的 DXF文件,对图形进行拉伸或压缩,从而提高图纸的打印精度。通过此程序不仅可使绘图仪打印的图形精度达到测量规范的要求,而且图纸矢量化时,如果在扫描图纸过程中有系统变形,在图纸矢量化完成后,也可通过此种方法对矢量化图形进行校正,从而提高图纸矢量化的精度。
[1]HP公司.HP Designjet T770和 T1200打印机系列使用说明书 [Z].[出版地、出版者不详 ],2009:175.
[2]CJJ8-99,城市测量规范 [S].
[3]谢平,蒋先刚,陈海雷,等.工程绘图及应用开发 [M].北京:北京理工大学出版社,2010:300.