【doc】VB(VBA)在AutoCAD2005二次开发中的应用
VB(VBA)在AutoCAD2005二次开发中的
应用
第l期四川林勘设计
2006年3月SICHUANFORESTRYEXPLORATIONANDDESIGN
No.1
Mar.2006
VB(VBA)在AutoCAD2005二次开发中的应用
罗照,李凯
(1.中南大学信息物理工程学院,湖南长沙410083;
2.重庆市勘测院,重庆400020)
摘要:文章简要介绍了AutoCAD的二次开发平台,通过添加一个菜单项的
实例讲速了将VB和VBA两者结合对AutoCAD2005进行二挺开发的过程,
以及如何在菜单宏中嵌入自己编制的可执行代码,并在AutoCAD2005启动时
自动加栽白定义菜单的技巧.
关键词:AutoCAD}VisualBasic}VBA;二次开发;ActiveXAutomation
中图分类号:S758.6文献标识码:A
TheApplicationofVB(VBA)intheSecondaryDevelopmentofAutoCAD2005 LUOZhao.LIKai2
(1.CentralSouthForestryCollege.Changsha410004,China; 2.ChongqingReconnaissanceInstitute,Chongqing400020,China) Abstract:IllustratesthesecondarydevelopmentplatformofAutoCAD,and thedetailsofdevelopingthroughaexamplebasedonVBandVBA.Italso specifiesonhowtoinsertownapplicableprogramsinthemenumacros,and theskillsforautomaticallyloadingownmenuswhenstartingtheAutoCAD 2005program.
KeyWordslAutoCAD;VisualBasic;VBA;SecondarydevelopmentIActiveX
Automation
AutoCAD是目前世界上广泛使用于 各种图形应用有关领域的功能强大的计算 机辅助设计软件,其版本逐年更新,功能更 加齐全和完善.但是由于其通用性很强,造 成在某个特定领域的功能不足和薄弱,如 在绘制数字地形图中某些地物符号仅依据 AutoCAD提供的线形,图案等不能绘出 时,就要求必须针对某一特定需要对Au— toCAD进行二次开发.
1AutoCAD二次开发平台
AutoCAD是一种极其灵活的应用程 序,用户可根据自己的需求对其进行开发 和定制,提供了多种开发工具.其中Au— tolLisp是一种解释型过程语言,它不具备 可视化编程开发的能力,并且它在计算算 法上较弱.VisualLisp需要与AutoCAD 图形进行交互,开发过程繁杂.ObjectARX
是一个基于DLLs结构的C++库,运行 于AutoCAD自身相同的内存映像,对 CAD进行直接调用.但掌握它有一定的难 度.
综合起来考虑,应用VB(VBA)进行 AutoCAD的二次开发具有很大的优势. 它是一种面向对象的可视化编程工具,具 有快速的开发环境,其语法简单,功能强 大,界面清晰,同时还可以弥补AutoCAD 在其他方面如数据处理,数据库建设,界面 设计等等的不足.而VBA是一种与Visu—
alBasic近似的编程工具,运行在与应用程 序相同的处理空间中,同时还提供与其他 有VBA编程能力的应用程序的应用集 成,但是它没有独立的开发环境.而本文编 制的一些应用程序,则将两者的优点结合 来运行.
?收稿日期l2005—07--12
作者简介;罗照(1981一),女?重庆人,中南大学信息物理工程学院硕士研究生,主要
研究方向数字化成圉.
罗照等;VB(VBA)在AutoCAD2005二次开发中的应用53
AutoCAD2005是AutoCAD产品的 最新版本之一,其界面更加美观,功能更加 强大.它继续保留了老版本中的ActiveX Automation对象接口,使其它应用程序能 通过它提供的接口访问AutoCAD的对 象,对每个对象的属性,方法和事件进行操 作.
2ActiveXAutomation技术
ActiveXAutomation也称为ActiveX 自动化服务功能,以前也称为对象链接和 嵌入(OLE).它允许Windows中应用程序 之间进行相互的对话,沟通和控制.Ac. tiveX将应用程序模块化,把有关的数据和 操作封装起来,以对象的形式提供给另一 个应用程序,而用户不必了解其详细的内 部实现过程.ActiveXAutomation过程以 动态链接库的形式提供,实现了代码的共 享.
3AutoCAD对象模型
AutoCADActiveX接口有五种类型 的对象:图形实体,非图形实体,例如线型, 标注样式等;结构实体,例如图层和图块 等;视图实体;图形和AutoCADVBA应 用程序.
4应用VB(VBA)对AutoCAD进行开发 的过程
要使用各种开发工具对AutoCAD进 行调用,首先必须引用它的各层对象. 进入VBA的IDE开发环境后,就将 自动加载Thisdrawing图形对象,可对其 属性,方法和事件进行调用和操作了. 当我们使用VB对AutoCAD进行二 次开发时,由于VB与AutoCAD运行在 不同的内存空间,所以首先必须将其与 AutoCAD进行连接,其连接的具体方法 是:打开工程菜单,选择引用,复选Auto— CADZ005TypeLibrary.再编写VB程序 代码,创建AutoCAD对象,启动运行Au— toCAD.我们可以看到,只要将VBA中的 Thisdrawing图形对象改为VB中的Au— toCAD应用程序活动文档对象即可实现 相同的功能.其具体代码如下:
DimMyAppAsAcadApplication
DimacdocAsObject DimmodelobjAsObject OnErrorResumeNext'如果遇见错
误,则执行下一行
SetMyApp—GetObject(,"auto—
cad.Application) '获得AutoCAD程序对象
IfErrThen
Err.Clear
MsgBoxErr,Description
SetMyApp=CreateObject(auto—
cad.application") IfErrThen
Msgbox没有安装AutoCAD,请安 装"
ExitSub
EndIf
EndIf
MyApp.Visible=True'使Auto—
CAD对象可见
同时,还要设置操纵AutoCAD中文 档对象和模型空间的方法:
Setacdoc=MyApp.ActiveDocument
Setmodelobj=acdoc.ModelSpace
AutoCAD中的菜单宏是指的当单击 菜单时执行的一系列操作,宏可以只是完 成操作的按键记录,或是复杂的指令组合 以及执行AutolISP,DIESEI或者Ac— tiveX的程序代码,在创建了菜单后,用户 可以使用Macro属性来修改菜单宏. 我们可能已经发现AutoCAD中的菜 单宏并不能直接执行VisualBasic语言的 程序命令,如果我们不想利用AutoIISP
54四川林勘设计2006年第i期
语言进行宏编制的话,那么实现复杂的指 令将会有一定的困难.解决这一问题的方 法是先将VB语言(或者是其他语言如VC 等)写成的执行这一指令的应用程序生成 可执行文件(.exe),再在AutoCAD菜单
宏中进行加载.方法如下:
Macro=chr(3)+chr(3)+"START"
+chr(13)+"应用程序名.exe"+chr(13) 也可以把宏中的START命令改为:
SHELI,但执行宏的速度不如START 快.START是一个Windows系统命令, 对于定义AutoCAD外部的命令非常有 用,它可以弹出一个新的命令窗口或者连 接到一项新的应用,这项命令对于Auto— CAD是独立的.同样SHELi也是一项操 作系统命令,但是它的使用却有一些限制. 解决这一问题还有一个方法,就是先
将一些指令写成VBA的宏,再将VBA宏 加载进下拉菜单宏中,由于VBA是内嵌 于AutoCAD2005内存环境的,因此这个 方法加载外部命令执行速度更快.方法如 下:
Macro=chr(3)+chr(3)+Chr(Asc
("一"))
+chr(13)+VBARUN"+Chr(13) +"Filename.dvb!ProjectName.
MacroName"
+chr(13)
其中:Filename.dvb为工程的文件 名,ProjectName为工程的名称,MacroN— ame则是要执行的宏的名称,VBARUN 是AutoCAD的一个指令.
5开发实例
本文给出一个菜单开发实例,进一步 说明应用VB(VBA)对AutoCAD进行二 次开发的过程.
首先在AutoCAD中制作一种特殊线 型,以适应本领域需要,如根据测量规范中 陡坎的线型制作了"陡坎"线型文件,以线 型文件的
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
(.1in)保存在Auto— CAD2005的搜索路径中.增加Auto— CAD2005的支持文件搜索路径在菜单中 单击"工具"菜单项,选择"选项",在"文件" 选项卡中进行修改..
新建一个VB工程,移除Form窗体, 添加一个模块,在其代码中写入增加菜单 项的代码(由于篇幅限制,仅列出了部分代 码):
SetMenultems1=;;MenuItem.Ad— dMenultem(O,"加载线形",macrostr1)
SetMenultems2:==Menultem.Ad— dMenultem(1,"展点",macrostr2) SetMenultems63=Menultem.Ad— dMenultem(2,"将展成的点连线", macrostr3)
其菜单宏为:
Macrostrl—Chr(3)+Chr(3)+
Chr(Asc("一"))+"VBARUN"&Chr (13)&"e:/project1.dvb!加载线型"& Chr(13)"'VBARUN"执行预先写好的
VBA宏"加载线型"
macrostr2一Chr(3)+Chr(3)+ "START"&Chr(13)&"e:/展点.exe"& Chr(13)
"START"执行外部程序"展点"
macrostr3一Chr(3)+Chr(3)+ Chr(Asc("一"))+"VBARUN&Chr (13)&"e:/project1.dvb!连线"&Chr (13)
其中加载线型菜单项宏被制作成了一
个VBA宏,在程序执行时通过VBARUN 命令自动加载它,在写文件名的路径时没
有使用"\"而是使用了"/"是因为在执行
AutoCAD宏时反斜线字符(\)会使宏暂
停等待用户输入,在指定文件路径时应用
正斜线(/)代替.该VBA宏的代码为:
罗照等:VB(VBA)在AutoCAD2005二次开发中的应用55 坎",
ThisDrawing.Linetypes.Load"陡区别
"D:programfilesautocad2005(Pt)
support\''陡坎".1in
在数字化测图过程中,由于大多数测
绘单位不具备电子平板测图条件,通常是
采用全站仪外业采集,绘制草图,将测得数
据记录在全站仪中或PC——E5OO电子手
簿中,内业成图时将测得数据通过数据电 缆连接到计算机中,自动在AutoCAD中 将测得点画出(称为展点),并且可对各种 不同类别的点分层(如点层,点号层,高程 层等),不同的层以不同的颜色显示,用户 可以对层的的属性进行操作.
下面就是自动在AutoCAD中画点的 VisualBasic程序代码(部分),最后将其 制作成可执行文件(e;\展点.exe)供Au— toCAD菜单宏调用.
假若数据采集格式为:
点号,X坐标,Y坐标,z(高程)
Open数据文件名ForInputAs#1 setPoints—acdoc.Layers.Add("
点")'增加"点"图层
Points.Color=acBlue SetHeights=acdoc.Layers.Add("
高程")
'增加"高程"图层
Heights.ColoracGreen Setnos—aedoc.Layers.Add("点
号")
'增加"点号"图层
nos.Color=acRed DoWhileNotEOF(1) Input#1,N0,X,Y,z '将文件中数据分别附值给这几个变 最
Pt(O)Y:Pt(1)=X:Pt(2)一0
'测量坐标系与AutoCAD坐标系的
SetAdPoint—modelobj.AddPoint '在模型空间中画点
AdPoint.Layer一点"
'所画点属于"点"图层
SetAdNO=modelobj.AddText (Str(NO),Pt,1#)
'在模型空间中绘制点号
AdNO.Layer一"点号"
Ht(O)一y+0.9:Ht(1)X:Ht (2)一0
SetAdHeight—modelobj.AddText (Str(z),Ht,2#)
AdHeight.Layer一"高程"
Loop
Close#1
acapp1.Application.ZoomExtents
Form1.Visible=False EndSub
将展成的点连线的VBA代码为:
SetPtLine=ThisDrawing.Layers.
Add("点连线")
'创建一个新的图层
PtIine.color===acCyan Dimk
DimCoordAsVariant
ForEachentryInThisDrawing. ModelSpace
Ifentry.EntityType=acPointThen
i=i+l
EndIf
Next
'获取模型空间中的点数目
ReDimentrycopys(i一1,2)
'根据获得的点数目重新定义数组维
数
k==0
56四川林勘设计2006年第1期
ForEachentryInThisDrawing.
ModelSpace
Ifentry.EntityType—acPointThen Coord—entry.Coordinates '获取实体坐标
entrycopys(k,O)一Coord(O) entrycopys(k,I)一Coord(1) entrycopys(k.2)一Coord(2) k—k+1
EndIf
Next
DimStPt(OTo2)AsDouble DimEtPt(OTo2)AsDouble Forj一1Toi一1
StPt(O)一entrycopys(j—I,O)
StPt(1)entrycopys(j一1,1)
StPt(2)=entrycopys(j—I,2)
EtPt(O)一entrycopys(j,O) EtPt(1)一entrycopys(j,1) EtPt(2)一entrycopys(j,2)
SetLines—ThisDrawing.Mod—
elSpace.AddIine(StPt,EtPt)'将当前点 与前一个点连线
Lines.Layer一"点连线"'将连成的 线置于"点连线图层
Nextj
ThisDrawing.Application.ZoomEx— tents
如果要在VisualBasic环境中写入程 序,则只要将VBA中的ThisDrawing对 象改为AutoCAD对象的活动文件对象, 就可以执行相同的操作,但由于是外部程 序,执行速度将会慢一些.再将程序写成一 个可执行文件(.exe)供AutoCAD菜单宏 调用.
6使AutoCAD运行时自动显示自己的 菜单
我们将刚才制作的加载各级菜单的 VB工程制作成了可执行程序"E:\菜单. exe,运行文字编辑工具,输入以下代码; (defunS::STARTUP() (CommandSTARTE:\菜单.
exe))
将文件另存为acad.1sp,保存在Au— toCAD的支持文件搜索路径下.这样在每 次启动AutoCAD时,将会运行Lisp程序 acad.1sp,从而启动菜单加载程序E:\菜 单.exe,在启动时就能够自动显示自己的 菜单了.
从以上我们可以看出,利用VB
(VBA)对AutoCAD进行二次开发,要比
用c++,AutoIISP等语言简单,方便,实
用,只需要具备BASIC语言基础,就可充
分利用AutoCAD强大的图形处理功能,
和VB(VBA)在算法和界面等方面的优势
开发出适合本专业领域内的各种应用程
序.另外VB操纵数据库的功能很强,我们
还可以建立基于AutoCAD的各种图形数
据库管理系统.
7参考文献
1李风华.AutoCAD2002/2000VBA开发指南[M].北京:清华大学出版社.2001
2张晋西.VisualBasic与AutoCAD二次开发[M].北京:清华大学出版社,2002