基于VBA自动绘制时间-沉降量曲线插件的设计

2014-06-26 07:41王卫华柯于衡
城市勘测 2014年5期
关键词:时间跨度纵轴横轴

王卫华 ,柯于衡

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

1 引 言

“时间-沉降量曲线图”作为测绘单位必须提供客户的要资料之一,在很多地区是不能简单运用Excel软件提供的图表绘制功能来完成的,生产单位往往是结合AutoCAD 的绘图功能和Excel 的统计计算功能来手工绘制,不仅费事费力,而且在作业过程中容易引入人为误差或错误。因此,借助AutoCAD 二次开发编写插件无疑是解决此类问题最好的方法。

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

2 实例和编程思路

2.1 工程概况

某小区2#楼为18 层剪力墙结构,建筑总高度50.7 m,该楼共埋设了14 个沉降观测点,12 次观测沉降数据如表1所示:

表1 2#楼沉降量统计表

2.2 编程思路

时间-沉降曲线图如图1所示,横轴代表时间跨度,纵轴代表各时间点对应的沉降量,除了曲线主体之外,还必须注明时间刻度、沉降量刻度、曲线对应点号等辅助要素。为了方便阐述插件的编写过程,将插件实现过程分为以下5 个步骤来分别说明:

图1 标准时间-沉降量曲线

(1)沉降曲线数据的读取;

(2)自动判断监测数据信息中的时间跨度、点号、有效取值区域;

(3)根据最大日期和最大沉降量定义横纵轴刻度;

(4)绘制坐标轴、标注文字;

(5)生成时间-沉降量点阵,将点阵连成的折线拟合为曲线。

3 程序的实现

为了实现数据自动读取,完全不需要人为干预自动绘制沉降曲线,需要根据沉降观测外业结束后历次观察数据统计出合格的时间-沉降量表格,以此为基础来完成插件的编写,如表2所示:

表2 时间-沉降量基础表格

3.1 数据读取

需要借用Excel VBA 的部分功能,读取的对象是当前打开的Excel 工作簿中的数据,如果找不到激活状态的工作簿,程序会自动提醒打开需要绘制时间-沉降曲线的表格,代码如下:

3.2 判断有效数据区域,提取点号、时间跨度等数据信息

通过一个循环语句的使用,根据其是否为空来判断当前工作簿的有效范围,这对后面所有工作都至关重要。观测点的点号需要在曲线末端注明,点号的读取位置为表一中单元格(3,A)至(k1,A)。时间跨度需要确定表格有效区域的最大列数“m1”,表格中单元格“excelSheet.cells(2,m1)”的值就是沉降观测对应的时间跨度,实现代码如下:

3.3 判断横轴和纵轴刻度大小

为了图形的美观、突出沉降变化的特征和打印方便,横轴和纵轴的长度比例关系设定为2∶1,横轴每格代表的天数要根据时间跨度自动调整,时间跨度(“excelSheet.cells(2,m1).Value”)在3.2 操作中已经得到,通过函数关系来调整横轴刻度的大小;同样,纵轴每格代表沉降量也需要根据整栋建筑最大的沉降量来调整,需要比较各个观测点沉降量来获得最大沉降量的值,再通过函数关系来调整纵轴刻度的大小,实现代码如下:

3.4 横纵坐标轴、辅助元素的绘制

如图2,横轴的绘制包括坐标轴、刻度分划、日期标注和文本等内容。因为每个项目有若干个观测点,需要引入一个三维点pt1(2)作为单个观测点沉降曲线绘制的基点,使各观测点曲线成果整齐排列,互不干扰。定义代码如下:

图2 横轴标准样式

同理可以绘出纵轴及其辅助元素,此处不再赘述。

3.5 绘制曲线

绘制曲线为本插件的主要功能,是最核心也是最有难度的部分。一种方案是先根据时间和沉降量组成的点阵画出一列点,用轻量级多义线连接所有点,最后对多义线进行拟合成沉降曲线。另外一种方案是用“样条曲线”直接连接点列,两种方案大同小异,差异之处就是第一种方案所绘曲线是二维曲线,而第二种方案绘制为三维曲线,表现出来的效果是完全一致的,本文采用第一种方案编程。由于实际监测过程中,经常遇到少数点被破坏的情况,如果出现了表3所示“202”点在第9 次观测前被破坏或毁损的情况,需要中断对该点的观测,这样绘制曲线时点pt 的维数需要根据实际观测的次数来决定,所以pt 的定义必须是一个不指定维数的双精度数组,具体维数要看沉降量取值为“0”时候“列”的值,用redim 命令来重新定义。

表3 有缺损观测点的表格

图3 未经拟合的沉降曲线

这样绘制的轻量多义线是一条折线,如图3所示,还需要拟合成一条光滑的曲线,这里需要结合Visual Lisp 的相关知识,具体实现过程如下:通过所绘折线的handle 属性得到该折线的句柄,组合成lisp 能识别的AutoCAD 命令来对折线编辑拟合,代码如下:

拟合后就得到图1所示沉降曲线图成果。

通过设置行变量j 从3 到k1 的循环,可以实现依次画出整个项目所有观测点的功能。所有成果图会自动排列成一列,由于本例观测点偏多,不再一一列举。

4 结 语

本文基于VBA 编程技术,充分结合AutoCAD 软件,所编写插件能很好完成满足宜昌市沉降报告要求的时间-沉降量曲线的绘制,在本单位内部使用节省了沉降内业工作时间。同时再根据使用过程中遇到的新情况,比如观测点被破坏,观测被迫中断等预先没有考虑的情况,经过不断改进完善,使插件的强壮性和稳定得到提高。

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

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

[3]李风华.Autocad 2002/2000 VBA 开发指南[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.

猜你喜欢
时间跨度纵轴横轴
请您诊断
请 您 诊 断
如虎
——黄胄画猫贺岁展
电视剧《父母爱情》受欢迎的原因探析
请您诊断
浅谈回顾性成就报道的创作思路
底横轴翻板闸门安装施工工艺分析
巧解“一横多纵多线”坐标图地理试题
传感器网络分簇时间跨度优化聚类算法
流动管理:一种班级管理的实践模式