摘 要:基于AutoCAD的軟件是利用AutoDesk開發(fā)包二次開發(fā)的軟件,AutoCAD軟件不斷升級導(dǎo)致原來開發(fā)的應(yīng)用程序不能運行于新的平臺,必須對其進行移植才能達到復(fù)用目的。該文就如何進行移植展開分析,對基于AutoLISP,ADS以及ObjectARX的CAD二次開發(fā)過程,以及如何結(jié)合三者達到快速開發(fā)進行研究,構(gòu)建新的ARX框架。分析如何復(fù)用ADS及AutoCAD自定義腳本等,并將3者整合到新的框架下,實現(xiàn)了應(yīng)用程序在新的AutoCAD平臺上的移植。
關(guān)鍵詞: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 AutoDesk.AutoCAD upgrading leads to the developed applications can′t run on the new platform.To reuse them,the developer must transplant the developed applications.The article focuses on how to realize transplantation.AutoCAD 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
計算機輔助設(shè)計(Computer-Aided Design,CAD)技術(shù)的發(fā)展非常迅速,在機械、電子、建筑、土木、廣告等領(lǐng)域中,CAD技術(shù)應(yīng)用非常廣泛。作為CAD 軟件中的優(yōu)秀代表,AutoCAD采用開放式的體系結(jié)構(gòu),不僅可以用來進行產(chǎn)品設(shè)計,而且還可利用二次開發(fā)工具,實現(xiàn)產(chǎn)品的參數(shù)化設(shè)計,并可以針對用戶的需求實現(xiàn)產(chǎn)品的二次軟件開發(fā),大大提高產(chǎn)品設(shè)計的效率[1]。由于AutoCAD版本的不斷升級,其開發(fā)工具也發(fā)生著變化,如果不做修改,原來開發(fā)的程序很難使用,如果在新的框架下完全重寫,則造成對資源的浪費。
1 AutoCAD二次開發(fā)過程及關(guān)系
作為AutoCAD的二次開發(fā)方法,AutoLISP,ADS及OjbectARX在不同的時期發(fā)揮著不同的作用。AutoLISP為第一代解釋性開發(fā)語言,他通過內(nèi)部進程(IPC)與AuotCAD進行通信。ADS是用C編寫,通過外部函數(shù)的形式加載到AutoCAD,由AtuoLISP解釋器調(diào)用,并通過IPC與CAD進行通信。ObjectARX是一種類似于Windows下的DLL的一種C++編譯程序,不能單獨出現(xiàn)。他與AutoCAD共享地址空間,并能直接調(diào)用AutoCAD的核心函數(shù)。與通過IPC進行調(diào)用的前兩者相比,他的運行效率更高。3種開發(fā)工具與AutoCAD的互調(diào)用關(guān)系如圖1[2]所示。
2 軟件移植問題概述
AutoCAD的二次開發(fā)軟件對于版本有著嚴格的要求,不同的版本會出現(xiàn)不兼容現(xiàn)象。如果對原有程序進行移植,首先你須確定實現(xiàn)的移植目標平臺,并在此基礎(chǔ)上構(gòu)建新的平臺框架;其次考慮如何在新框架下繼承原有的程序、資源。
2.1 ObjectARX整體框架構(gòu)建及移植
本次應(yīng)用程序的移植使用的平臺為微軟公司的Visual Studio.Net 2002,測試平臺為AutoCAD 2004,開發(fā)工具包為Autodesk的ObjectARX SDK 2006。安裝開發(fā)環(huán)境,解壓開發(fā)包,并將其目錄下的ArxWizards進行安裝。利用ObjectARX的向?qū)?chuàng)建ARX應(yīng)用程序,需要進一步對生成的解決方案進行配置:將上述開發(fā)包下的include、lib文件路徑配置到解決方案,同時增加額外的acad.lib,acedapi.lib,rxapi.lib,acge16.lib庫等。當配置完成并生成工程文件后,需要手動為解決方案增加.def文件,并為添加:
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
AutoCAD在.Net下的ARX入口函數(shù)有了較大的變化:
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) ;
}
}
以往的消息入口函數(shù)acrxEntryPoint及其所包含的switch-case語句都被新的框架下的類及其虛函數(shù)所代替,在此框架下可以為應(yīng)用程序添加一些自定義命令,下面以自定義的命令WALL_BUILD為例講述ARX命令的編寫過程,大致分為3部:
(1) 利用向?qū)?,根?jù)需要定義是屬于模態(tài)(或透明)類型的命令(如圖2所示)。
(2)根據(jù)在(1)的選擇,調(diào)用如下的宏命令函數(shù)進行注冊:
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App,KingArxProject1,wall_build,wall_build,ACRX_CMD_MODAL,NULL)
(3) 根據(jù)ARX的產(chǎn)生的WALL_BUILD接口,其所對應(yīng)的函數(shù)實現(xiàn)為KingArxProject1wall_build,其中KingArxProject1為工程名稱,接下來為其編寫相應(yīng)的過程。與以往不同,這類的實現(xiàn)函數(shù)不能帶有返回值,形式化如下:
static void KingArxProject1wall_build(void)
{
//在這里編寫自定義函數(shù)
}
至此,一個ARX的命令編寫過程結(jié)束,只需要調(diào)用WALL_BUILD命令即可實現(xiàn)對以上函數(shù)功能調(diào)用。
2.2 原有程序ADS及AutoLISP的重利用
程序移植的目的是充分地利用原有資源。由于ADS函數(shù)及其經(jīng)由AutoLISP解釋的獨特性,在移植過程中對其進行區(qū)別對待。ADS函數(shù)是當ARX加載到AutoCAD后作為外部函數(shù)而調(diào)用,其通過消息入口函數(shù)為kInvkSubrMsg消息下的 dofun();進而調(diào)用ads_defun()[3]進行外部函數(shù)的注冊,他們都以“c:funname”的固定格式定義名稱,其中“c: ”是作為固定標識,funname為真正的函數(shù)名稱。這是AutoCAD對于其特定的標識。
這些ADS不再采用ads_defun函數(shù)進行注冊,而是統(tǒng)一采用宏定義函數(shù)ACED_ADSCOMMAND_ENTRY_AUTO實現(xiàn)。如對于刪除門操作的命令c:delete_door,其所對應(yīng)的宏注冊ACED_ADSCOMMAND_ENTRY_AUTO(ArxProject1App,delete_door,true)
與ARX命令注冊不同的是,ADS函數(shù)沒有本地命令和國際命名,也沒有命令的狀態(tài)區(qū)分。
2.3 資源文件管理
資源文件的管理在AutoCAD的二次開發(fā)工程中占據(jù)著重要的位置。在移植過程中,盡可能地繼承其中的菜單資源、工具欄,以及自定義對話框的腳本文件的調(diào)用。
AutoCAD包括相當豐富的各類菜單,這些菜單的功能是由菜單文件來定義,他們共同定義和控制菜單區(qū)域的外觀和功能。菜單文件的類型為:.mnu,.mnc,.mnr,.mns,.mnl,.mnt。其中.mnu,.mns是基本相同的ASCII文件,一個.mns生成后,他將被作為生成.mnc、.mnr的源文件,.mnl是為調(diào)用AutoLISP程序而調(diào)用的。如果在生成了.mns后改動了.mnu文件,需要AutoCAD的Menu命令重新編譯[4],關(guān)于菜單文件編寫界面的各種格式,這里不再詳述。在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應(yīng)用程序提供強大的圖形支持,其自定義的腳本文件DCL(Dialog-box Control Language)編寫對話框有著一些獨特的優(yōu)勢。由于其不用編譯,即便ARX程序整體編譯完畢,依然可以對DCL文件進行編輯修改,十分靈活。因為ADS和AutoLISP也可為其編寫實現(xiàn)過程,所以無論在ARX程序內(nèi)部還是AutoCAD的菜單等資源均可實現(xiàn)DCL的調(diào)用,在移植的過程中沿用DCL,其調(diào)用詳見文獻[5]。
2.4 外部資源引用相關(guān)問題分析
在設(shè)計一些自定義命令的圖形化接口的過程中,除了利用原有的腳本文件,主要采用MFC類庫的開發(fā)方式。ObjectARX應(yīng)用程序可以使用動態(tài)或靜態(tài)的MFC,也可以使用通常的DLL或擴展的DLL[6]。在ARX應(yīng)用程序與AutoCAD 和其他應(yīng)用程序使用共享的MFC庫時,資源管理變得極為重要。必須清晰地管理應(yīng)用資源,防止他與AutoCAD或ARX應(yīng)用程序之間發(fā)生資源沖突[1]。在移植的過程中,對使用到基于MFC的擴展DLL資源,在配置的新平臺上重新編譯后,交付ARX程序調(diào)用。清晰的資源設(shè)置一般包括以下3步[2,6]:
(1) 在執(zhí)行任何導(dǎo)致MFC 查找你的資源的步驟時,調(diào)用函數(shù)AfxSetResourceHandle()將自定義資源設(shè)為系統(tǒng)缺省值;
(2) 在將系統(tǒng)資源設(shè)為應(yīng)用資源以前,調(diào)用AfxGetResourceHandle()函數(shù)獲得系統(tǒng)當前資源;
(3) 在執(zhí)行完任何要求使用自定義資源的函數(shù)之后,立刻將系統(tǒng)資源還原為以前保存的資源句柄。
在應(yīng)用程序?qū)υ捒蛎罹浔枵{(diào)用要求獲得AutoCAD資源的AutoCAD API函數(shù)(或調(diào)用AutoCAD命令)時,首先應(yīng)當在調(diào)用函數(shù)項將資源設(shè)置為AutoCAD,在執(zhí)行完畢后再恢復(fù)應(yīng)用程序資源(acedGetAcadResourceInstance()函數(shù)可獲得AutoCAD的資源句柄)。
2.5 ARX程序調(diào)試
在移植的過程中,盡可能多地利用原有資源,如果能完成相應(yīng)的功能,則盡可能保持代碼風(fēng)格不變。對于ARX和ADS的部分,根據(jù)實現(xiàn)的功能,分別按上述方法將他們移植到新的框架下(AutoLISP和DCL的腳本,只需要配置到相應(yīng)路徑即可)。在上述.Net開發(fā)環(huán)境下進行逐步增量編譯,對于因版本等原因出現(xiàn)的問題,參照ObjectARX開發(fā)文檔及微軟的MSDN即可。
與一般的可執(zhí)行文件不同,ARX不能單獨運行,他必須依賴于測試容器AutoCAD 2004,以第三方軟件作為容器的測試方法在調(diào)試時采用一般采用如下方法:
(1) 直接啟動AutoCAD軟件;
(2) 選擇.net環(huán)境下的菜單【工具】|【調(diào)試進程】,打開進程對話框;
(3) 在可用進程列表中選擇acad.exe,然后點 【附加(A…)】 按鈕,出現(xiàn)“附加到進程”對話框,程序類型選Native,確定;
(4) 關(guān)閉【進程】對話框,回到AutoCAD界面,加載debug版ARX程序,此時可設(shè)斷點調(diào)試ARX。
3 結(jié) 語
通過構(gòu)建新的框架,并對原有的資源進行整合、移植,實現(xiàn)在AutoCAD基礎(chǔ)上開發(fā)的應(yīng)用軟件能在當前廣泛使用的AutoCAD 2004上加載、運行,達到了軟件復(fù)用的目的。
參考文獻
[1]譚蘇.結(jié)合ARX與MFC開發(fā)AutoCAD應(yīng)用程序\\[J\\].四川建筑,2005,25(6):117-118.
[2]江麗芳.在ARX中運用MFC技術(shù)快速開發(fā)AutoCAD應(yīng)用程序\\[J\\].重型機械,2005(6):23-26,30.
[3]Autotools工作組.AutoCAD ADS-C程序設(shè)計實務(wù)\\[M\\].北京:清華大學(xué)出版社,1995.
[4]郭朝勇.AutoCAD 2002定制與開發(fā)\\[M\\].北京:清華大學(xué)出版社,2002.
[5]邵劍平.DCL對話框設(shè)計與應(yīng)用的研究\\[J\\].機械制造與自動化,2005,34(6):122-123.
[6]李長勛.AutoCAD ObjectARX程序開發(fā)技術(shù)\\[M\\].北京:國防工業(yè)出版社,2005.
作者簡介 金廣坤 男,1984年出生,河南固始人,碩士研究生。研究方向為多媒體與網(wǎng)絡(luò)。