AutoCAD开发工具综述

摘要:综合分析了AutoCAD的几种开发工具及其特点,并提供了部分简单实例代码,使从事AutoCAD开发的人员对AutoCAD的开发工具有一个全面的认识。
随着CAD技术的发展,CAD领域的支挣软件也越来越多,国内外许多公司相继推出了其主导产品,Autodesk公司是目前世界上比较成功的CAD领域的开发商,其开发的AutoCAD一直是CAD市场中的主流产品,随着AutoCAD的日益普及,在其上进行二次开发的工具也相继由该公司推出。许多企业购进AutoCAD软件,并非只是用作“代替图板”。只有真正地在其上实现了二次开发,才能充分发挥AutoCAD作用。到目前为止,Autodesk公司提供了4种主要的二次开发工具:AutoLisp(VisuaLisp)、ADS、ObjectARX及VBA(VB)。本文就此向大家分别做一介绍。

1 AutoLisp语言

Lisp语言是一种表处理语言,是广泛应用于人工智能的语言。AutoLisp语言完全嵌套在AutoCAD内部,同AutoCAD有机地结合成一体它既具备一般高级语言的基本结构和功能,又具备一般高级语言所没有的图形处理能力AutoLisp可直接调用几乎全部AutoCAD的命令,从而进行AutoCAD的二次开发。利用AutoLisp开发AutoCAD的一个典型例子就是实现参数化绘图的程序设计。
AutoLisp具有如下特点:

  1. AutoLisp语言是一种以解释方式运行于AutoCAD内部的解释性程序设计语言。
  2. AutoLisp没有语句概念或其他语法结构,程序非常简明。它的所有成分都是以函数形式给出的。执行AutoLisp程序就是执行一些函数,然后再调用其他函数。
  3. AutoLisp把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行。
  4. AutoLisp语言中的程序运行过程就是对函数的求值过程,在对函数求值的过程中实现函数的功能。
  5. AutoLisp语言的主要控制结构采用递归方式。递归方式的使用,使程序简单易懂。
VisuaLisp是AutoLisp的发展,它利用可视化的编程环境为学习减小难度。它的特点可以归纳出十几条,但基本上是可视化与Autolisp的结合,不再列出。
这里给出用AutoLisp绘制键槽的一个小程序,可以看出其简明性:
(defun C:LWX()

(setq a(getrcal “a=”))

(setq b(getreal “b=))

(setq pO(getpoint “Enter start point:”))

(setq r(getreal “r=”))

(setq x(car p0) y(cadr p0))

(setq xe(- x (/ a 2.0)))

(setq ye(+ y (sqrt(- (* r r) (*a a 0.25)))))

(sctq ce(list xe ye))

(setq p1(list(- x a) y))

(setq p2(list(- x a)(- y b)))

(setq p3(list x (- y b)))

(command “pline” p0 “a” “ce” ce p1 “1” p2 p3 “c”)

)
执行这段程序,输入a,b,r的值,即可绘出键槽。

2 ADS(AutoCAD Development System)开发系统

ADS是从AutoCAD R11开始引入的基于C语言开发应用程序的系统。ADS不是C语言的一个子集,也不是基于C而编制的专用语言(如Microstation的MDL),但它包括了C的全部功能。它对开发人员C语言要求较高,C是编译型语言,功能强大,因此ADS很轻易地克服了AutoLisp所固有的许多缺点而具有速度快,安全性高的特点。ADS不包含于AutoCAD内部,而是作为一组AutoLisp外部函数由AutoLisp解释器装入、解释并请求AutoCAD运行。其特点如下:

  1. ADS程序是一个可执行文件,需要通过AutoLisp和AutoCAD进行通讯。
  2. ADS程序更“绝缘”,ADS程序是一系列独立的过程,程序崩溃并不一定导致AutoCAD系统崩溃(尽管并不总是如此)。
  3. ADS程序是不可重复加载的。
  4. ADS程序的运行过程类似于宏(macro)。ADS中的函数(如ads_command)以及与AutoLisp的通讯使ADS程序的工作过程类似于自动作用的宏。
  5. ADS仍然只能使用传统的C语言进行编程,只能采用传统的结构化编程方式。
早期国内常见的应用软件多是用ADS进行开发的,但ADS程序必须经过AutoLisp解释加载,因此ADS的各方面性能受到限制。同时,随着网络技术的迅速发展,面向过程的ADS己有些力不从心了,所以,在AutoCADR13中提供了面向对象的开发工具ARX。有关ADS的实例代码,因与ARX类似(比如ADS中的对象名称ads_name就和ARX中的AcDbObjectld是等价的)这里不再给出。

3 ObjectARX( AutoCAD Runtime Extension)开发系统

近几年广为应用的ObjectARX是从AutoCADR13开始推出的一个全新的面向对象的开发环境,是AutoCAD提供的第一个面向对象的开发工具。它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速访问AutoCAD图形、数据库。ObjectARX支持面向对象编程方法,同时向下兼容ADS。它的特点是很明显的:

  1. ARX程序在很多方面与ADS程序和AutoLisp程序都不相同。最重要的一点是,ARX程序实质上是一个动态链接库(DLL),它和AutoCAD共享地址空间并且直接和AutoCAD进行通讯。在ARX中,每个命令都有独立的入口。ARX程序还可以创建新的类(class),这些类可以为其他程序所共享,从而充分利用面向对象的编程的优点.ARX程序创建的实体和AutoCAD的内在实体几乎是完全等同的。
  2. 对于需要经常和AutoCAD通讯的应用程序来说,ARX程序比ADS程序运行速度更快,这里的运行速度主要指是访问AutoCAD数据库的速度。但ARX更“脆弱”,’ARX程序和AutoCAD共享进程空间,ARX程序崩溃通常会导致AutoCAD系统的崩溃.
  3. 相比之下,ARX程序是比宏更基本的程序。主程序(AutoCAD)可调用每个由ARX程序注册的命令。
  4. ARX程序具有ADS程序和AutoLisp程序所不具备的访问和控制AutoCAD的能力。ARX程序可以监控和处理AutoCAD各种事件,可以定义AutoCAD命令,包括可以透明执行的命令。这些命令可以像AutoCAD自身的命令一样被AutoLisp和ADS所调用.
  5. ARX提供了面向对象的编程技术,面向对象的编程技术己经成为软件开发的主流技术。ARX可充分支持C++,充分支持面向对象编程技术.
  6. 对于ARX编程,Autodesk公司建议使用VisualC++4.2及以上版本的开发环境,这一点对于语言的学习要求较高。这里给出直线绘制函数的部分代码:
    void myLine(AcGcPoint3d.AcGePoint3d Pt2)

    {AcDbLine * pline=new AcDbLine(Pt1,Pt2):

    AcDbBlockTable * pBlockTable:

    AcdbCurDwg()->getBlockTable(pBlockTable.AcDb::kForRead);

    AcDbBlockTableRecord * pBlockTableRecord;

    pBlockTable->getAt(ACDB MODEL_SPACE pBlockTableRecord,AcDb::kForWrite);

    pBlockTable->close();

    AcDbObjectld lineld;

    pBlockTableRecord->appendAcDbEntity(lineld,pline):

    pBlockTableRecord->closc();

    pLine->close();}

    4 VBA (Visual Basic for Application)和VB

    作为从AutoCADR14之后提供的二次开发工具VBA(VB),使渴望CAD编程的人有一个更好的选择,用户不必学习ADS,ARX和AutoLisp就可以用VBA(VB)来开发AutoCAD,Autodesk公司从R14开始内置了VBA开发工具,同时提供了适于VBA(VB)开发的ActiveXAutomation对象模型。VBA(VB)的主要特点如下:

    1. VBA最早是内嵌在Ofice97中的一种编程语言,它易学易用,功能强大。所以Autodesk公司从Rl4之后把它也嵌入了AutoCAD中。
    2. VBA(VB)可以利用ActiveX Automation提供的接口访问和控制AutoCAD所有图形对象和非图形对象,并且可以访问这些对象的方法和属性。
    3. VBA(VB)数据类型丰富、界面友好。
    4. VBA是内嵌在AuLoCAD中的一种编程语言,对平台有依赖性,但VB对此有改善。
    5. 正如ADS需要C语言做基础一样,VBA(VB)开发AutoCAD也必须以熟悉VB语言为前提。
      这里同样给出一段直线的绘制程序。用VBA编制如下:
      Dim stpt, enpt As Variant
      Dim prom
      pt1,prom
      pt2 As String
      Dim startpoint (1 To 3) As Double
      Dim endpoint (1 To 3) As Double
      Dim lineobj As Acadline
      prom
      pt1 = NL & “起点:”
      prom
      pt2 = NL & “终点:”
      stpt = ThisDrawing.Utility.GetPoint(,prom
      pt1)
      enpt = ThisDrawing.Utility.GetPoint(stpt, prom
      pt2)
      startpoint(1) = stpt(0)
      startpoint(2) = sptt(1)
      startpoint(3) = stpt(2)
      endpoint(1) = enpt(0)
      endpoint(2) = enpt(1)
      endpoint(3) = enpt(2)
      Set lineobj = ThisDrawing.ModelSpace.AddLine(startpomt,endpoint)
      用VB对AutoCAD开发与VBA的主要区别是当前图形对象的引用方法不同。VB中对象的获得要使用Getobject()和CreatObject()函数,从而有效地启动和切换AutoCAD窗口,具体代码如下:
      Public acadDoc As Object
      Public ModSpace As Object
      Public acadApp As Object
      On Error Resume Next 出错处理
      Set acadlApp = Get Object(,”AutoCAD.Application”)
      If Err Then
      Err.Clear
      Set =cadlApp=CreateObject(“AutoCAD.Application”)
      If Err Then
      MsgBox Err.Des
      cription
      Exit sub
      End If
      End If
      AcadApp.Visible=True
      Set acadDoc = acadApp.Activedocu
      ment
      Set ModSpace = acadDoc.ModelSpace

      接下来绘制直线的代码与VBA基本相同,只要把ThisDrawing换成acadDoc即可。
      总之,通过以上分析可以看出AutoLisp仍然是AutoCAD的基本开发手段,它适十一般开发者用于较为简单交互性程序的开发。ADS将逐步被更为完善的ARX所取代。VBA则成为AutoCAD用户二次开发的另一支生力军。AutoCAD提供的开发手段让各类开发者都能有适合于自己的开发工具。

作者:西部车床,如若转载,请注明出处:https://www.lathe.cc/2023/12/6967.html