admin 管理员组

文章数量: 1087139


2024年3月7日发(作者:java开发小游戏案例)

龙源期刊网

基于AutoCAD的软件移植方法研究

作者:金广坤 李昌华

来源:《现代电子技术》2008年第06期

摘 要:基于AutoCAD的软件是利用AutoDesk开发包二次开发的软件,AutoCAD软件不断升级导致原来开发的应用程序不能运行于新的平台,必须对其进行移植才能达到复用目的。该文就如何进行移植展开分析,对基于AutoLISP,ADS以及ObjectARX的CAD二次开发过程,以及如何结合三者达到快速开发进行研究,构建新的ARX框架。分析如何复用ADS及AutoCAD自定义脚本等,并将3者整合到新的框架下,实现了应用程序在新的AutoCAD平台上的移植。

关键词:ObjectARX;AutoLISP;ADS;移植

中图分类号:TP311 文献标识码:A

文章编号:1004-373X(2008)06-120-03

Research on Transplantation Method of AutoCAD-based Software

JIN Guangkun,LI Changhua

(College of Information & Control,Xi′an University of Architecture & Technology,Xi′an,710055,China)

Abstract:AutoCAD-based software is developed on the Software Development Kit of

D upgrading leads to the developed applications can′t run on the new

reuse them,the developer must transplant the developed article focuses on how to

realize D development based on AutoLISP,ADS and ObjectARX,combination of the three achieves rapid development are researched,ARX frame is built under new

platform,how to reuse ADS and AutoCAD-defined scripts,integrate them into new frame are

expounded,transplantation of original application to new AutoCAD is implemented.

Keywords:ObjectARX;AutoLISP;ADS;transplantation

计算机辅助设计(Computer-Aided Design,CAD)技术的发展非常迅速,在机械、电子、建筑、土木、广告等领域中,CAD技术应用非常广泛。作为CAD 软件中的优秀代表,AutoCAD采用开放式的体系结构,不仅可以用来进行产品设计,而且还可利用二次开发工具,实现产品的参数化设计,并可以针对用户的需求实现产品的二次软件开发,大大提高产品设计的效率[1]。由于AutoCAD版本的不断升级,其开发工具也发生着变化,如果不做修改,原来开发的程序很难使用,如果在新的框架下完全重写,则造成对资源的浪费。

龙源期刊网

1 AutoCAD二次开发过程及关系

作为AutoCAD的二次开发方法,AutoLISP,ADS及OjbectARX在不同的时期发挥着不同的作用。AutoLISP为第一代解释性开发语言,他通过内部进程(IPC)与AuotCAD进行通信。ADS是用C编写,通过外部函数的形式加载到AutoCAD,由AtuoLISP解释器调用,并通过IPC与CAD进行通信。ObjectARX是一种类似于Windows下的DLL的一种C++编译程序,不能单独出现。他与AutoCAD共享地址空间,并能直接调用AutoCAD的核心函数。与通过IPC进行调用的前两者相比,他的运行效率更高。3种开发工具与AutoCAD的互调用关系如图1[2]所示。

2 软件移植问题概述

AutoCAD的二次开发软件对于版本有着严格的要求,不同的版本会出现不兼容现象。如果对原有程序进行移植,首先你须确定实现的移植目标平台,并在此基础上构建新的平台框架;其次考虑如何在新框架下继承原有的程序、资源。

2.1 ObjectARX整体框架构建及移植

本次应用程序的移植使用的平台为微软公司的Visual 2002,测试平台为AutoCAD 2004,开发工具包为Autodesk的ObjectARX SDK 2006。安装开发环境,解压开发包,并将其目录下的ArxWizards进行安装。利用ObjectARX的向导创建ARX应用程序,需要进一步对生成的解决方案进行配置:将上述开发包下的include、lib文件路径配置到解决方案,同时增加额外的,,,库等。当配置完成并生成工程文件后,需要手动为解决方案增加.def文件,并为添加:

EXPORTS

acrxEntryPoint PRIVATE

acrxGetApiVersion PRIVATE

AutoCAD在.Net下的ARX入口函数有了较大的变化:

class CCADProjectApp : public AcRxArxApp {

public:

CCADProjectApp () : AcRxArxApp () {}

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt)

{

龙源期刊网

AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;

return (retCode) ;

}

virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt)

{

AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt)

return (retCode) ;

}

}

以往的消息入口函数acrxEntryPoint及其所包含的switch-case语句都被新的框架下的类及其虚函数所代替,在此框架下可以为应用程序添加一些自定义命令,下面以自定义的命令WALL_BUILD为例讲述ARX命令的编写过程,大致分为3部:

(1) 利用向导,根据需要定义是属于模态(或透明)类型的命令(如图2所示)。

(2)根据在(1)的选择,调用如下的宏命令函数进行注册:

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App,KingArxProject1,wall_build,wall_build,ACRX_CMD_MODAL,NULL)

(3) 根据ARX的产生的WALL_BUILD接口,其所对应的函数实现为KingArxProject1wall_build,其中KingArxProject1为工程名称,接下来为其编写相应的过程。与以往不同,这类的实现函数不能带有返回值,形式化如下:

static void KingArxProject1wall_build(void)

{

//在这里编写自定义函数

}

至此,一个ARX的命令编写过程结束,只需要调用WALL_BUILD命令即可实现对以上函数功能调用。

龙源期刊网

2.2 原有程序ADS及AutoLISP的重利用

程序移植的目的是充分地利用原有资源。由于ADS函数及其经由AutoLISP解释的独特性,在移植过程中对其进行区别对待。ADS函数是当ARX加载到AutoCAD后作为外部函数而调用,其通过消息入口函数为kInvkSubrMsg消息下的 dofun();进而调用ads_defun()[3]进行外部函数的注册,他们都以“c:funname”的固定格式定义名称,其中“c: ”是作为固定标识,funname为真正的函数名称。这是AutoCAD对于其特定的标识。

这些ADS不再采用ads_defun函数进行注册,而是统一采用宏定义函数ACED_ADSCOMMAND_ENTRY_AUTO实现。如对于删除门操作的命令c:delete_door,其所对应的宏注册ACED_ADSCOMMAND_ENTRY_AUTO(ArxProject1App,delete_door,true)

与ARX命令注册不同的是,ADS函数没有本地命令和国际命名,也没有命令的状态区分。

2.3 资源文件管理

资源文件的管理在AutoCAD的二次开发工程中占据着重要的位置。在移植过程中,尽可能地继承其中的菜单资源、工具栏,以及自定义对话框的脚本文件的调用。

AutoCAD包括相当丰富的各类菜单,这些菜单的功能是由菜单文件来定义,他们共同定义和控制菜单区域的外观和功能。菜单文件的类型为:.mnu,.mnc,.mnr,.mns,.mnl,.mnt。其中.mnu,.mns是基本相同的ASCII文件,一个.mns生成后,他将被作为生成.mnc、.mnr的源文件,.mnl是为调用AutoLISP程序而调用的。如果在生成了.mns后改动了.mnu文件,需要AutoCAD的Menu命令重新编译[4],关于菜单文件编写界面的各种格式,这里不再详述。在AutoCAD升级的过程中,自身的资源在表示和标识都有很大的改变。原有的资源表示需要参照所移植平台依次改动,例如【文件】|【打开】的快捷方式中资源需做如下修改:

ID_Open [_Button("打开","ICON_16_OPEN","ICON_24_OPEN")]^C^C_open

修改为:

ID_Open [_Button("打开",RCDATA_16_OPEN,RCDATA_16_OPEN)]^C^C_open

与AutoCAD本身命令表示不同,用户自定义的菜单和工具栏需要指定图标资源,将ARX中自定义的ADS和ARX命令如delete_door等按照定义菜单命令方式写入文件。

尽管AutoCAD利用微软的MFC为ARX应用程序提供强大的图形支持,其自定义的脚本文件DCL(Dialog-box Control Language)编写对话框有着一些独特的优势。由于其不用编译,即便ARX程序整体编译完毕,依然可以对DCL文件进行编辑修改,十分灵活。因为ADS和

龙源期刊网

AutoLISP也可为其编写实现过程,所以无论在ARX程序内部还是AutoCAD的菜单等资源均可实现DCL的调用,在移植的过程中沿用DCL,其调用详见文献[5]。

2.4 外部资源引用相关问题分析

在设计一些自定义命令的图形化接口的过程中,除了利用原有的脚本文件,主要采用MFC类库的开发方式。ObjectARX应用程序可以使用动态或静态的MFC,也可以使用通常的DLL或扩展的DLL[6]。在ARX应用程序与AutoCAD 和其他应用程序使用共享的MFC库时,资源管理变得极为重要。必须清晰地管理应用资源,防止他与AutoCAD或ARX应用程序之间发生资源冲突[1]。在移植的过程中,对使用到基于MFC的扩展DLL资源,在配置的新平台上重新编译后,交付ARX程序调用。清晰的资源设置一般包括以下3步[2,6]:

(1) 在执行任何导致MFC 查找你的资源的步骤时,调用函数AfxSetResourceHandle()将自定义资源设为系统缺省值;

(2) 在将系统资源设为应用资源以前,调用AfxGetResourceHandle()函数获得系统当前资源;

(3) 在执行完任何要求使用自定义资源的函数之后,立刻将系统资源还原为以前保存的资源句柄。

在应用程序对话框命令句柄需调用要求获得AutoCAD资源的AutoCAD API函数(或调用AutoCAD命令)时,首先应当在调用函数项将资源设置为AutoCAD,在执行完毕后再恢复应用程序资源(acedGetAcadResourceInstance()函数可获得AutoCAD的资源句柄)。

2.5 ARX程序调试

在移植的过程中,尽可能多地利用原有资源,如果能完成相应的功能,则尽可能保持代码风格不变。对于ARX和ADS的部分,根据实现的功能,分别按上述方法将他们移植到新的框架下(AutoLISP和DCL的脚本,只需要配置到相应路径即可)。在上述.Net开发环境下进行逐步增量编译,对于因版本等原因出现的问题,参照ObjectARX开发文档及微软的MSDN即可。

与一般的可执行文件不同,ARX不能单独运行,他必须依赖于测试容器AutoCAD 2004,以第三方软件作为容器的测试方法在调试时采用一般采用如下方法:

(1) 直接启动AutoCAD软件;

(2) 选择.net环境下的菜单【工具】|【调试进程】,打开进程对话框;

龙源期刊网

(3) 在可用进程列表中选择,然后点 【附加(A…)】 按钮,出现“附加到进程”对话框,程序类型选Native,确定;

(4) 关闭【进程】对话框,回到AutoCAD界面,加载debug版ARX程序,此时可设断点调试ARX。

3 结 语

通过构建新的框架,并对原有的资源进行整合、移植,实现在AutoCAD基础上开发的应用软件能在当前广泛使用的AutoCAD 2004上加载、运行,达到了软件复用的目的。

参考文献

[1]谭苏.结合ARX与MFC开发AutoCAD应用程序[J].四川建筑,2005,25(6):117-118.

[2]江丽芳.在ARX中运用MFC技术快速开发AutoCAD应用程序[J].重型机械,2005(6):23-26,30.

[3]Autotools工作组.AutoCAD ADS-C程序设计实务[M].北京:清华大学出版社,1995.

[4]郭朝勇.AutoCAD 2002定制与开发[M].北京:清华大学出版社,2002.

[5]邵剑平.DCL对话框设计与应用的研究[J].机械制造与自动化,2005,34(6):122-123.

[6]李长勋.AutoCAD ObjectARX程序开发技术[M].北京:国防工业出版社,2005.

作者简介 金广坤 男,1984年出生,河南固始人,硕士研究生。研究方向为多媒体与网络。


本文标签: 资源 函数 进行 移植 开发