周 杨
(中航勘察设计研究院有限公司,北京 100098)
地下水监测井综合柱状图是地下水监测井建设工程中的关键基础资料。与勘察中常见的钻孔柱状图不同,监测井综合柱状图不仅要表示出地层的岩性、厚度等基本特征,还要展现出监测井的孔身结构和井管结构。因此,目前常用的钻孔柱状图绘制程序无法满足监测井综合柱状图的绘制要求。
目前监测井综合柱状图大多是由技术人员利用AutoCAD进行人工绘图,需要绘制大量的线段、充填图案,录入大量文字,操作过程繁琐,绘图效率低下。若要更改出图比例尺,只能重新绘制,造成前期工作量的极大浪费。使绘图更加自动化,具有十分重要的现实意义。
熟练运用工程中常见的Excel软件和AutoCAD软件,往往可以达到事半功倍的效果[1-3]。利用Excel生成AutoCAD命令行语句绘制柱状图[4-5],在一定程度上提高了绘图效率,但仍为一种半自动化的绘图方法,需通过人工把命令行语句输入到AutoCAD中,当命名行语句数量较多时,容易造成语句或字符遗漏,导致使用效果不佳。王凤和[6]基于AutoCAD进行二次开发,通过AutoCAD调用监测井属性数据绘图,进一步优化绘图过程。然而,监测井属性数据的复杂性往往被忽视,导致数据录入过程中的体验较差并且数据检验困难。
本文围绕地下水监测井综合柱状图的自动绘图展开研究,系统设计了绘图工具的组织架构,优化数据录入方式,基于VBA语言编写绘图程序,将Excel的数据存储功能与AutoCAD的绘图功能高效连接,成功开发出地下水监测井综合柱状图自动绘图工具软件。
VBA(Visual Basic for Applications)是从Visual Basic衍生出来的一种应用程序开发工具语言。VBA是一种完全面向对象体系结构的编程语言,在开发方面具有强大的功能和易用性,因此许多应用程序均嵌入该语言作为开发工具,其中也包括了微软公司的Excel软件[7]和Autodesk公司的AutoCAD软件[8]。
使用Excel VBA开发自动绘图工具的优点主要有:
(1)目前常用的Excel版本均已经内嵌了Visual Basic编辑器,因此使用VBA编程时可以以Excel环境为母体,无须再搭建开发环境。
(2)Excel软件是目前最常用的办公软件之一,使得以此作为平台开发应用程序具有良好的通用性。
(3)Excel软件采用表格方式管理数据,所有的数据都以二维表格形式管理,单元格中数据间的相互关系一目了然,便于数据录入和数据查验。
绘图工具应包含三大主要功能,即数据的存储、数据的处理、图形的绘制。
绘图工具架构如图1所示,绘图工具以Excel绘图工作簿作为数据存储中心,可储存监测井的各类属性数据;AutoCAD绘图模板承担图形的最终绘制;以Excel为开发平台,利用其自带的Visual Basic编辑器编写的VBA绘图程序作为数据处理模块。绘图程序可独立存在,也可将其嵌入到绘图工作薄中。
绘图思路为:绘图程序调用储存在Excel绘图工作薄中的监测井绘图数据,进行处理运算,计算完成后调用AutoCAD绘图模板,通过执行相应程序语句将文字、线段、平面和图案充填等图元绘制到指定位置上,最终获得监测井综合柱状图。
图1 绘图工具组织架构
绘图工作簿如图2所示,嵌入VBA绘图程序后,Excel绘图工作簿不仅是数据存储中心,同时也是软件操作的主要界面。利用Excel绘图工作簿录入监测井属性数据,可将各类数据分别录入到对应的工作表内。
图2 绘图工作簿界面
监测井绘图属性数据可分为监测井基本数据、地层数据、井结构数据(井管数据和滤、止水数据)、出图参数、图例数据(图例代号)。
监测井基本数据包括监测井编号、名称、地理位置、坐标、井深、开孔直径、井管直径、地下水类型、地下水埋深、制图单位和制图时间;地层数据包含地层名称、地层厚度、地层深度、岩性描述;井结构数据包括井管类型、井管深度、滤料类型、滤料深度、止水料类型、止水料深度;柱状图参数包括柱状图各栏目列宽数据、横向比例尺、纵向比例尺;图例数据包含400余种地层岩性名称和与之对应的充填图案代号。
对监测井属性数据的分类有助于数据的录入结构化,并且提高数据查验效率。
AutoCAD绘图模板如图3所示,包括表头区、主绘制区、成井说明区和图签区。表头区展示监测井的基本信息;主绘制区展示地层结构和井结构信息;成井说明区对监测井成井工艺进行详细说明;预留图签区用于绘制人和审核人签字。AutoCAD绘图模板的分区设计有利于成图格式的统一,达到制图规范化。
图3 AutoCAD绘图模板
绘制二维平面图像需要建立绘图坐标系,绘图模板以地质年代栏的左下角为绘图原点,水平右方向为X轴正方向,竖直上方向为Y轴正方向,所有图元的绘制均以坐标原点为参照进行绘制。主绘制区内的水平方向范围受各栏目列宽控制,竖直方向范围受井深和纵向比例尺控制。
绘图程序是绘图工具软件的核心组成部分,绘图程序负责处理绘图过程中的各类数据,首先读取Excel绘图工作簿中的数据,然后根据成图比例尺计算各地层、井管等材料的绘制高度,并将数据存储在临时数组中,待绘图语句调用。
绘图程序计算完成后,需调用AutoCAD绘图模板,并绘制各类图元,主要包括文字、线段、平面、图案充填以及标注。绘图程序反复调用四类图元的绘制语句,即可在绘图模板中绘制柱状图。
下面分别介绍调用AutoCAD模板语句和这几种图元的绘制语句。
利用Excel VBA调用AutoCAD绘图模板,首先要引用AutoCAD的VBA类库。通过使用FileDialog方法获得绘图模板的文件路径,并将此路径作为Open方法的参数。
AutoCAD绘图模板调用语句如下:
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim mypath As String
On Error Resume Next
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "请选择CAD绘图模板"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "CAD Files", "*.dwt;".dwg"
.Filters.Add "All Files", "*.*"
If (.Show=-1)Then mypath=.SelectedItems(1)
Else: Exit Sub
End With
Set acadApp = GetObject( , "AutoCAD.Application")
If Err Then Err.Clear
Set acadApp = CreateObject("AutoCAD.Application")
If Err Then End
End If
Set acadDoc = acadApp.Documents.Open(mypath)
Set acadDoc = acadApp.ActiveDocument
绘制文字需要使用AddText方法。该方法需要输入三个参数:文字字串、插入点位置和文字高度。
文字绘制语句如下:
Dim TextObj As AcadText
Dim TString As String
Dim Point(0 To 1) As Double
Dim height As Double
TString = "黏土" 岩性赋值
Point(0) = 1: Point(1) = 0 插入点坐标赋值
height = 2.5 文本高度赋值
Set TextObj = ThisDrawing.ModelSpace. AddText(TString, Point, height)
执行以上语句可在AutoCAD绘图模板中添加内容为“黏土”的文字,文字插入点空间坐标点为(1,0),文字高度为2.5。
绘制直线需要使用AddLine方法。该方法需要输入两个参数:线段起点坐标和终点坐标。
线段绘制语句如下:
Dim lineObj As acadline
Dim StartPoint(0 To 1) As Double
Dim EndPoint(0 To 1) As Double
StartPoint (0) = 1 : StartPoint (1) = 0 线段起点赋值
EndPoint (0) = 2 : EndPoint (1) = 0 线段终点赋值
Set lineObj = acadDoc.ModelSpace.AddLine(StartPoint, StartPoint)
执行以上语句可在AutoCAD绘图模板中添加一条线段,线段起点坐标为(1,0),终点坐标为(2,0)。
绘制平面需要使用AddLightWeightPolyline方法。该方法利用绘制闭合的多段线来生成平面,因此其参数为多段线上各个转折点的坐标。
图案充填需要使用AddHatch方法,该方法需要三个参数:充填类型、充填图案名称和充填边界。
本绘图工具将目前常用的岩性图案整合到充填图例库中,如图4所示,每一种岩性有且只有一种与之相对应的代号,利用Excel工作簿中VLOOKUP函数对需填岩性的代号进行反向查询,以保证程序通过读取代号便能正确调用相应的图案进行充填。
图4 充填图例代号库
平面绘制和充填语句为:
Dim hatchObj As AcadHatch
Dim patternName As String
Dim PatternType As Long
Dim bAssociativity As Boolean
Dim p(1 To 10) As Double
Dim rect(0 To 0) As AcadEntity
Dim outerLoop(0 To 0) As AcadEntity
p(1) = 0 : p(2) = 0
p(3) = 1 : p(4) = 0
p(5) = 1 : p(6) = 2
p(7) = 0 : p(8) =2
p(9)=p(1) : p(10) = p(2) 平面角点坐标赋值
Set rect(0) = acadDoc.ModelSpace.AddLightWeightPolyline(p)
patternName = HW615 图案代号赋值
PatternType = 0
bAssociativity = True
Set hatchObj = acadDoc.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
hatchObj.AppendOuterLoop (rect)
hatchObj.Evaluate
hatchObj.Update
acdDoc.Regen True
执行以上语句可在AutoCAD绘图模板中添加一个平面,平面长为2,宽为1,左下角坐标为(0,0),平面充填代号为HW615(黏土)。
对于井口直径和井管直径的标注属于线性标注,需要使用AddDimAligned方法,使用该方法需要四个参数:标注起点坐标、标注终点坐标、标注文字坐标、标注文字字串。
线性标注语句如下:
Dim dimObj As AcadDimAligned
Dim point1(0 To 1) As Double
Dim point2(0 To 1) As Double
Dim location(0 To 1) As Double
point1(0) = 0 : point1(1) = 0 标注起点坐标赋值
point2(0) =10 : point2(1) = 0 标注终点坐标赋值
location(0) = (point2(0) + point1(0)) / 2
location(1) = 5 标注文字坐标赋值
Set dimObj = acadDoc.ModelSpace.AddDimAligned(point1, point2, location)
dimObj.TextOverride = 600 & "mm" 标注文字赋值
dimObj.Update
执行以上语句可在AutoCAD绘图模板中添加一条线性标注,线段起点坐标为(0,0),终点坐标为(10,0),标注文字内容为“600 mm”,标注文字坐标为(5,5)。
绘图工具软件的安装十分便捷,只需将绘图工具文件夹拷贝到电脑中即可。如图5所示,绘图工具文件夹内有三个文件,包括:充填图例库文件夹、绘图工作簿.xlsm和绘图模板.dwg。
第一步:对于初次使用本软件的电脑,为使AutoCAD可以调用正确的图案,首先需要将充填图例库文件夹的路径添加到AutoCAD的支持文件搜索路径中,已添加过充填图例库可跳过该步骤。
图5 绘图工具
第二步:打开绘图工作簿.xlsm,其主界面如图2所示。将地下水监测井数据分别录入到“监测井基本数据”、“地层数据”、“井管数据”、“滤、止水数据”和“出图参数”这5个工作表中。
第三步:在主界面点击“表内计算”按钮,程序对录入的数据进行计算。
第四步:计算完成后,在主界面点击“绘制柱状图”按钮,在弹出的窗口中选择绘图模板.dwg文件,程序将自动完成综合柱状图的绘制,成果如图6所示。
图6 监测井综合柱状图
地下水监测井综合柱状图绘图原理简单,但人工绘制操作繁琐。本文围绕地下水监测井综合柱状图的自动绘图展开研究,基于Excel和AutoCAD两款软件成功开发出地下水监测井综合柱状图的自动绘图工具软件。
Excel绘图工作簿中监测井属性数据的分类录入设计有助于数据录入的结构化和数据查验;AutoCAD绘图模板的分区设计使得成图规范化;利用VBA编写的绘图程序将Excel和AutoCAD两款软件高效连接,实现了绘图自动化。
运用绘图工具可减少大量的重复工作,同时克服传统绘图工作中不易修改的缺点,极大地提高出图效率。