Autodesk公司的AutoCAD软件广泛地应用于设计领域。AutoCAD作为强大而专业的工程绘图软件,近几年来在工程地质制图方面也得到了广泛应用,如钻孔柱状图、剖面图等。但由于CAD本身的原因以及地质图件的特殊性,完全依赖CAD而不借助第三方软件或对CAD进行二次开发,实现地质图件的计算机化也是一件非常困难的事情。好在CAD是一个灵活而又开放的系统,它提供了许多开放式的接口,允许用户通过这些接口对CAD进行二次开发,以满足不同用户的需要。
 
  在AutoCAD R14以前的版本中,最常用的开发工具是AutoLisp和ADS,这两种开发工具都不适应当前可视化编程的需要。幸运的是,在AutoCAD R14版本中,Autodesk公司在AutoCAD中加入了ActiveX自动化服务功能(ActiveX Automation server capabilities),使得用户可以通过可视化编程工具,如Visual Basic(以下简称VB)、Delphi等对AutoCAD进行二次开发,不但提高了工作效率,也满足了不同专业的需要。最近我院开发了“工程地质CAD绘图系统”软件,荣获本单位优秀软件三等奖。该系统我们以AutoCAD R14为平台,VB为开发工具,应用ActiveX技术对AutoCAD进行了二次开发。本文简略地说明AutoCAD中的ActiveX对象模型结构及对模型对象的编程引用。
 
  1 AutoCAD中的ActiveX对象模型
 
  AutoCAD ActiveX提供了一种机制,或者说是一种方法,可以供开发者通过编程手段来操纵AutoCAD。ActiveX是由一系列的对象,按一定的层次结构组成的,每一个对象都代表了AutoCAD中的一个明确的功能。每一个对象本身包含着自己的属性和方法,通过方法可以实现对象的一些操作,如控制CAD的启动,打开一个文档,一条直线的生成。而属性则是对象自己本身所具有的一些性质,如一个文本对象,它的属性有文本的高度,宽度、文本的颜色,所在层等。应用程序正是通过对AutoCAD暴露的各级对象的方法和属性的引用控制AutoCAD工作的。
 
  理解AutoCAD的对象模型是实现编程的基础。AutoCAD以层次结构组织对象(对象模型图可以参考R14版本中的帮助文件)。在顶层是Application对象(即AutoCAD 本身),其他对象均为Application对象的子对象。在Application对象下面是Preferences(优先设置)和Document(文档)对象,通过Preferences对象可以对AutoCAD Tools>Preferences菜单项中的几乎每一个选项进行访问和修改,以获取或改变AutoCAD的优先设置。Document对象是控制AutoCAD图形文件的直接对象,它代表某一个装入的CAD图形文件(一般设为当前激活的文件)。Document对象下面有Model Space(模型空间)和Paper Space(图纸空间)对象及Blocks(块)、Layers (层)、Plot(出图)、Selectionsets(选择集)、 views(视图)、 utility(功能)等一系列对象(集合),其含义与AutoCAD中相似。Model Space是当前图形文件中图形实体,如直线、圆、多义线等的集合,每个实体即是一个对象,可通过属性和方法改变实体或生成新实体。对非图形实体,如层(layer)、线形(line type)等的访问则通过访问Document对象下面的相应的集合类型的子对象,如Layers 、LineTypes等来实现。集合类型的对象可以使用VB中所有的集合操作方法。Plot对象提供了访问Plot对话框中各选项的桥梁,使应用程序具有用不同方式控制AutoCAD出图的能力。Utility对象使用户在AutoCAD命令行与CAD交互成为可能,通过它可以处理整型、浮点型、字符型等用户输入,还可以接受点(Point)或角(Angle)等AutoCAD的特殊量。以上简要地说明了CAD中的对象及其层次结构关系,有了这些理解对编程控制CAD就不难了。
 
  2 AutoCAD对象的使用
 
  2.1 AutoCAD application对象
 
  如前所述,Application对象位于AutoCAD层次对象结构的顶层,它代表AutoCAD自身,所有的应用程序必须从Appliction对象的建立开始。
 
  Dim aCADapp As Object '建立Application对象
 
  Dim aCADdoc As Object '建立Document对象
 
  Dim mospace As Object '建立Model Space 对象
 
  On Error Resume Next
 
  Set aCADapp = GetObject(, "autoCAD.application")
 
  If Err Then
 
  Err.Clear
 
  Set aCADapp = CreateObject("autoCAD.application") ‘
 
  If Err Then
 
  MsgBox Err.Description
 
  Exit Sub
 
  End If
 
  End If
 
  Set aCADDoc = aCADApp.ActiveDocument
 
  上一语句是设aCADdoc为当前图形文档。
 
  Set aCADutil = aCADDoc.Utility '与用户交互
 
  aCADApp.Visible = True ‘此语句是使CAD可见。
 
  Set mospace = aCADdoc.ModelSpace 设置mospace为当前图形文档的模型空间。
 
  以上程序段是应用程序初始化的过程,即选择性地启动AutoCAD。如果CAD已经启动则跳此过程,反之则初始化启动CAD。一般对AutoCAD图形文档的操作,主要是与Application、Document、Utility和Model Space等对象发生关系。
 
  Application对象是一系列对象的父对象,可以通过它的属性设置来改变AutoCAD的窗口设置。如下面代码:
 
  aCADapp.Top=100 '设置AutoCAD窗口的位置
 
  aCADapp.Left=200
 
  aCADapp.Height=1000 '调整AutoCAD窗口的大小
 
  aCADapp.Width=800
 
  2.2 Document对象
 
  (1) 对文件的操作
 
  Document对象提供了大多数AutoCAD软件中有关文件的功能,可以通过它在AutoCAD中新建(New)、打开(Open)、输出(Export)、输入(Import)等文件功能操作。编程时先把Document对象设为Application对象的 ActiveDocument属性,以返回当前活动的图形文档。例:
 
  Set aCADdoc=Application.ActiveDocument
 
  请看下面的例子对文件的操作:
 
  Dim Docname As String
 
  Docname = "e:\temp\zk01.dwg"
 
  If Dir(docname) <> "" Then
 
  aCADdoc.Open docname '如果文件存在则打开CAD文件
 
  Else
 
  aCADdoc.new("aCAD") '若不存在则以aCAD.dwt为模板建立一个新文件。
 
  End If
 
  把当前文档存盘则可以用下面的语句:
 
  if docname<>"" then 'docname不存在时存盘
 
  aCADdoc.save
 
  else
 
  msgbox “该文件已经存在!” '提示该文件已经存在
 
  end if
 
  Document对象还提供了两个非常有用的方法—SetVariable 和 GetVariable,通过它们可以得到(用GetVariable)或改变(用SetVariable )AutoCAD的系统变量。
 
  如语句:
 
  aCADdoc.SetVariable "Orthomode", 1 '打开正交模式
 
  dim CADver As String
 
  CADver=aCADdoc.Getvariable("ACADver") '获取AutoCAD的版本号
 
  (2) 对图形实体的操作
 
  图形实体是指所有CAD的图元物体,如点(point)、线(Line)、圆(Circle)、弧(Arc)、文字(Text)等,它们包含于ModelSpace和PaperSpace集合对象中。对实体的操作总要从这两个集合开始,向下查找相应实体所属的方法或属性。而图形实体的操作包括实体的生成、编辑和查询。 ModelSpace与PaperSpace是所有图形实体的集合,因此要取得图中的某一实体,一般采用遍历查找的方法,下面代码是CAD图形实体的生成、编辑实体或查询。
 
  生成一条直线的代码:
 
  Dim lineobj As Object
 
  Dim pt1(0 To 2) As Double
 
  Dim pt2(0 to 2) as double
 
  Pt1(0)=0#
 
  Pt1(1)=0#
 
  Pt1(2)=0#
 
  Pt2(0)=100#
 
  Pt2(1)=50#
 
  Pt2(2)=0#
 
  SetlineObj = moSpace.Addline(pt1,pt2)
 
  ‘画从坐标点pt1至坐标点pt2的直线
 
  改变这条直线的颜色(假设直线实体句柄为"4C")的代码:
 
  Dim tobj As object
 
  Set tobj=aCADdoc.HandletoObject("4C")
 
  tobj.Color=acRed ‘
 
  tobj.Update
 
  查询图形文件中所有实体的实体名、实体句柄、颜色、所在层、线形等参数,如下面的代码所示:
 
  Dim ent As Object
 
  Dim msgStr, NL As String
 
  Dim I as Integer
 
  NL = Chr(13) & Chr(10) ‘回车与换行
 
  I=1
 
  For Each ent in mospace
 
  msgStr = "第" & Format(I) & "个实体信息" & NL & NL
 
  msgStr = msgStr & "实体名: " & ent.EntityName & NL
 
  msgStr = msgStr & "所在层: " & ent.Layer & NL
 
  msgStr = msgStr & "颜色: " & Str(ent.Color) & NL
 
  msgStr = msgStr & "线形: " & ent.Linetype & NL
 
  msgStr = msgStr & "句柄: " & ent.Handle & NL
 
  MsgBox msgStr
 
  I=I+1
 
  Next