基于DWG文件的图形转换方法与程序实现
2012-06-29谭清华张明
谭清华,张明
(南宁市勘测院,广西南宁 530000)
1 引言
我国于上世纪50年代和80年代,分别建立了1954年北京坐标系和1980西安坐标系,为国民经济建设和社会发展提供了基础的测绘保障。随着社会进步,经济建设、国防建设、科学研究等对国家大地坐标系提出了新的要求,迫切需要采用原点位于地球质量中心的坐标系统(以下简称地心坐标系)作为国家大地坐标系。国务院批准自2008年7月1日启用我国的地心坐标系—2000国家大地坐标系,英文名称为China Geodetic Coordinate System 2000,英文缩写为CGCS2000。
为了及时采用CGCS2000,各城市首要任务是建立一个与CGCS2000相联系的、相对独立和统一的、适宜本地区建设需要的城市或地方坐标系。为此,需要完成的工作之一是完成现有测绘成果的更新改造,保证过渡期内现有成果及CGCS2000成果的共存共用,为CGCS2000正式启用奠定基础。
我国的测绘成果多以CAD的DWG格式或DXF格式存储,其中DWG格式是二进制文件,而DXF文件是文本文件,因此DWG文件占用的存储空间较小,程序启动的速度较快,绝大部分成果采用DWG文件存储,而且DWG与DXF之间可以互相转换,因此本文主要讨论在CAD环境下DWG文件的坐标转换。
2 AutoCAD二次开发环境介绍
由于AutoCAD并没带有坐标转换模块,因此要实现相应的功能,必须进行二次开发,AutoCAD提供的开发工具主要有 Visual AutoLISP、ObjectARX和 VBA、.NET API。本文采用的是 ObjectARX。ObjectARX是一个以C++语言为基础的面向对象的开发环境和应用程序接口,ObjectARX并不是独立的开发平台,而是运行于Visual C++平台之上。ObjectARX程序本质上是Windows动态链接库(DLL)。
ObjectARX作为Visual C++动态链接库与其他的动态链接库有着很大的区别,ObjectARX程序在C++语言的基础上规定了自己的语法,它是专门用来对AutoCAD进行二次开发的工具。因此可以说ObjectARX是Visual C++的一个子集。
3 坐标转换的实现方法
为了充分利用已有测绘成果,必须将已有测绘成果转换到CGCS2000坐标系,因此不同坐标系之间相互转换是CGCS2000正式启用后必须解决的技术问题。通常情况下,大范围高精度坐标转换任务采用空间七参数法来实现,而小范围高斯平面坐标的转换采用平面四参数法来实现。由于数字地形图数据均采用分幅存储,即每一幅图的范围有限,因此本文采用四参数法实现图形的坐标转换,坐标转换程序流程图如图1所示。
图1 坐标转换程序流程图
4 DWG文件及地形图中常用对象的坐标转换程序实现方法
(1)点
对图形中点对象的转换只需对坐标值进行转换,其对应的ObjectARX类为AcDbPoint。通过该类的Position()函数可以获取该点的坐标信息,然后根据第二节所述的方法得到转换之后的坐标。调用setPosition()函数设定转换之后的坐标即可。
(2)直线
直线对应的ObjectARX类为AcDbLine,直线由起点与终点连接而成,可以通过该类的startPoint()与endPoint()函数分别获取起点和终点的坐标。之后根据第二节所述的方法得到转换之后的坐标。然后分别调用该类的setStartPoint()与setEndPoint()函数设定坐标即可。
(3)多段线
多段线对应的ObjectARX类为AcDbPolyline。多段线可以通过调用该类的numVerts()函数获取总点数,然后通过调用该类的getPointAt()函数获取每个顶点的坐标。然后根据第二节所述的方法得到转换之后的坐标。通过调用该类的setPointAt()函数设置转换之后的坐标。
(4)二维多段线
二维多段线对应的 ObjectARX类为AcDb2dPolyline。通过调用该类的vertexIterator()函数获取遍历该类顶点的指针。该指针对应的类为AcD-bObjectIterator,以该指针为参数调用二维多段线的openVertex函数,可以获取该指针对应的顶点。该顶点对应的类为AcDb2dVertex。,利用该顶点的position()函数,则可以获取该顶点的坐标。然后根据第二节所述的方法得到转换之后的坐标。调用该顶点的set-Position()函数,则完成了该顶点的转换。继续如此程序遍历整条二维多段线即可以完成坐标转换。
(5)三维多段线
三维多段线对应的 ObjectARX类为AcDb3dPolyline。三维多段线的坐标转换方法与二维多段线类似,只是遍历过程中的顶点对应的类变为AcDb3dPolylineVertex,其他与(4)所述二维多段线坐标转换程序相同。
(6)圆弧
圆弧对应的ObjectARX类为AcDbArc。调用该类的center()获取该类的中心点坐标。,然后根据第二节所述的方法得到转换之后的中心点坐标。调用该类的setCenter()函数即可以设置转换之后的坐标。可以调用startAngle()与endAngle()函数获取起始和终止角度,然后加上根据第二节所述的方法得到转换之后旋转的角度。调用setStartAngle()与setEndAngle()设置转换之后的角度。由于坐标转换通常尺度变化很小,因此对圆弧的半径无需改变,至此即完成了圆弧的坐标转换。
(7)形
形所对应的ObjectARX类为AcDbShape,可以通过调用该类的position()函数获取该类的坐标信息。然后根据第二节所述的方法得到转换之后的坐标。调用该类的setPosition()函数实现坐标转换。由于地形图中形的指向始终指北,因此无需设置角度变化。
(8)圆
圆所对应的ObjectARX类为AcDbCircle。调用该类的center()获取该类的中心点坐标,然后根据第二节所述的方法得到转换之后的坐标。调用该类的set-Center()函数即可以设置转换之后的中心点坐标。由于坐标转换通常尺度变化很小,因此对圆的半径无需改变。至此即完成了圆的坐标转换。
(9)椭圆
椭圆所对应的ObjectARX类为AcDbEllipse。椭圆与圆弧的转换程序类似。
(10)实线
实线对应的ObjectARX类为AcDbSolid。实线有4个顶点,只需通过getPointAt()函数获取每一个顶点坐标,然后通过程序获取转换之后的坐标。再利用set-PointAt()函数设置相应的坐标即可。
(11)单行文字
单行文字对应的ObjectARX类为AcDbText,可以通过调用该类的position()函数获取文字的坐标信息,然后根据第二节所述的方法得到转换之后的坐标。调用setPosition()函数设置转换之后的坐标。至此完成坐标转换。
(12)多行文字
多行文字对应的ObjectARX类为AcDbMText,可以通过调用该类的location()函数获取文字的坐标信息,然后根据第二节所述的方法得到转换之后的坐标。调用setLocation()函数设置转换之后的坐标。至此完成坐标转换。
(13)引线
多段线对应的ObjectARX类为AcDbLeader。多段线可以通过调用该类的numVertices()函数获取总点数。调用该类的vertexAt()函数获取每个顶点的坐标,然后根据第二节所述的方法得到转换之后的坐标。调用该类的setVertexAt()函数设置转换之后的坐标。
(14)标注
标注分为6类:对齐标注、转角标注、半径标注、角度标注、直径标注、坐标标注。地形图中通常用到的为对齐标注与转角标注,其他没有用到。他们对应的ObjectARX类分别为 AcDbRotatedDimension、AcD-bAlignedDimension。转角标注对应的textPosition()可以获取调用的顶点,然后根据第二节所述的方法得到转换之后的坐标。调用setTextPosition()可以设置转角标注的文字位置。调用dimLinePoint()函数可以获取该尺寸通过的一点坐标,然后根据第二节所述的方法得到转换之后的坐标。可以调用setDimLinePoint()设置该点坐标。调用xLine1Point()函数可以获取第一条尺寸边界点的坐标信息,然后根据第二节所述的方法得到转换之后的坐标。可以调用setXLine1Point()函数设置第一条尺寸边界点的坐标。调用xLine2Point()函数可以获取第二条尺寸边界点的坐标信息,然后根据第二节所述的方法得到转换之后的坐标。可以调用setXLine2Point()函数设置第二条尺寸边界点的坐标。对齐标注与此相同。
(15)块参照
块参照对应的ObjectARX类名为AcDbBlockReference,可以通过position()获取块所在的基点坐标,然后根据第二节所述的方法得到转换之后的坐标。调用函数setPosition()函数设置转换之后的坐标。之后调用函数transformBy()实现块参照整体转换。此函数的参数为转换后基点坐标与原基点坐标的构成向量。
5 结语
完成现有测绘成果向CGCS2000的改造,保证过渡期内现有成果及CGCS2000成果的共存共用,是CGCS2000正式启用必须解决的技术问题。由于DWG文件存储量小,并且启动速度快的特点,目前国内的地形图数据主要是以DWG文件格式存储,因此实现DWG文件从传统的参心坐标系向CGCS2000转换是很有现实意义的。本文通过对ObjectARX中地形图常用实体类的研究,实现了地形图中常用实体的坐标转换。
[1]李征航,黄劲松.GPS测量与数据处理[M].武汉大学出版社,2005,3(1).
[2]CJJ 8-99.城市测量规范[S].
[3]曾祥新,谭清华,黄炳强.一种2000国家大地坐标系与参心坐标系间的转换方法[J].广西科学,2010(11):340~342.
[4]姚宜斌,孔建.基于DXF文件的图件转换方法研究及程序实现[J].大地测量与地球动力学,2011(1):117~122.
[5]董玉德,赵韩.CAD二次开发理论与技术[M].合肥工业大学出版社,2009,11(1).
[6]张帆,郑立楷,王华杰.AutoCAD VBA开发精彩实例教程[M].清华大学出版社,2004,4(1).