应用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中调试通过。