AutoCAD二次开发技术在工程测绘制图中的应用

2012-09-06 00:54周丽云李裕聪
城市建设理论研究 2012年22期

周丽云 李裕聪

摘要:简要介绍了进行AutoCAD二次开发的常用方法和技术特点,并以实例说明了利用VBA实现AutoCAD二次开发的实际价值和意义。

关键词: AutoCAD二次开发 VBA 工程测绘制图 坐标标注

中图分类号:K826.16文献标识码:A 文章编号:

随着现代科学技术的迅猛发展,测绘科学也发生了翻天覆地的变化,测绘仪器和测绘技术都有了很大的发展,测绘仪器由原来的光学仪器、机械仪器发展到了电子仪器,图形绘制由铅笔平板仪绘制发展到计算机软件绘制。电子仪器可通过专用传输线与计算机直接连接,把野外所采集的数据传输进计算机,在计算机中进行数字化成图。以手工作业为主的测量内业计算与绘图工作已经可以通过电子仪器、计算机绘图仪完成。数字化成图已经成为测图发展的主流方向。

目前市场上的数字成图软件有很多,测绘行业普遍使用的有南方测绘公司的 CASS 系列、广州开思公司的 SCS 系列,还有北京微远图公司的 SV300 系列等软件,这些软件多是以AutoCAD为平台开发的, 它们主要针对的是测绘行业的通用性需求,在大体框架上基本满足了地形图、地籍图等测绘工作的成图要求。但测绘性质的多样性,决定了不可能有适合所有测绘性质的数字成图软件,在实际工作中,一些制图工作在许多细节上的操作具有特殊性,并且随测绘性质和目的的不同而有所不同。而且每个测绘员又各有各的工作方式和习惯.这些通用软件对一些特殊性质的处理控制和专业性强的特殊要求就不能满足了,怎样解决这个问题和要求,使数字化成图软件更符合自己工作要求呢?

下面针对本单位经常进行的工程测量成图工作中遇到的问题,介绍解决基本方法与过程。

一.AutoCAD及二次开发简介

1. AutoCAD

AutoCAD是美国 Autodesk 公司开发的一个交互式绘图软件,具有开放的极其灵活的体系结构,它允许用户和开发者采用各种方法对其进行定制、扩充和修改,即用户自己可以对进行二次开发,能最大限度地满足用户的特殊要求。

2. 二次开发的途径

AutoCAD的二次开发途径主要有两个,即文件开发和程序开发:

A.文件开发: 文件开发是按照 AutoCAD 提供的方法和文件格式,通过编辑或建立 新的AutoCAD 系统所支持的文件,来开发 AutoCAD,使其满足用户特定需要的方法。

(1) DXF 文件接口方式:以ASCII码文本文件描述它的图形细节,可以完美的实现与高级语言的连接。但格式非常复杂,应用程序编写有难度。

(2)SCR 文件接口方式:SCR文件又叫命令脚本文件。它是由一组AutoCAD命令组成的文件。

(3) DWG 文件接口方式:具有打开速度快的优点。但它以机器码形式存放,一般不能让高级语言直接读取。

B.程序开发: 程序开发是指利用 AutoCAD 提供或支持的编程环境和开发工具,通过编写程序来实现对AutoCAD开发的方法。借助于程序开发,可为 AutoCAD 扩充新的命令或定义,以满足用户具体需要。

AutoCAD的二次开发语言主要有:ObjectARX、VisualLisp、VBA(Visual Basic For Application)以及最新的.NET等。其中ObjectARX 基于 VC++平台,功能非常强大,但其缺点是编程语言复杂, 对开发人员的编程水平要求比较高;VisualLisp与 VBA较为简单,特别是VBA,编程语句容易理解和交流, AutoCAD内嵌开发平台,使用方便且运行速度快。

上述开发方法各有优缺点。实际的开发中,可以将多种方法综合起来,扬长避短,使 CAD系统功能得到最佳的组合,发挥最好的效益。

二. 在工程测绘制图中的应用

1.业务需求

在工程测绘制图中,我们常常需要在图形中将一些特征点(比如:开挖区域的边线角点)的坐标标注出来,而且需要以引线的方式进行。使用AutoCAD本身提供的现有命令当然也可以进行,但如果需要标注的特征点比较多时,那就要重复进行繁琐的操作了。

2.解决方案

针对这个问题,我们使用 VBA作为开发工具,编写了一个小工具。该程序的特点是简单快速,只需在CAD图形上点击特征点和坐标标注位置,即可以以引线的方式将测量坐标标注出来,提高了制图工作的效率,在实际工作中有比较强的实用意义。主要代码如下:

Private Sub CmdOK_Click()

FrmMain.Hide '隐藏窗体

Call 初始化 '进行有关层/字体/颜色/线型等的设置

'以下进行坐标标注

StartPt = ThisDrawing.Utility.GetPoint(,vbcr & "请选择要标注坐标的点: ")

EndPt = ThisDrawing.Utility.GetPoint(StartPt, vbcr & "请选择引线位置: ")

FxPt = ThisDrawing.Utility.GetPoint(EndPt, vbcr & "请选择标注方向: ")

字高 = Val(CmbTexth.Text)

xLong = Len(Int(StartPt(1))) '求出标注坐标的整数位个数

yLong = Len(Int(StartPt(0)))

LineLong =IIf( xLong > yLong , xLong, yLong) '求出坐标分隔线的长

Select Case XyD'根据小数位数求出坐标分隔线的长度

Case 0

LineLong = (LineLong + XyD) * 字高

Case 1

LineLong = (LineLong + XyD + 1#) * 字高

Case 2

LineLong = (LineLong + XyD + 2#) * 字高

Case 3

LineLong = (LineLong + XyD + 3#) * 字高

Case 4

LineLong = (LineLong + XyD + 4#) * 字高

Case Else

LineLong = (LineLong + XyD + 3#) * 字高

End Select

If FxPt(0) > EndPt(0) Then'计算引线各点坐标

Pt(0) = StartPt(0): Pt(1) = StartPt(1): Pt(2) = 0#

Pt(3) = EndPt(0): Pt(4) = EndPt(1): Pt(5) = 0#

Pt(6) = EndPt(0) + LineLong: Pt(7) = EndPt(1): Pt(8) = 0#

Else

Pt(0) = StartPt(0): Pt(1) = StartPt(1): Pt(2) = 0#

Pt(3) = EndPt(0): Pt(4) = EndPt(1): Pt(5) = 0#

Pt(6) = EndPt(0) – LineLong: Pt(7) = EndPt(1): Pt(8) = 0#

End If

Set PLine = ThisDrawing.ModelSpace.AddPolyline(Pt) '画出引线

PLine.Layer = LayerName:PLine.Color = acByLayer:PLine.Update

If FxPt(0) > EndPt(0) Then '计算标注X和Y的标注位置

Pt_v(0) = EndPt(0) + 0.5: Pt_v(1) = EndPt(1) + 0.5

Pt_h(0) = EndPt(0) + 0.5: Pt_h(1) = EndPt(1) - 字高 - 0.5

Else

Pt_v(0) = EndPt(0) – LineLong: Pt_v(1) = EndPt(1) + 0.5

Pt_h(0) = EndPt(0) – LineLong: Pt_h(1) = EndPt(1) - 字高 - 0.5

End If

Dim xText, xxText, yText, yyText As Object'定义标注变量

Set xText = ThisDrawing.ModelSpace.AddText("X=", Pt_v, 字高)'标注”X=”

xText.Layer = LayerName :xText.Color = acByLayer : xText.Update

'计算标注X的位置

Pt_v(0)=IIf( FxPt(0) > EndPt(0), Pt_v(0) + 字高 * 2# ,Pt_v(0) + 字高 * 2#)

'标注X坐标

Set xxText = ThisDrawing.ModelSpace.AddText(Format(StartPt(1), XyFormat), Pt_v, 字高)

xxText.Layer = LayerName :xxText.Color = acByLayer :xxText.Update

Set yText = ThisDrawing.ModelSpace.AddText("Y=", Pt_h, 字高) '标注Y=

yText.Layer = LayerName :yText.Color = acByLayer : yText.Update

'计算标注Y的位置

Pt_h(0)=IIf( FxPt(0) > EndPt(0), Pt_h(0) + 字高 * 2# , Pt_h(0) + 字高 * 2#)

'标注Y坐标

Set yyText = ThisDrawing.ModelSpace.AddText(Format(StartPt(0), XyFormat), Pt_h, 字高)

yyText.Layer = LayerName :yyText.Color = acByLayer :yyText.Update

Unload Me

End Sub

3.程序运行及效果

在AutoCAD集成的VBA 编辑器完成相关的窗体设计和代码编写后,按下F5键就可以执行程序了,首先出现如下窗体,我们可以在窗体相应栏目设置标注的一些参数。

程序的运行时的窗体

输入完成后点击”确定”按键,即可转换到AutoCAD 的模型空间,在事先打开了的图形上先后点击特征点位置和标注点位置即可完成测量坐标的标注。效果如下图。

程序的使用效果

三.结语

本文从工程实用的角度出发,列举了在工程测绘制图中快速标注特征点坐标的程序开发的实例,通过给出程序加有对应的中文注释的主要VBA源码。介绍了利用VBA如何进行AutoCAD的二次开发,如何编写适合自己的制图工具的一般方法。

基于VBA的AutoCAD二次开发方式有很好的实用价值,它可以让我们很容易地编制出各种有针对性的工具,实现AutoCAD的功能扩展,更好更方便地完成我们的工作。

参考资料:

1. 《AutoCAD 2002/2000 VBA开发指南》,李凤华 编著,清华大学出版社,2001

2. 《Visual Basic 与 AutoCAD 二次开发》, 张晋西 编著,清华大学出版社, 2002

3. 《AutoCAD 2002 VBA开发技术》, 张国宝 编著,清华大学出版社,2000

4. 《中华人民共和国CAD制图标准》, 国家技术监督局

5. 《CAD制图规则》, 国家技术监督局

注:文章内所有公式及图表请用PDF形式查看。