甘肃林欣建筑装饰工程有限公司甘肃天水741000
摘要:利用AutoCAD的VBA技术开发适合工程应用的断面绘制程序,弥补现有相关绘制程序在工程应用中的缺陷和不足,满足各类工程应用。
关键词:AutoCADVBA断面图程序开发
一、引言
断面的绘制,是我们在工程应用中经常遇到的一项工作,相关的绘制程序也比较多,如南方Cass,广州开思等。但大多数绘制程序都采用的是三角网内插点的算法实现断面线上特征点的提取,这种方法生成的断面线特征点是按照指定的内插间距计算而出,而我们实测的断面特征点往往会被程序忽略,因此这种方法生成的断面线并不能够真实的反应断面线上的地形特征,给我们的图件资料造成一定的误差,也就是说其并不能够完全满足工程应用的需要。
二、程序结构设计和实现原理
(一)实现原理。
目前RTK的应用已经十分广泛,工程上断面原始数据的采集,也普遍使用这种仪器。各个厂家的RTK手簿软件也都内置了断面测量功能,根据这些功能我们可以提前设计好纵横断面线,并在野外按照设计好的纵横断面线采集对应的断面数据,以确保实测断面数据与设计出图断面线不要偏离太远。在图形文件中布设好纵横断面线,并将采集完成后的断面数据通过南方Cass软件以高程点的形式展绘到图上,程序将根据纵横断面线,按照用户指定的高程点选取扩展距离,生成一个矩形选择区域,将包含在这个矩形区域内的所有高程点垂直投影到断面线上,作为断面线上的地形特征点,对于断面线起点、终点和中心点处没有实测数据的情况,软件可以根据内插或外推的方式自动计算出对应的数据,最后将这些点根据该点与断面线起点的距离按照大小排序,生成最终的断面里程文件。
(二)程序结构设计。
程序流程:野外数据采集—手工绘制纵断面线—自动生成横断面线—生成断面里程文件—绘制断面图。
三、实现方法
(一)根据纵断面线绘制横断面线
在AutoCAD中我们绘制的纵断面线一般是多段线,根据纵断面线生成横断面线的方法一般是在纵断面线上按照指定的间距,绘制一条垂直于纵断面线的直线。因此我们的程序要能够精确计算出纵断面线上指定距离处点的坐标和通过该点的法线在指定距离处的点的坐标,然后根据法线两端点的坐标绘制一条直线,生成一条横断面线,其余横断面线按照本方法依次绘制。
多段线一般是由直线段首尾相接组成,也有直线和圆弧、圆弧和圆弧相接组成的形式。首先,我们将多段线进行分解,将每一子段的类型、起点坐标、终点坐标、起点里程、终点里程、圆心坐标、圆心角、圆心至起点方位角、圆心至终点方位角、圆弧半径计算得出,并保存到一个自定义的结构变量CurvePara中,程序代码如下:
TypeCurvePara
CurveType()AsInteger'子段类型(直线或圆弧)
spt()AssPoint'起点坐标
ept()AssPoint'终点坐标
sDis()AsDouble'起点里程
eDis()AsDouble'终点里程
sFwj()AsDouble'起始方位角
CPt()AssPoint'圆心坐标
cAng()AsDouble'圆心角
csAng()AsDouble'圆心至起点方位角
ceAng()AsDouble'圆心至终点方位角
Ra()AsDouble'半径
CountAsLong'多段线内子段的数量
EndType
然后根据要生成横断面线的里程值,在这个多段线结构变量中按起点里程和终点里程查找到该点在多段线的哪一个子段上,并根据子段类型计算出该点坐标和通过该点法线两端点的坐标,最后在AutoCAD中利用该点法线两端点的坐标绘制一条直线,生成一条横断面线。程序示例代码如下:
FunctionDrawHDMLine(L,CPt,LPt,RPt,LDis,RDis,SPLPara)
'计算横断面线两端点的坐标
GetPointAtDisL,CPt,LPt,Rpt,LeftDis,RightDis,sPLPara
'绘制横断面线
ThisDrawing.ModelSpace.AddLineLPt,Rpt
EndFunction
L横断面线里程值
CPt纵横断面线交点坐标
LPt横断面线左侧端点坐标
Rpt横断面线右侧端点坐标
LDis横断面线左侧长度
RDis横断面线右侧长度
sPLPara纵断面线曲线参数
(二)生成横断面线里程文件
程序循环提取已经生成的横断面线,将单条横断面线按用户指定的高程点选取扩展距离生成一个矩形选择区域,将包含在该矩形区域内的高程点提取,计算出每一个高程点在该条横断面线上的垂直投影距离(高程点至横断面起点),如果该条横断面线的两端点和中心点处没有符合条件的高程点,程序将自动采用内插或外推的方式,为其计算出一个对应的高程点。最后将这些高程点按照投影距离大小进行排序,并保存至文件。
程序示例代码如下:
SubGCDtoLCFile()
DimDMXasAcadLwPolyline'纵断面线对象变量
DimDmxObj()asVariant'横断面线对象变量数组
DimDMSLCasDouble'横断面线左侧起始里程值
DimExLenasDouble'高程点选取扩展距离
DimDMXLC()asDouble'单条横断面线里程值数组
DimDMXH()asDouble'单条横断面线高程值数组
'选择纵断面线上的所有横断面线
SelHDMtoSsetDMX,DmxObj
Close#1
Open"C:\HdmSmaple.hdm"ForOutputAs#1
Fori=0ToUBound(DmxObj)
'生成一条横断面数据
GetLineHDMDmxObj(i),DMSLC,ExLen,DMXLC,DMXH
Forj=0ToUBound(DMXLC)
'写入一条横断面数据到文件
Print#1,DMSLC+DMXLC(j)&","&DMXH(j)
Nextj
Nexti
Close#1
EndSub
(三)根据里程文件绘制断面图
断面图的绘制采用对话框界面,以便用户输入断面图绘制参数。用户可以通过该对话框指定断面图的纵、横向比例尺、插入点位置、距离和高程标注的小数位数和标注样式、文字大小,以及方格线绘制的方式和间距等。如果断面里程文件中有多条横断面数据的话,用户可以通过该对话框设置绘制断面图的行数,以及行间距和列间距,程序会根据用户指定的参数对生成的断面图进行排版,方便用户将最终成果打印输出。设置完成后,程序读取生成后的断面里程文件,根据用户输入的断面图绘制参数,依次绘制所有横断面线到AutoCAD图形文件中。最后,程序再根据每条断面线的坐标和覆盖范围,为每条断面线自动绘制高程标尺和里程标尺。
程序读取断面里程文件并绘制断面线的简要代码如下:
SubDrawDMT()
DimJL()asDouble'单条断面线里程坐标数组
DimGC()asDouble'单条断面线高程坐标数组
DimDMLenasDouble'单条断面线长度
DimDmtMinHasDouble'单条断面线最低点高程值
DimDMSJ()AsDouble'单条断面线坐标数组
Close#1
Open"C:\HdmSmaple.hdm"ForInputAs#1
'读取一条断面数据
DoWhileNotEOF(1)
LineInput#1,TxtLine
txtStr=Split(TxtLine,",")
JL(i)=CDbl(txtStr(0))
GC(i)=CDbl(txtStr(1))
ReDimPreserveJL(i+1)AsDouble
ReDimPreserveGC(i+1)AsDouble
i=i+1
Loop
ReDimPreserveJL(i-1)AsDouble
ReDimPreserveGC(i-1)AsDouble
i=i-1
DMLen=Abs(JL(i)-JL(0))*1000/CInt(HBLC.Text)
DmHMin=minval(GC)
DmtMinH=Int(minval(GC)-3)
ReDimPreserveDMSJ(2*i+1)
Fori=0ToUBound(DMSJ)Step2
DMSJ(i)=X.Text+5+(JL(i/2)-JL(0))*1000/CInt(HBLC.Text)
DMSJ(i+1)=Y.Text+(GC(i/2)-DmtMinH)*1000/CInt(VBLC.Text)
Nexti
'绘制断面线ThisDrawing.ModelSpace.AddLightWeightPolylineDMSJ
EndSub
四、结束语
随着计算机应用技术在工程行业的普及,我们的工作方式已经从传统的手工纸质时代迈入了全新的计算机辅助绘图时代。在日常的工作中,我们经常要依赖计算机完成一些复杂的运算或制作专业的图件资料,针对各个行业的计算机软件也层出不穷,但由于我们工作的复杂多样化,也不可能有一款软件能够完全满足我们的工作需要,因此利用VBA对AutoCAD进行二次开发来完成我们日常工作中碰到的问题就显得尤为重要。本文以纵横断面绘制程序开发为例,介绍了在AutoCAD中基于VBA的程序开发方法,解决了相关专业软件在纵横断面图绘制上的精度问题,更好的满足了我们在工程中的应用。
参考文献
[1]张帆、郑立楷、卢择临、王成煌,AutoCADVBA二次开发教程,清华大学出版社,2006.01.
[2]MarionCottingham著,孔祥丰等译,AutoCADVBA从入门到精通,电子工业出版社,2005.09.
[3]王若慧,AutoCADVBA参数化绘图程序开发与实战编码.