APP下载

基于VBA自动提取坐标插件的设计及在±0验线中的应用

2015-06-28王卫华卢云辉

城市勘测 2015年2期
关键词:轻量多义坐标值

王卫华,卢云辉

(宜昌市测绘大队,湖北 宜昌 443100)

1 引 言

建设工程±0 验线是指建设工程施工至±0 位置时,对建筑单体外围轴线位置的检测及±0 标高的检测。目的是检查建设工程基础是否按规划主管部门放线的要求进行施工,±0 验线是灰线检验工作的进一步深入,也是建设工程规划报批后管理的重要环节。±0验线报告作为规划部门管理的重要依据,必须能准确、直观地反映建筑物外围轴线与放线轴线偏移量的方位和数值,图1 所示的坐标较差表,是宜昌市规划局要求的±0 验线报告的一个附件。

图1 ±0 验线坐标较差表

表格中放线坐标和验线坐标数值需要手工输入,如果建筑物结构比较复杂,则输入的工作量非常大而且容易出错。虽然用CAD 命令“list”能列出多义线坐标列表,但是导入Excel 软件时不能直观的找到对应坐标轴,工作量仍然很大。因此,借助CAD 二次开发编写插件无疑是解决此类问题最好的方法。

CAD 二次开发比较常用的工具是Visual LISP 和VBA,两者各有所长,互为补充。Visual LISP 适合描述人机交互的工程,长于编写模拟设计师思路的专业设计程序,对于各种用户的输入、错误的识别与恢复等有相当强大的功能,能充分发挥交互操作的特长,同时具有最多样式的程序运行模式和很好的兼容性。缺点是编译困难,对话框DCL 的设计编写很难熟练掌握,因为其编译困难,很难编写大型程序。VBA 可以很方便地使用Windows 系统资源,使AutoCAD 很容易和Windows 下的Excel 等应用程序交互;对话框功能比LISP DCL 好很多,多图档环境下的应用程序也比Visual LISP 提供了更多的支持,且VBA 代码有较好的可读性,能进行复杂计算公式的编制。不足之处是不能像Visual LISP 一样方便地调用CAD 的命令,许多交互操作的技巧在VBA中不能直接调用。综上所述,熟练、灵活的掌握两种语言的技巧和精髓,能帮助我们写出实用高效,强壮性好的程序,本文中“验线坐标较差表”坐标自动提取插件用VBA 编写,轻松解决了坐标输入的问题。

2 实例和编程思路

2.1 工程概况

某项目±0 验线结果如图2 所示,红色线条为放线轴线,黑色线条为验线轴线。为了图面清晰,省略了与主题无关的要素,且人为拉大了差距,本案例需要分别列出1/K、56/K、48/A、35/A、22/A、9/A 等6 处轴线交点处的放线和验线坐标:

图2 放线验线对照图

2.2 编程思路

由于“坐标较差表”的格式较为固定,便于与Excel 软件结合,本插件主要通过将提取的坐标数据自动写入到表格中相应的单元格中。首先需要用轻量多义线(CAD中命令“PL”输入,此线条只有二维坐标)依次连接所有提取坐标的交点,通过提取此轻量多义线的“Coordinates”属性得到线上所有点的坐标,将坐标值赋值给一个数组,然后分别读取数组中对应的值并写入Excel 表格。数据写入区首个单元格为“D4”,往下依次写入放线坐标值,然后从单元格“G4”开始往下依次写入验线坐标值,本插件的主要难点在于写入表格时的流程控制。

3 程序的实现

为了实现坐标的读取,需要先用“轻量多义线”连接所有需要比较坐标的轴线交点,用“PL”命令依次连接图3 中1 号~12 号点,得到的蓝色多义线就有了插件需要的所有坐标值,并以此为基础来完成插件的编写。

完整代码如下:

图3 绘制连线图

主要代码过程解释:

(1)代码“ThisDrawing.Utility.GetEntity line,pt1,"拾取连线"”的功能是为轻量多义线赋值,调试过程中充分利用“本地窗口”的查询功能,如图4 所示,点开“本地窗口”中“line”的“Coordinates”属性,即坐标属性,可以看到本例中“Coordinates”是一个24 维的数组,由于测绘坐标系和CAD 直角坐标系的差异,Coordinates(0)和Coordinates(1)的值分别对应1 号点的Y坐标和X 坐标,同理,Coordinates(22)和Coordinates(23)的值分别对应12 号点的Y 坐标和X 坐标,深入了解数据的结构,有助于插件的编写。

图4 “Coordinates”属性列表

(2)代码“j=line.Coordinates”的功能是通过“Variant”型变量“j”将line 的“Coordinates”属性取出,才能进行以后的操作,如图5 所示,在赋值之后,本案例中变量“j”是一个24 维的数组,通过对数组的操作,能方便取出需要的值。

图5 变量“j”结构列表

(3)代码“k=UBound(j)-LBound(j):”的功能是通过调用函数“UBound”及“LBound”分别读取数组“j”的上标和下标,本例中执行完本语句后,“K”值由默认的“0”变成“23”,所以“(K+1)/2”的值为12,即“j(0)”至“j(11)”中存储放线数据,“j(12)”至“j(23)”中存储验线数据,通过变量“i”的“FOR”循环,依次读取数组中的数据。如图6 所示:

图6 “K”值查询

(4)代码“For i=0 To(k-3)* 0.5 Step 2

Next i”中:“i”循环的步进设置为“2”是因为每个端点有X、Y 两个值,每个“i”值能同时取j(i)和j(i+1)两个值分别用来填充对应的单元格。由于数据写入的开始单元格为“cells(4,,4)”和“cells(4,,5),所以循环中有变量“i”的表达式分别为“cells(i * 0.5+4,4)”和“cells(i * 0.5+4,5)”,“i”值变化范围定义成0 至“(k-3)* 0.5”,本案例中“K”值为23,步进为2 的情况下,“i”值依次能取到“0、2、4、6、8、10”,这样可读取所有放线坐标。

(5)代码“i=(k+1)* 0.5

Next i”中,验线数数据可以用“i”取值范围“(k+1)* 0.5 To k – 1”、步进为2 的循环来读取,单元格的操作和放线数据的操作类似,这里不再赘述。

本插件在绘制连接主要轴线交点的连线无误的情况下,坐标取值和填写位置能保证绝对准确,杜绝了手工输入带来的误差和繁琐的操作,对复杂的建筑物尤其如此。此编程思路具有广泛的扩展性和衍生性,对于有不同要求和格式的坐标提取,只需要对写入坐标值的单元格定位做相应的调整。由于不涉及复杂的函数和调用,本插件在AutoCAD 2004~AutoCAD 2014 各版本均可正常工作。

4 实例操作

打开Excel 程序,根据较差表模板建立标准空白工作表,用“PL”(轻量多义线)依次连接需要比较的放线点和验线点,运行插件,根据提示选取连线,就能自动生成如图7 所示,同时图中连线自动删除。由于模板自身带有计算公式,计算自动完成,但需要手工填写轴号、作业时间和备注。

图7 坐标较差成果表

5 结 语

本文基于VBA 编程技术,比较轻松地解决了较差表中坐标输入的问题,极大提高了±0 验线“坐标较差表”输入的效率和准确性。本单位在使用过程中遇到了一些特殊情况,通过反复修改和完善,现已能稳定高效地运行,而且在这个插件的基础上衍生出了更多的坐标提取和展点的插件。只是轴线的自动判断和输入的问题比较难解决,AutoCAD 的图元本身不带这个属性,人工定义工作量很大,所以现在作业中还是需要人工判断和输入。

[1]张帆.AutoCAD VBA 二次开发教程[M].北京:清华大学出版社,2006.

[2]张帆,郑立凯,王华杰.Autocad VBA 开发精彩实例教程[M].北京:清华大学出版社,2004.

[3]李风华.Autocad 2002/2000 BVA 开发指南[M].北京:清华大学出版社,2001.

[4]曾洪飞,张帆,卢择临.Autocad VBA&VB.NET 开发基础与实例教程[M].北京:中国电力出版社,2008.

[5]二代龙震工作室.Autocad VBA 函数库查询辞典[M].北京:中国铁路出版社,2003.

[6]Micrsoft 公司.Microsoft visual basic 6.0 程序员指南[M].北京:希望电子出版社,1998.

[7]Micrsoft 公司.Microsoft visual basic 6.0 语言参考手册[M].北京:希望电子出版社,1998.

猜你喜欢

轻量多义坐标值
轻量新能源汽车应用开关磁阻电机系统匹配的研究
试论成都方言的社会称谓语
大跨度钢结构安装三维坐标拟合转换
我对轻量型并继竿的看法
基于二分法迭代的凸模数控铣削加工编程*
基于宏程序的数控车削加工应用
维吾尔语动词“t∫iqmap”多义范畴的语义延伸机制
《锦瑟》赏析
多车道自由流技术在多义路径识别领域的应用
外出的最“重量”武器是最“轻量”化妆包