引言
在工程CAD领域中,各种商用CAD系统层出不穷,如Autodesk公司的AutoCAD系统、Computervision公司的CADDS系统、Dassault公司的Catia系统、EDS公司的Unigraphics系统、HP公司的PE系统、Intergraph公司的I/EMS系统、Matra Datavision公司的Euclid系统、PTC公司的PRO/Engineer系统和SDRC公司的I桪eas系统等等。
由Autodesk公司开发的AutoCAD自20世纪80年代以来一直独领风骚。成为各工程领域首选的CAD系统,是市场上最流行的PC桟AD系统。全世界有80个国家的200万人在使用AutoCAD绘制各种各样的图形。1998年AutoCAD在市场上的占有率达79%,成为事实上的世界范围内的计算机制图标准。
AutoCAD的巨大成功,首先得益于它的开放性,使得第三方很容易开发各种适用的专用软件,给用户带来标准、廉价、方便、高效等益处,从而进一步占领了市场。用户通过对AutoCAD系统的定制开发,可以结合自己的专业特点,开发属于自己的专用型CAD系统。目前,国内开发的工程制图软件大多采用AutoCAD作为其软件支撑平台,进行二次开发而成,为工程设计和制图行业创造了巨大的经济效益和社会效益。
1 定制开发的必要性
AutoCAD是目前Windows95/98/nt/2000环境下应用最广泛、使用人数最多的CAD软件。但是AutoCAD所提供的只是一般的通用的CAD功能,如造型、编辑、注释等。如果不利用AutoCAD开发系统,要想完成某一具体醒目的设计,就会显得较为复杂。例如,我们要设计一台活塞式发动机,就需要根据发动机功率先手工计算出活塞直径,然后再调用AutoCAD的绘图命令,一笔一笔地绘出发动机的图形。这样,一旦在设计完成后,要更改发动机的功率,则需要重复刚才的全部内容。
如果使用AutoCAD开发系统,则我们可以将上述计算和绘图通过高级语言编制相应的程序,在需要设计时,只一个命令便可以运行该程序,计算和绘图过程自动完成。显而易见,这不仅大大提高了设计效率,而且通过开发系统可以定制出某些专业化模块,甚至大型设计绘图软件。国内的建筑行业天正CAD系统、机械行业的大恒CAD系统等,均是对AutoCAD开发定制而实现的。
2 定制开发的常用工具
AutoCAD系统的定制开发工具,又称为AutoCAD开发工具。有时称作AutoCAD API (Application programming Interface 应用编程接口),是将AutoCAD环境客户化的基本手段。在AutoCAD2000中,我们使用的开发工具主要有:ObjectARX、AutoLISP、VisualLISP、Java、VisualBASIC和Delphi等。
2.1 AutoLISP和VisualLISP
AutoLISP是AutoCAD最早的解释型API,它不是面向对象的语言,主要用来自动完成重复性任务,进行客户化开发和编制AutoCAD菜单以及通过简单机制为AutoCAD增加命令。它在逻辑上是一个独立的进程,通过IPC(进程间通讯)与AutoCAD交互。AutoLISP学习起来很简单,但是很难用它来开发大型应用程序,而且形成的程序运行速度比较而言是最慢的。
在AutoCAD R14中,Autodesk公司首次提供了一种新的LISP编程工具梀isualLISP,它是一种面象对象的开发环境,是AutoLISP的扩展和延伸。在AutoCAD 2000中,VisualLISP得到了进一步的加强。作为一种编译型API,与AutoLISP完全兼容,并提供AutoLISP所有功能,同时它能访问AutoCAD2000的多文档设计环境、COM/ActiveX用户界面和事件响应器等。
2.2 VisualBASIC、Delphi 、Java
AutoCAD从R14起,采用ActiveX Automation的形式丰富了自身的API,它为AutoCAD的进一步发展开辟了新的途径。
微软的ActiveX Automation技术是API和一组规范,提供ActiveX Automation服务的软件通过标准用户接口能够开放它的特定功能。AutoCAD 2000中ActiveX Automation提供的编程接口,可以用于在Windows环境下的应用程序操作AutoCAD中的对象。主要操作功能有:用户输入提示、使用优先对象、处理选择集、输出图形、增加视图、增加专业对象等。用户可以使用ActiveX客户编程语言(如VisualBASIC、Delphi 、Java等)来定制AutoCAD。
2.3 ADS、ARX、ADSRX和ObjectARX
ADS(AutoCAD Development System)是Autodesk公司最早在AutoCAD R11中提供的C语言编程环境。除了可以使用标准的C函数外,又增加了专用于对AutoCAD进行操作的函数,形成的可执行文件(EXE文件),装入AutoCAD后即可运行。但是,ADS与AutoLISP一样,内在结构不是面向对象的,使用AutoLISP解释器加载和调用,也是通过IPC与AutoCAD通讯。
ARX(AutoCAD Runtime Extention)是在ADS基础上发展起来的一种面向对象的C语言编程环境。由ADS向ARX的变迁就如同C向C++的转变。ARX应用程序为动态链接库(DLL),共享AutoCAD地址空间,对AutoCAD进行直接调用,避免了IPC的系统开销和由此引起的性能下降。它最早在AutoCAD R13中提供,但是在AutoCAD R14中,ARX很快被第二代面向对象C++编程环境棗ObjectARX所代替,原来的ADS全部库函数被包含在ObjectARX中。ADS全部库函数归并为单一的库,形成了ADSRX。
在AutoCAD 2000中,传统意义上的“ADS开发环境”的概念不复存在,而且ADSRX作为ObjectARX的一个子集。ObjectARX是包含了ADS、ARX和ADSRX的综合的C/C++开发环境。它引入了面向对象的编程机制,在与AutoCAD 2000配套的ObjectARX 3.0中,提供大量类库,而且提供了兼容原来的ADS、ADSRX函数的新函数。ObjectARX 3.0成为了AutoCAD 2000定制开发的高效开发工具。
2.4 几种开发工具的比较
在以上的开发工具中,直接与AutoCAD通讯的API比利用IPC通讯的API在速度上要快。因此,ObjectARX的速度最快,AutoLISP速度最慢。
但是在程序稳定性上,采用AutoLISP开发的应用程序一旦失败,并不危害AutoCAD自身进程。而由于ObjectARX应用程序共享的AutoCAD地址空间,一旦失败,AutoCAD进程也随之崩溃。
ObjectARX应用程序在运行期间实时扩展AutoCAD,共享AutoCAD地址空间,性能无比强大,甚至为所欲为,以至于AutoCAD自身的许多模块均是用ObjectARX制作。
在技术难度上,AutoLISP和VisualBASIC均为解释型语言,方便易学,开发周期短。许多程序员在使用它们。相比之下,ObjectARX依赖于C++语言,它必须经过严格控制的编译、链接才能生成程序,开发人员必须有足够的编程经验才能处理开发中的各种问题。但是,在开发速度和性能要求都很高的应用程序或者大型CAD应用软件,应使用ObjectARX。
3 定制开发的主要内容和方法
AutoCAD2000定制开发的内容很多,但最主要的是:脚本文件(SCR文件)定制、菜单文件定制、AutoCAD命令的定制。
3.1脚本文件(SCR文件)定制
AutoCAD提供了一个叫script file(脚本文件)的工具,它允许不同的AutoCAD命令组合起来,并按照预先确定的顺序执行。这些命令可以用任何一种文字编辑器(如Notepade、记事本等)编写成文本文件,其扩展名为.SCR(如PLOT1.SCR)。脚本文件用AutoCAD中的SCR命令来执行。
用户在对AutoCAD进行开发时,可以使用任何一种高级语言(如:VC、VB、Delphi、Java等)设计用户交互界面,对绘图所需要参数进行计算生成,然后确定AutoCAD命令、命令选项、命令序列等,最后生成扩展名为SCR的AutoCAD脚本文件。在AutoCAD中用SCR命令来执行脚本文件,完成所需操作。
脚本文件具有AutoCAD的所有功能,包括图形初试化、编辑、修改、绘图、输出等。但脚本文件有一些限制,它不能使用对话框和菜单,当从脚本文件中发出打开文件、文件存盘、打印等命令时, AutoCAD执行命令行中的命令含义而不打开对话框,无法提供用户交互功能。
运用脚本文件定制AutoCAD,需要(只需要)熟悉一门高级编程语言和AutoCAD常用命令、命令选项及命令序列即可。此方法,对编程技术要求不高,简单实用。它曾经作为最原始的定制开发手段,一直保留至今。实践证明,它可以取得很好的令人满意的效果。目前,仍有许多应用软件还在使用这项技术。
下面是利用VC生成的一个脚本文件的片段,从中可以看出CAD命令序列的使用规律。
……………LIMITS 0,0 3775.8,3110ZOOM AUNITS 2 0 1 0 0 YBLIPMODE OFFLAYER N 1,2,3,4,5,6,7,8,9,10 UNITS 2 0 1 0 0 YSTYLE HZ complex,HZDX 0 1 0 N N NTRACE 6 250,50 3425.8,503425.8,2760 250,2760 250,50TEXT 300,70 40 0 荣军岩土软件工作室LINE1637.9,2450 @400,0TEXT 390,2500 40 0 工程名称:…………… 3.2 ACAD.PGP文件定制AutoCAD软件带有程序参数文件ACAD.PGP,该文件分为三个部分:注释、外部命令、命令别名。
文件中的注释可以包含任何数目的注释行,并且可以出现在文件任何地方。每一个注释行用(;)开头。任何用分号开头的句子在执行时都被忽略。
ACAD.PGP允许用户从图形编辑器中直接使用操作系统命令。例如:想要删除一个文件,只需要在命令行输入DEL (COMMAND:DEL),然后根据提示输入需要删除的文件名。
ACAD.PGP定义了一些AutoCAD命令的别名。例如,LINE命令的别名是L。如果在命令行输入L (COMMAND:L),AutoCAD将把它当作LINE命令。
用户根据自己使用需要,定制ACAD.PGP文件,扩充操作系统命令和AutoCAD命令别名。
3.3 ACAD菜单文件定制
AutoCAD软件提供了一个定制AutoCAD的强大工具。AutoCAD软件带有一个名为ACDA.MNU的标准菜单文件。在启动AutoCAD时,ACDA.MNU菜单文件自动装载。菜单文件中包含AutoCAD命令,用户可以修改、排列这些常用命令。它允许用户删除不常用的命令,并定义新的命令,通过编辑ACDA.MNU菜单文件或者编写新的菜单文件来实现。可以为每一个应用程序编写一个单独的菜单文件。使用AutoCAD的MENU命令,可以随时装载这些菜单。
菜单文件的扩展名为MNU,可以用任何文本编辑器进行编辑。菜单文件中可以定制屏幕菜单、下拉菜单、工具条、快捷菜单、上下文菜单、图像菜单等内容。
用户开发过程中,可以参照标准菜单文件ACAD.MNU编写自己的专用菜单文件。
3.4 定制AutoCAD命令
根据用户特定专业领域的问题,采用上述开发工具通过编程,定制自己的AutoCAD专用功能模块。
3.4.1 AutoLISP、VisualLISP开发工具
使用AutoLISP或者VisualLISP开发工具开发出的应用程序,其扩展名为LSP。在一个LISP程序文件中可以有一个或者多个函数定义。要运行其中一个函数,定义该函数的LISP程序文件必须被装载。用下面命令装载一个LISP程序文件:
Command:(load “[path]file name”)其中:Command…………AutoCAD命令提示符。load ……………… 调入一个LISP程序文件。file name………… LISP程序文件的路径和文件名。装载LISP程序文件后,可以在命令行状态下输入函数名,完成所需特定操作。3.4.2 ObjectARX开发工具使用ObjectARX开发工具开发出的应用程序,其扩展名为ARX。在一个ObjectARX程序文件中可以注册一个或者多个AutoCAD命令。要运行其中的AutoCAD命令,定义该命令的ObjectARX程序文件必须被装载。用下面命令装载一个ObjectARX程序文件:
Command:(arxload “[path]file name”)其中:Command…………AutoCAD命令提示符。arxload ……………调入一个ObjectARX程序文件。file name………… ObjectARX程序文件的路径和文件名。其他几种开发工具定制AutoCAD命令的方法基本上与上述方法类似,详细内容,可以参见有关书籍,本文不再赘述。4、应用举例
笔者通过绘制一个简单排水沟剖面图的例子,介绍在VisualC++6.0环境下,创建基于MFC(Microsoft Foundation Class)的用户界面,生成一个ObjectARX应用程序的过程。此程序注册了一个AutoCAD命令 4.1 ObjectARX软件获得与安装
ObjectARX软件不随AutoCAD 2000发行盘一起发行,而由Autodesk的产品供应商来提供,用户可以在Autodesk的网址自由下载(http://www.autodesk.com)。下载后得到一个ObjectARX.exe文件,该文件约19MB,是一个自解压的压缩文件。
在Windows环境中双击下载所得到的ObjectARX.exe文件,此文件会自动解压缩到用户指定的目录(缺省为C:)。解压后,运行它提供的安装程序Setup.exe,将它安装到指定的目录(缺省为C:ObjectARX 2000)。安装后,ObjectARX 3.0约占52MB硬盘空间。
4.2 运行ObjectARX软件的软硬件环境
·Windows 9X/NT4/2000
·AutoCAD 2000
·Microsoft Visual C++6.0或更高版本
因为开发出的应用程序要在AutoCAD 2000环境下运行,因此运行ObjectARX应用程序所需要硬件环境同AutoCAD 2000,最低配置为:
·Pentium 90 CPU
·32MB内存
·150MB硬盘自由空间
·60MB虚拟内存
4.3 建立ObjectARX应用程序的基本过程
·按照ObjectARX的要求设置Visual C++工作环境
·在Visual C++中编辑应用程序(包括CPP、DEF、RC等文件)
·编译链接生成以ARX为扩展名的DLL文件
·进入AutoCAD 2000,装载ObjectARX应用程序到内存
·运行在源程序中定义的AutoCAD 2000外部命令
下面给出源程序中的片段:
…………
// This is command PSG
void zrjzrjpsg()//画排水沟
{
// TODO: Implement the command
CPsg dlg;
ads_point pt,pt1,pt2,pt3,pt4,pt5,pt6;
char s[40];
if(dlg.DoModal()==IDOK)
{
acedGetPoint(NULL,"选择绘制排水沟位置:",pt);
pt1[X]=pt[X]+dlg.m_fH*dlg.m_iScale/dlg.m_fScale;
pt1[Y]=pt[Y];
pt1[Z]=pt[Z]=0;
pt2[X]=pt1[X]+(dlg.m_fL1-dlg.m_fL2)*dlg.m_iScale/(2*dlg.m_fScale);
pt2[Y]=pt1[Y]-dlg.m_fH*dlg.m_iScale/dlg.m_fScale;
pt2[Z]=pt1[Z]=0;
pt3[X]=pt2[X]+dlg.m_fL2*dlg.m_iScale/dlg.m_fScale;
pt3[Y]=pt2[Y];
pt3[Z]=pt2[Z]=0;
pt4[X]=pt1[X]+dlg.m_fL1*dlg.m_iScale/dlg.m_fScale;
pt4[Y]=pt1[Y];
pt4[Z]=pt1[Z]=0;
pt5[X]=pt4[X]+dlg.m_fH*dlg.m_iScale/dlg.m_fScale;
pt5[Y]=pt4[Y];
pt5[Z]=pt4[Z]=0;
pt6[X]=(pt2[X]+pt3[X])/2;
pt6[Y]=pt2[Y]-20*dlg.m_iScale;
pt6[Z]=pt2[Z]=0;
sprintf(s,"%2.0f",dlg.m_fHeight);
acedCommand(RTSTR,"LINE",RTPOINT,pt,RTPOINT,pt1,RTPOINT,pt2,RTPOINT,pt3,RTPOINT,pt4,RTPOINT,pt5,RTSTR,"",0);
acedCommand(RTSTR,"LINE",RTPOINT,pt4,RTPOINT,pt5,RTSTR,"",0);
acedCommand(RTSTR,"TEXT",RTSTR,"J",RTSTR,"C",RTPOINT,pt6,RTSTR,s,RTSTR,"0",RTSTR,dlg.m_sText,0);
}
else ads_printf("取消绘制排水沟");
}
…………
编译链接生成以ARX为扩展名的DLL文件,进入AutoCAD 2000,装载ObjectARX应用程序到内存,运行在源程序中定义的AutoCAD 2000外部命令“psg”,运行正常,结果令人满意。
5 结论
从上可以看出AutoCAD 2000定制开发的必要性和优越性,用户可以根据自己的情况,选择适合的开发工具,通过对AutoCAD的定制开发,开发出属于自己的AutoCAD系统,从而使系统更高效运转,发挥更大的经济效益。随着计算机技术的不断发展,技术人员素质的不断提高,AutoCAD定制开发技术在工程制图中的应用将会得到更快更好的发展。




