AutoCAD VBA二次开发在海洋测量数据处理中的应用

付志水
(南宁市天测科技有限责任公司)

【摘 要】 本文着重介绍基于AutoCAD平台,利用其内嵌的VBA开发工具,进行二次开发,达到对海洋测量数据内业自动处理、成图的目的。
【关键词】 VBA 海洋测量 数据处理


  1 引言
  VBA(Visual Basic for Application)是Autodesk公司一种提供给用户,对AutoCAD平台进行二次开发的工具。
  AutoCAD VBA,由Visual Basic派生而来、现在已经成为Microsoft产品的标准语言。与VB一样,VBA是面向对象的程序设计语言,它继承了VB语法简单、功能强大的特点:同时,由于VBA可与主程序在同一内存空间内运行,大大提高了运行速度。并具有某些“智能”功能。
  由于海洋测量成图不像地形测量成图那样复杂,只需将测量数据展点,利用简单的线型生成等深线,并匹配上测量范围内固有物体(例如:航标、灯塔等)对应的海图图式符号即可。这样就使AutoCAD VBA处理海洋测量数据成图工作变得相当简单、可行了。
  2 AutoCAD VBA对海洋测量数据处理的开发与实施
  针对海洋测量数据成果形式相对比较单一的特点,采用VBA语言对AutoCAD进行简单的二次开发,能够完全满足数据处理的要求。程序开发既没什么成本又实用。
  (1)程序的运行。
  VBA是内置于AutoCADR14及以上版本的二次开发工具。因此,我们的开发工作都是基于AutoCAD平台的。首先要先运行AutoCAD,然后通过菜单或命令(loadvba)即可打开该开发工具了。
  (2)应用程序的开发
  由于VBA是面向对象的程序设计语言,开发者可利用其提供的可视化控件,根据目的需要进行窗体的排版设计及代码的编写。在实现对海洋测量数据成图处理的程序代码编写过程中,主要分以下几步:
  ①首先,根据海洋成图规范,实现在AutoCAD上正确的数据输出,即展点。实现此功能要求数据具有一定的格式,同时输出的数据应符合相应测图比例尺的字体大小要求。本程序的数据格式如下:
  序号,,Y坐标,X坐标,水深改正值
  1,,368005.269,2604936.102,34.04
  2,,367999.881,2604935.102,34.35
  3,,368014.594,2604934.600,40.55
  4,,368016.144,2604940.415,39.87
  5,,368027.631,2604943.379,44.57
  6,,368012.377,2604944.119,42.50
  ……………………………………
  Private Sub CommandButton1_Click()'展点
   Do Until EOF(1) '文件读取循环
    If CheckBox_turn = True Then 'X、Y轴对换
     Input #1, Cass_Num, Cass_Name, Cass_xyh(0), Cass_xyh(1), Cass_xyh(2)
    Else
     Input #1, Cass_Num, Cass_Name, Cass_xyh(1), Cass_xyh(0), Cass_xyh(2)
    End If
    Cass_Old_X = Cass_xyh(0)
    If CheckBox_Water = False Then '是否为水深格式显示
      Set Text = ThisDrawing.ModelSpace.AddText(Format(Cass_xyh(2), Zero), Cass_xyh, TextBox_Text_H) '生成文本对象
    End If
  ……………………………………
  ②由图面数据,实现构网功能。即相邻数据之间构成三角形组成三角网。要求各点之间的联线不能交叉且完整。具体实现代码如下:
  Private Sub CommandButton2_Click()'构三角网
  With ThisDrawing
    On Error Resume Next
    If.SelectionSets.count=1 Then .SelectionSets("CurrentSelection").Delete
    Set Users_Selection = .SelectionSets.Add("CurrentSelection")
    Me.Hide
    Users_Selection.SelectOnScreen '选择对象
    ReDim Preserve Cass_x(0 To Users_Selection.count) '初期分配内存
    ReDim Preserve Cass_y(0 To Users_Selection.count)
    ReDim Preserve Cass_H(0 To Users_Selection.count)
    L = 0 '点数初始
    Dim l_long As Long '临时循环变量
    For Each Drawing_Selected In Users_Selection '循环 读取选择的点
      Name = Drawing_Selected.ObjectName
      If Name = "AcDbPoint" Then
        Point_xyh = Drawing_Selected.Coordinates '读取
        Cass_x(L) = Point_xyh(0) 'X 转存
        Cass_y(L) = Point_xyh(1) 'Y
        Cass_H(L) = Point_xyh(2) 'H
        L = L + 1
      Else
        If Name = "AcDbBlockReference" Then
          Point_xyh = Drawing_Selected.insertionPoint '判断重点
          Cass_x(L) = Point_xyh(0) 'X 转存
          Cass_y(L) = Point_xyh(1) 'Y
          Cass_H(L) = Point_xyh(2) 'H
          L = L + 1
        End If
      End If
    Next
  End With
  ……………………………………
  ③由三角网,实现等深线的自动绘制。要求生成的等深线应尽量准确、合理,并且包含相应的高程值和图层设置,自动绘制出粗细和颜色不同的首曲线和计曲线。具体实现代码如下:
  Private Sub CommandButton3_Click()'绘制等高线
    Dim Users_Selection As AcadSelectionSet
    Dim Drawing_Selected As AcadEntity
    Dim Cass_Text As AcadText
    Dim Cass_Pline As AcadPolyline
    Dim Name As String
    On Error Resume Next
    …………………………
    ThisDrawing.ActiveLayer = ThisDrawing.Layers("0") '三角形层
    Set Layer_Line = ThisDrawing.Layers.Add("等深线") '其它附加层
    If Me.CheckBox_OnLine Then '画等深线
    Dim Cass_Line() As Double
    Dim Cass_Conunt As Single
    Dim Cass_Conunt_T As Single '临时变量
    With Max_line
    For t = 0 To .count
      If .OfFang(t) > -1 Then
        L_M = L_M + 1 '等深线数
        Cass_Conunt =(.line1(t).count + .line2(t).count + 2) * 3 - 1
        ReDim Preserve Cass_Line(Cass_Conunt)
        For T2 = .line2(t).count To 0 Step -1
          Cass_Conunt_T = (.line2(t).count - T2) * 3
          Cass_Line(Cass_Conunt_T) = .line2(t).x(T2)
          Cass_Line(Cass_Conunt_T + 1) = .line2(t).y(T2)
          Cass_Line(Cass_Conunt_T + 2) = .h(t)
        Next
        SetCass_Pline=ThisDrawing.ModelSpace.AddPolyline(Cass_Line)
      End If
    Next t
  End With
  …………………………
  ThisDrawing.Application.Update
  End Sub
  ④修图。有时由于水下地形比较复杂和假点(水深测量时出现的异常水深值)的情况,因此由测得数据生成的等深线会出现杂乱,甚至错误的情况。此时就要求首先剔除掉假点数据,对等深线进行局部修正,以使其的走向更加合理。这样做的好处是,及时发现问题,即时得到解决;方便、快捷,不必借助第三方软件。
  3 程序操作流程图

  4 程序特点
  ① 程序可实现自动加载与可视化。当运行AutoCAD时,程序自动随其加载,并作为其菜单显示于面板。
  ② 程序运行稳定、速度快。由于VBA是内嵌在 AutoCAD里面的开发工具,无需调用其它程序。
  ③ 错误数据处理及时。由于测量过程中难免有假点数据出现,通过本程序的展点功能和生成的等深线,很容易发现那些异常的假点,马上删除后,局部重新生成等深线即可。
  ④ 经济实用,无需花钱购买第三方软件,为生产单位节约了资金投入。
  ⑤ 经济效益显著。利用本程序可以大大节省内业处理的时间,提高我们的工作效率,从而获得更高的经济效益。
  ⑥ 实现了内业处理一体化操作。利用AutoCAD平台,即可实现从数据处理,到成果出图。
  5 结束语
  VBA作为AutoCAD平台下强大的开发工具之一,具有语法简单、功能强大、易于掌握的特点,无疑是我们测绘工作者的一个良师益友,是各种水平的用户都能接受的开发语言。在我们的日常生产中,开发一个小程序来处理那些量大、重复的工作就可一劳永逸了,既经济又提高了我们的工作效率。

【参考文献】
[1] 《水运工程测量规范》.JTJ203—2001中华人民共和国交通部发布
[2] 张帆.《AutoCAD VBA二次开发教程》
[3] 张国宝.《AutoCAD2000VBA开发技术》
[4] 李青岳,陈永.《工程测量学》.测绘出版社
[5] 《测量学》.测绘出版社.1991.6第三版

地址:广西南宁市建政路5号  邮编:530023  Tel:0771-5606397  Email:webmaster@digitalgx.com
广西基础地理信息中心版权所有 2005-2010 广西基础地理信息中心制作