张 坤
(中铁第一勘察设计院集团有限公司,陕西西安 710043)
AutoCAD是目前勘察设计行业最常用的设计软件之一,广泛应用于铁路、公路、水利等行业。作为一种通用的辅助设计软件,在面对特殊用途的设计中,如果仅仅利用CAD自身提供的功能,往往造成人工工作量大,而且很多工作量都是重复性劳动。在此情况下,只是会用软件的基本功能是不够的,根据专业性质和用户要求进行CAD二次开发就成了解决问题的有效途径。
目前工作中,勘探孔编号、坐标、里程及偏移量多是通过人机交互的方式直接在CAD中测量读取,工作量大且具有重复性。人工读取数据有以下三个不足,一是费时,二是错误率高,三是精度无法保证。为了解决这些问题,选择VBA对CAD进行二次开发就成了必要。VBA入门简单,开发速度快。在钻孔投影里程程序的开发中,钻孔以带属性的块的形式存在,程序能够很方便的获取钻孔图块的编号和插入点,然后通过VBA调用Lisp的曲线类函数,能够获取钻孔图块的插入点在线路上的投影里程和偏移量,最后在VBA中调用Excel的类型库,将钻孔的相关数据保存在Excel中。程序运行方便,准确度高,减少了专业人员的工作量,取得了良好的效果,值得推广和运用。
程序主要包括一个读过程和一个写过程,读取钻孔信息全部操作均在CAD中完成,并且在CAD命令窗口中有信息提示;在数据存储方面,程序采用了大家习惯的Excel文件来保存钻孔的编号、坐标、里程及偏移量(如图1所示)。
图1 程序运行流程图
程序运行完毕后,钻孔的以上数据自动传输到Excel中,可以替代目前逐个量取钻孔坐标、里程及偏移量繁琐的工作。
钻孔投影里程程序主要由三部分组成:宏启动程序、用户窗体和类模块。
宏启动模块代码如下:
Sub RunMicro()
frmMain.Show
End Sub
该程序的目的是调用主窗口,其中窗体的名称为frmMain。
窗体包括一个里程冠号输入框,两个命令按钮:运行和退出。程序的运行的所有代码都包含在运行命令按钮的过程中(如图2所示)。
图2 程序窗体
类模块主要包含Vlax和Curve两个类模块。在VBA中对于曲线的操作是一个弱项,因为ActiveX没有太多有关曲线方面的内容,但LISP中很多有用的函数在ActiveX中都没有对应的属性方法。为了解决这一个问题,已经有前人用该类型库编写成为VLAX类模块,这样就可以在VBA中可以直接调用该类,然后实现该类型库中提供的重要功能,也即在程序中引用了VLAX和Curve两个类模块。
这两个类模块适合的曲线类型包括:直线、多段线、弧线等,钻孔投影里程程序中利用的功能主要包括:返回曲线的起点和终点坐标,曲线上一点到曲线起点的长度,曲线外一点到曲线距离最近点坐标,也即点到线的垂足。代码主要部分如下:
Dim objCurve As Curve
Set objCurve=New Curve
objCurve.StartPoint
objCurve.EndPoint
objCurve.GetClosestPointTo(PntPick)
objCurve.GetDistanceAtPoint(PntPick)
AutoCAD中块有以下优势,便于建立块图形库;能够节约磁盘空间;图形修改方便;能够携带属性信息。块属性是从属块的非图形信息,它是块的一个组成部分,实际上,也可以说属性是块中的文本实体,即:块=若干实体+属性。
在平时工作中,CAD中钻孔的标示方法是钻孔图形和编号独立存在,但是这样做有一个缺点就是程序不能将钻孔和与之对应的编号一一联系起来。为了解决这个问题,可以用钻孔块和块属性的方法来表示钻孔信息。
因此,程序开发中将钻孔做成块的形式,编号做成块属性,这样就能够很容易获取相关的钻孔编号和块插入点坐标,也即钻孔的平面位置坐标。
(1)建立CAD-VBA与Excel程序连接
在“工具”-“引用”里面引用Excel对象库,这样就可以在 CAD-VBA中实现 CAD和 Excel的数据通信[4-5]。
关键代码实现如下:
(2)选择需要投影里程的线路
该方法要求用户在图形屏幕上拾取一个点来选中线路实体,一旦选择成功后有消息提示框提示线路选择成功。
关键代码实现如下:
ThisDrawing.Utility.GetEntity Ent,PickedPoint,
"选择线路"
(3)选取线路上一点并输入里程
在选择线路上一点时,对象捕捉模式设置为最近点捕捉和交点捕捉,目的是为了选取线路上标示里程桩号与线路的交点,根据线路上一点的里程和任意一点的相对距离,就可以算出线路上该点的里程。
计算原理如下:假设线路上所选取A点的里程数为X0,需要计算B点的里程数为X1,A点距离线路起点的线路上L0,B点距离线路起点的距离为L1,很容易计算得B点的里程
关键代码实现如下:
ThisDrawing.SetVariable"OSMODE",544
其中,在系统变量OSMODE中,最近点捕捉数值为512,交点捕捉数值为32,这两个数值的和544即为选中这两种捕捉模式。
(4)确保程序中只有唯一的选择集
需要注意的是,这里的选择集名为“test1”,第2次运行时程序不能还用此名创建选择集,否则就要出错。因此,在程序中运行时需要判断CAD中选择集是否存在,如果存在,则删除此选择集,并且创建一个新的选择集。
关键代码实现如下:
(5)获取钻孔坐标和偏移量
选取钻孔块后,通过访问钻孔块InsertionPoint属性能够得到该点的坐标,假设该插入点为C,然后通过GetClosestPointTo函数能够求得曲线上距离该插入点距离最近点D坐标,同时D点也为垂足,然后根据C点和D点坐标求出CD间的距离,也即钻孔离线路的偏移量。
关键代码实现如下:
ptPick=ssetObj.Item(i).InsertionPoint
ClosestPnt=objCurve.GetClosestPointTo(ptPick)
(6)钻孔在线路左右侧的判断
线路画线方向一般是从小里程到大里程,通过
PtStar=objCurve.StartPoint
PtEnd=objCurve.EndPoint
能够获取线路的起点和终点坐标,在XY坐标系中,假如起点坐标分量X1小于终点坐标分量X2,在CAD中线路小里程到大里程表现为从左往右,当钻孔插入点C坐标分量 Y1大于垂足 D点的坐标分量Y2时,返回一个字符”左”;当Y1小于垂足D点的坐标分量Y2时,返回一个字符”右”;当Y1等于垂足D点的坐标分量Y2时,返回一个空字符””,即钻孔在线路上。根据同样的道理,可以很容易判断出线路从小里程到大里程表现为从右往左的情况。
(7)将里程转换为铁路表示方法
假如获得某一钻孔的里程为1 100m,左偏1m,然后将此改写成符合工作中的表达习惯,如“DK1+100左1m”。
计算原理如下:假设里程为 X,首先X/1000取整,即Y=Int(X/1000),Y为里程千米数,然后计算百米部分,即Z=X-1000×Int(X/1000),Z为百米部分,最后用连接符“&”将各字符连接即可。
程序的应用实例选取兰新第二双线嘉峪关联络线左线和右线进行测试,线路方案稳定后,左线长约3.7 km,右线长约3.1 km,根据铁路工程地质勘察规范布置钻孔[6],共布设钻孔53个。
程序运行步骤如下:
①打开cad图,并且新建一张Excel表格,用来存储钻孔的相关信息。运行宏,界面如图3所示。
图3 程序运行界面
②点击运行,选中所要投影的线路,一旦线路实体选择成功,会有消息提示,然后点击确定,如图4所示。
图4 消息提示框
③选择线路上任意一点里程已知的位置,初始化整条线路的里程,并且在弹出的对话框中输入该点的里程,如选择的点A的里程是DK1+100,输入1 100,点击确定。程序运行界面如图5、图6所示。
图5 消息提示框
图6 线路点里程输入框
④选择将要投影的钻孔,选择完毕后,点击Enter键,钻孔的编号、x坐标、y坐标、里程和偏移量自动传输到Excel中,表格形式表1所示,表1中选取了其中8个钻孔作为演示。表中数据可以直接用于钻探任务书的下发,减少了工作量,节约了工作时间。
表1 钻孔信息一览
(1)钻孔投影里程程序能够自动获取钻孔的坐标和里程信息,并保存于大家习惯的Excel工作表中,操作简单,极大提高了工作自动化程度,减少了相关人员的工作量。
(2)VBA程序能够在VB6.0中编译生成.exe可执行文件,不需安装,运行方便,且有利于源代码的保护。
(3)虽然程序中只实现了钻孔的投影里程,根据同样的道理,可以将其他勘探孔信息,例如试坑、静探孔等的坐标和投影线路里程让程序自动读出,并保存在Excel中,需要做的只是完善相关块及块属性库,方便以后调用。
(4)本程序暂时支持CAD2004与Excel2003的通信,其中 Excel2003对象库引用的是 Microsoft Excel 11.0 Object Library,其他版本的Excel类型库运行会报错,要重新编译,才能重新运行。
(5)Vlax类和Curve类模块中,要在VBA中调用Lisp库函数,Lisp和VBA两者通信过程中在其他计算机上会出现一些未知错误,程序运行的稳定性有待进一步提高。
[1]张晋西.Visual Basic与AutoCAD二次开发[M].北京:清华大学出版社,2002
[2]二代龙震工作室.AutocAD VBA函数库查询辞典[M].北京:中国铁道出版社,2003
[3]张帆,郑立楷.卢择临,等.AutoCAD VBA二次开发教程[M].北京:清华大学出版社,2006
[4]闫海涛,岳全贵,詹才平.基于VBA的地质勘察CAD软件开发[J].交通科技,2010(7)
[5]李景健,杨安.AutoCAD表格和Excel表格的相互转换[J].交通科技,2010(7)
[6]铁道部第一勘测设计院.铁路工程地质手册[M].北京:中国铁道出版社,2005