应用ActiveX Automation技术进行AutoCAD的二次开发
霍建伟 (信息中心) [摘 要] 本文主要介绍了基于AutoCAD平台二次开发的最新技术ActiveX Automation的使用方法与应用技巧。与AutoCAD二次开发工具的Auto Lisp、ADS、ARX、Visual Lisp等相比,ActiveX Automation完全实现了OLE Automation,用户可以不但可以操纵它提供所有的AutoCAD 对象,而且可以使用多种可视化开发工具实现AutoCAD的定制开发。[关键词] 二次开发 ActiveX Automation AutoCAD 1 前言 Autodesk公司的AutoCAD软件一直是CAD市场中的主流产品。它是一种极其灵活的应用系统,用户可以通过编程的方式对其进行定制。随着技术的不断发展及AutoCAD的日益普及,在其上进行二次开发的工具也不断更新。常用的主要Auto Lisp、ADS、Object ARX、ActiveX Aation、Visual Lisp等。其中,Auto Lisp继承了LISP语言的编程规则而导致繁多的括号,不如编程语言方便;ADS虽由功能强大的C语言编制,但较为复杂,不适应当前可视化编程的需要;Object ARX以C++为编程语言,采用先进的面向对象的编程原理,提供可与AutoCAD直接交互的开发环境,但是开发周期较长。最新推出的ActiveX Automation二次开发技术,通过加入ActiveX自动化服务功能,使得用户可以通过可视化编程工具,如Visual Basic、Delphi等对AutoCAD进行二次开发,极大的提高了开发效率。 在最近结合堤防设计项目开发的堤防CAD应用系统中,笔者采用AutoCAD 2000为平台,Visual Basic 6.0为编程工具,成功的应用ActiveX Automation技术实现AutoCAD的二次开发。本文将从编程实践的角度讨论关于运用Visual Basic对AutoCAD基于ActiveX Automation的二次开发技术。 2 ActiveX Automation技术简介 AutoCAD中的ActiveX Automation是微软公司ActiveX规范的具体应用。它通过基于ActiveX的自动化对象,为其他应用程序提供了访问AutoCAD内部功能的方法,是AutoCAD最新的开发接口。在运行时,开发的应用程序为客户机,AutoCAD是服务器,应用程序正是通过对AutoCAD提供的各级对象进行操作而控制AutoCAD工作的。 理解AutoCAD的对象模型是对其编程的基础。其对象模型图可以参照联机帮助中AutoCAD ActiveX and VBA Reference页,它是一种树型结构模型,是由一系列的对象,按一定层次组成的一种对象结构,每一个对象代表了AutoCAD中一个明确的功能,这些对象以方法和属性的方式封装到ActiveX对象中,通过方法可以实现对象的一些操作,通过属性可以完成对象状态信息的收集或改变。根据这些功能的不同,可以把这些对象分成以下几类: (1)图元类对象。如直线、圆弧、多义线、文本、尺寸等。 (2)样式设置类对象。如线型、尺寸样式等。 (3)组织结构类对象。如图层、组、图块等。 (4)图形显示类对象。如视图、视窗等。 (5)文档与应用程序类对象。如一个DWG文件或应用程序本身等。 3 AutoCAD对象的使用 这里将结合项目开发使用到的一些开发方法和技巧以示例的方式对AutoCAD中常用对象及其使用方法进行讨论。 3.1 开始一个应用程序 在编程、调试或运行时至少应该有一个AutoCAD副本在运行。可以通过以下的代码创建或打开AutoCAD 2000应用系统。 Public acadApp As AcadApplication 建立Application对象 Public acadDoc As AcadDocument 建立Document对象 Private Sub ConnectToCAD() On Error Resume Next Set acadApp=GetObject(″AutoCAD.Application″) 如果AutoCAD已经启动,则直接得到 If Err Then Err.Clear Set acadApp=CreateObject(″AutoCAD.Application″) 如果AutoCAD未启动,则启动AutoCAD If Err Then Err.Clear Set acadApp=GetObject(strCADPos)) 从用户预设的文件路径启动AutoCAD If Err Then MsgBox ″没有找到AutoCAD2000,请先安装!″ Exit Sub End If End IfEnd IfacadApp.Visible=True 使AutoCAD 可见Set acadDoc=acadApp.ActiveDocument End Sub 3.2 操作图形文件 Document对象提供了大多数AutoCad的文件功能,可以通过它实现对文件的更新(New)、打开(Open)、输出(Export)、输入(Import)等操作。例如: Set acadDoc=acadApp.Documents.Add(″acadDoc″) 新建AutoCAD文件 acadDoc.Application.Documents.Open dwgName 打开CAD文件dwgName If Not acadDoc.Saved Then acadDoc.Save 保存AutoCAD文件 3.3 获取和设置系统变量 通过调用SetVariable 和 GetVariable方法可以读取或修改AutoCAD的系统变量。例如: acadDoc.SetVariable ″Orthomode″, 1 打开正交模式 strCadver=acadDoc.Getvariable(″Acadver″) 获取AutoCad的版本号 3.4 图层和线形操作 通过操作Layer对象和Linetype对象可以实现完成图层和线形的操作。例如:添加一个图层LayerGH Dim LayerGH As AcadLayer Set LayerGH=acadDoc.Layers.Add(″LayerGH″) LayerGH.Color=acRed 设置图层颜色 添加线形″dashedx2″ strLineTypeName=″dashedx2″ Dim LTObj As AcadLineType For Each LTObj In acadDoc.Linetypes If StrComp(LTObj.Name, strLineTypeName, vbTextCompare)=0 Then blnFound=True Exit For End If Next If Not blnFound Then acadDoc.Linetypes.Load strLineTypeName, “acad.lin" End If 3.5 图形实体的操作 在创建AutoCAD图形实体对象之前,首先必须定义并创建ModelSpace与PaperSpace集合对象。这两个对象可通过Document对象的ModelSpace属性与PaperSpace属性返回。 Dim moSpace As AcadModelSpace Dim paSpace As AcadPaperSpace Set moSpace=acadDoc.ModelSpace Set paSpace=acadDoc.PaperSpace 所有关于图形对象操作的方法与属性都包含在这两个对象中。例如: 生成一个轻量多义线及相应线宽和颜色设置代码如下: Dim arrPt(0 To 5) As Double arrPt (0)=2;arrPt (1)=4;arrPt (2)=4 arrPt (3)=2;arrPt (4)=10;arrPt (5)=4 acadDoc.ActiveLinetype=acadDoc.Linetypes.Item(″continuous″) Dim LWPLineObj As AcadLWPolyline Set LWPLineObj=moSpace.AddLightWeightPolyline(arrPt) LWPLineObj.ConstantWidth=0.6 LWPLineObj.Color=acGreen LWPLineObj.Update 添加文本代码如下: Dim startPoint(0 To 2) As Double startPoint(0)=10;startPoint(1)=10;startPoint(2)=0 Dim TextObj As AcadText Set TextObj=moSpace.AddText(TextStr, StartPoint, TextHeight) With TextObj Color=VBRed Rotation=RotateAngle ScaleFactor=0.7 设定宽高比 VerticalAlignment=0 设垂直位置为 0 HorizontalAlignment=5 设文字为两端对齐 Update End With 3.6 交互功能的实现 Utility对象提供了与用户在命令行交互的途径,可以让用户输入数字、字符串及角度、点坐标等参量。例如:提示用户选取标注高程点并读入系统。 acadDoc.Utility.InitializeUserInput 128,″q″ 预定义输入形式 Dim TempPoint As Variant TempPoint=acadDoc.Utility.GetPoint(″请选择要标注高程的点:″) Dim GetPoint As StruPoint ‘StruPoint是自定义点数据类型 GetPoint.x=TempPoint(0) GetPoint.y=TempPoint(1) 3.7 选择集的操作 通过用户的选择或过滤条件把所需的实体加入选择集,完成对选择集中实体的修改操作。例如:用户在屏幕上选择实体,修改其颜色为蓝色。 Dim sSet as AcadSelectionSet Set sSet=acaddoc.SelectionSets.Add(″NewSet″)建立新选择集 sSet.SelectOnScreen 用户在屏幕上选择 Dim entry As AcadEntity For Each entry In sSet 遍历选择集中的实体 entry.Color=acBlue entry.Update Next entry 3.8 访问AutoCAD命令行 可以使用SendCommand方法直接发送命令到AutoCAD命令行。SendCommand方法发送单一的字符串到命令行。字符串必须包含所执行命令次序相同的命令列表变量,字符串中的空格或相当于回车的ASCII码与在键盘中按回车是相同的,没有变量的情况下调用SendCommand方法是无效的。例如: acadDoc.SendCommand ″__Circle 2,2,0 4″ 画圆 acadDoc.SendCommand ″__zoom a″ 4 结束语 ActiveX Automation二次开发技术的出现,标志着AutoCAD 的二次开发技术取得了历史性转折。首先,它完全实现了OLE Automation,使得其他软件可以方便地访问AutoCAD;其次,它首次实现了面向对象的开发技术,用户可以操纵它提供所有的AutoCAD 对象;最后,开发工具不再局限于C及C++系列语言,像VB、Delphi等简单易用的可视化开发工具都可以实现AutoCAD的定制开发。以上是笔者利用ActiveX Automation技术在堤防CAD项目开发中得到的一点经验和感受的总结,对其中较为常用的开发思路和方法做了简单的介绍,希望与大家共享。文中的代码在Visual Basic 6.0及AutoCAD 2000中调试通过。 |