您當(dāng)前的位置:主頁>>AutoCAD>>AutoCAD二次開發(fā)  
           使用VisualC 創(chuàng)建ARX程序

     本節(jié)通過一個(gè)簡(jiǎn)單的實(shí)例來講述ARX程序的創(chuàng)建過程,介紹編制ObjectARX程序的一些基本ARX程序與進(jìn)行通訊的方式。如同學(xué)習(xí)其它計(jì)算機(jī)語言一樣,我們首先來創(chuàng)建一個(gè)最簡(jiǎn)單的ARX程序—“Hello.ARX”,在AutoCAD2002中加載并運(yùn)行該程序,將會(huì)在命令行出現(xiàn)-“Hello,ObjectARX!”。
      1.1 建立ARX程序的基本步驟
  由于ARX程序是一種可以共享AutoCAD地址空間并對(duì)AutoCAD進(jìn)行直接調(diào)用的動(dòng)態(tài)鏈接庫,因此應(yīng)該按照下列基本步驟建立ARX程序:
(1)創(chuàng)建自定義類來實(shí)現(xiàn)新的命令:用戶可以從ARX類層次關(guān)系中的大多數(shù)類和符號(hào)表類中派生自己的類。
(2)決定ARX程序應(yīng)該響應(yīng)的AutoCAD消息:AutoCAD通過向ARX程序發(fā)出一系列的消息指明在它內(nèi)部發(fā)生的特殊事件,ARX程序必須對(duì)其中的某些消息作出反映,并觸發(fā)相應(yīng)的操作。
(3)實(shí)現(xiàn)應(yīng)用程序與AutoCAD通信的入口:AutoCAD通過函數(shù)acrxEntryPoint()來調(diào)用ARX程序,而不是象普通的C 程序那樣使用main()函數(shù)。函數(shù)acrxEntryPoint()中可以用switch語句處理AutoCAD的各種返回信息,根據(jù)不同信息執(zhí)行不同的函數(shù),并返回狀態(tài)碼。如果針對(duì)特定的消息返回出錯(cuò)代碼,則必須用case語句來處理。最后,必須用AcRx::kRetOk作為函數(shù)acrxEntryPoint()的最終返回值。
(4)完成ARX程序的初始化:用戶必須在acrxEntryPoint()函數(shù)的AcRx::kInitAppMsg事件中或者該事件調(diào)用的函數(shù)(例如:initApp()函數(shù))中,對(duì)程序中自定義的所有類進(jìn)行初始化,然后調(diào)用acedRegCmds->addCommand()函數(shù)在AutoCAD命令堆棧中注冊(cè)新命令。
(5)實(shí)現(xiàn)卸載(Unload)功能:用戶必須在acrxEntryPoint()函數(shù)的AcRx::kUnloadAppMsg事件中或者該事件調(diào)用的函數(shù)(例如:unloadApp()函數(shù))中,調(diào)用acedRegCmds->removeGroup()函數(shù)將initApp()函數(shù)中注冊(cè)的新命令組從AutoCAD命令堆棧中清除,調(diào)用deleteAcRxClass()函數(shù)清除程序中自定義的任何類,然后刪除所有由應(yīng)用程序添加到AutoCAD中的對(duì)象,并清除所有與AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor對(duì)象相關(guān)聯(lián)的事件反應(yīng)器。
   注意缺省情況下,ARX程序處于被鎖定狀態(tài)而不能被卸載,如果要使ARX程序可以被卸載,需保存由AcRx::kInitAppMsg傳送的appId參數(shù),由unlockApplication()函數(shù)調(diào)用,見acrxEntryPoint()函數(shù)注釋。
        1.2 AutoCAD與ARX程序之間的消息傳遞
    AutoCAD向ARX程序發(fā)送四類消息:
(1)發(fā)送給所有ARX程序的消息:kInitAppMsg、kUnloadAppMsg、kLoadDwgMsg、kPreQuitMsg。
(2)只發(fā)送給通過調(diào)用acedDefun()函數(shù)注冊(cè)AutoLISP函數(shù)的ARX程序的消息:kUnloadDwgMsg、kInvkSubrMsg、kEndMsg、kQuitMsg、kSaveMsgkCfgMsg。
(3)只發(fā)送給注冊(cè)service對(duì)象的ARX程序的消息:kDependencyMsg、kNoDependencyMsg。
(4)只發(fā)送給使用ActiveX控件對(duì)象的ARX程序的消息:kOleUnloadAppMsg。
普通的ARX程序僅需要響應(yīng)消息kInitAppMsg和kUnloadAppMsg,這兩種消息的含義和ARX程序?qū)λ鼈兊捻憫?yīng)方式為:
(1)消息kInitAppMsg:當(dāng)AutoCAD加載ObjectARX應(yīng)用程序并開始進(jìn)行與應(yīng)用程序的通信時(shí)發(fā)送此消息。
對(duì)于此消息,ARX程序應(yīng)該注冊(cè)服務(wù)對(duì)象、類、AcEd命令和事件反應(yīng)器,以及AcRxDynamicLinker類事件反應(yīng)器,初始化應(yīng)用程序的系統(tǒng)資源(如設(shè)備、窗口),并執(zhí)行簡(jiǎn)單的初始化操作;這時(shí),AcRx、AcEd和AcGe類庫都應(yīng)該被激活;如果需要對(duì)應(yīng)用程序進(jìn)行解鎖或重新加鎖操作,還應(yīng)該保存pkt參數(shù)。
但是這里不能進(jìn)行下列操作:初始化設(shè)備驅(qū)動(dòng)程序、激活用戶界面資源、按特殊順序加載應(yīng)用程序、執(zhí)行AutoLISP程序以及打開任何數(shù)據(jù)庫,否則將導(dǎo)致錯(cuò)誤發(fā)生或者系統(tǒng)崩潰;AcDb和AcGi類庫也不能在這里激活,盡管它們與AcRx和其它結(jié)構(gòu)有聯(lián)系。
(2)消息kUnloadAppMsg:當(dāng)ObjectARX程序被卸載時(shí)(由用戶卸載或者AutoCAD程序終止時(shí)),AutoCAD發(fā)送此消息,關(guān)閉當(dāng)前文件并執(zhí)行清除操作。
對(duì)于此消息,ARX程序應(yīng)該清除所有系統(tǒng)資源,所有對(duì)kInitAppMsg消息所做的初始化等工作都應(yīng)該在這里被終止或者析構(gòu)。AutoCAD不會(huì)自動(dòng)解除初始化所做的工作。
           1.3 實(shí)例 :最簡(jiǎn)單的ARX程序——“Hello.ARX”
    Hello.ARX是最簡(jiǎn)單的ARX程序,但是麻雀雖小,五臟俱全,它是進(jìn)一步學(xué)習(xí)編寫復(fù)雜程序的基礎(chǔ),現(xiàn)在請(qǐng)大家和我來一步步的完成它,具體過程如下:
Step1 :創(chuàng)建工程
(1)運(yùn)行VisualC 6.0,選擇菜單命令【File】→【New…】,彈出“New”對(duì)話框。
(2)在“New”對(duì)話框中選擇“Projects”選項(xiàng)卡。
(3)在“Projects”選項(xiàng)卡中選擇“Win32Dynamic-LinkLibrary”項(xiàng)。
(4)輸入程序名稱“Hello”和存放目錄,并確認(rèn)“Platforms:”內(nèi)選中“Win32”。
(5)完成以上步驟后(如圖38-2所示),單擊OK按鈕,并在下一提示對(duì)話框中單擊Finishig按鈕來建立一個(gè)空的DLL工程。

Step2 :建立源文件“Hello.cpp”
(1)選擇菜單命令【File】→【New…】,彈出“New”對(duì)話框。
(2)在“New”對(duì)話框中選擇“Files”選項(xiàng)卡。
(3)在“Files”選項(xiàng)卡中選擇“C SourceFile”項(xiàng)。
(4)輸入源文件名稱“Hello.cpp”和存放目錄,確認(rèn)“Addtoproject:”項(xiàng)被選中,并選擇加入的工程為“Hello”。
(5)完成以上步驟后(如圖38-3所示),單擊OK按鈕確定。

(6)在VisualC 的工作窗口中輸入源文件“Hello.cpp”的內(nèi)容并保存,程序清單如下:
//Hello.cpp
#include<rxregsvc.h>
#include<aced.h>
#include<adslib.h>
//執(zhí)行函數(shù),在AutoCAD中執(zhí)行Hello命令時(shí)被調(diào)用
voidHello()
{
acutPrintf("Hello,ObjectARX!");
}
//初始化函數(shù)
//在acrxEntryPoint()函數(shù)的kInitAppMsg事件中被調(diào)用,
//向AutoCAD命令堆棧中添加新命令組以及ACRX類層次
//中添加新的自定義類,本實(shí)例中無自定義類,故不用初始化新類
voidinitApp()
{
//顯示提示信息
acutPrintf("\n初始化函數(shù)\n");
//addCommand函數(shù)在AutoCAD命令堆棧中注冊(cè)
//新的命令組名“HelloARX_COMMANDS”、
//通用命令名“Hello”、
//本地命令名“Hello”和該命令的執(zhí)行函數(shù)Hello()
acedRegCmds->addCommand("HelloARX_COMMANDS","Hello","Hello",
ACRX_CMD_MODAL,Hello);
}
//程序卸載函數(shù)
//在acrxEntryPoint()函數(shù)的kUnloadAppMsg事件中被調(diào)用
//從AutoCAD命令堆棧清除已添加的命令以及從ACRX類層次中清除自定義類
voidunloadApp()
{
//顯示提示信息
acutPrintf("\n卸載函數(shù)\n");
//從命令堆棧中清除命令組“HelloARX_COMMANDS”
acedRegCmds->removeGroup("HelloARX_COMMANDS");
}
//ARX程序主函數(shù)
//與AutoCAD通信的入口,處理AutoCAD發(fā)送的各類消息
extern"C"AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCodemsg,void*appId)
{
switch(msg){
caseAcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
//調(diào)用initApp()函數(shù)
initApp();
break;
caseAcRx::kUnloadAppMsg:
//調(diào)用unloadApp()函數(shù)
unloadApp();
}
returnAcRx::kRetOK;
}
Step3 :建立源文件“Hello.def”
重復(fù)Step2中步驟,建立源文件“Hello.def”,
程序內(nèi)容如下:
LIBRARYHelloARX
DESCRIPTION'ThesimplestObjectARXsampleprogram-Hello'
EXPORTS
acrxEntryPointPRIVATE
acrxGetApiVersionPRIVATE
Step4 :設(shè)置ObjectARX文件路徑
(1)選擇菜單命令【Tools】→【Options…】,彈出“Options”對(duì)話框。
(2)在“Options”對(duì)話框中選擇“Directories”選項(xiàng)卡。
(3)在“Showdirectoriesfor:”下拉列表中選擇“Includefiles”項(xiàng)。
(4)在“Directories:”列表的空白項(xiàng)中添加ObjectARX中“Inc”目錄的路徑(如圖38-4所示)。

(5)在“Showdirectoriesfor:”下拉列表中選擇“Libraryfiles”項(xiàng)。
(6)在“Directories:”列表的空白項(xiàng)中添加ObjectARX中“Lib”目錄的路徑(如圖38-5所示)。

Step5 :ObjectARX工程設(shè)置

(1)選擇菜單命令【Project】→【Settings…】,彈出“ProjectSettings”對(duì)話框。
(2)在“ProjectSettings”對(duì)話框中選擇“SettingFor:”下拉列表的“AllConfigurations”項(xiàng)。
(3)在“ProjectSettings”對(duì)話框中選擇“C/C ”選項(xiàng)卡。
(4)在“Category:”下拉列表中選擇“CodeGeneration”項(xiàng)。然后選中“Userun-timelibrary”下拉列表中的“MultithreadedDLL”選項(xiàng)(如圖38-6所示)。再在“Category:”下拉列表框中選擇“Preprocessor”項(xiàng),然后在“Preprocessordefinitions:”編輯框中內(nèi)容的后面添加“ACRXAPP,RADPACK”,表示需要預(yù)鏈接的庫(如圖38-7所示)。
(5)在“ProjectSettings”對(duì)話框中選擇“Link”選項(xiàng)卡。
(6)在“Category:”下拉列表中選擇“General”項(xiàng),然后在“Outputfilename:”編輯框中鍵入應(yīng)用程序名“.\HelloARX.arx”(圖38-8);在“Object/librarymodules:”編輯框中添加“acutil15.libacrx15.libacdb15.libacedapi.librxapi.libacad.libacge15.lib”;在“Category:”下拉列表框中選擇“Output”項(xiàng),然后在“Baseaddress:”編輯框中鍵入“0x1c000000”(圖38-9)。

(7)完成上述步驟后,單擊OK按鈕確定設(shè)置。
Step6 :編譯和建立ARX程序
選擇菜單命令【Build】→【BuildHelloARX】,編譯和建立Hello.arx程序。
Step7 :加載并運(yùn)行ARX程序
(1)在AutoCAD2002環(huán)境中,選擇菜單命令【Tools(工具)】→【LoadApplication…(加載應(yīng)用程序)】,彈出“Load/UnloadApplications(加載/卸載應(yīng)用程序)”對(duì)話框。
(2)選中“Hello.arx”文件,單擊Load...按鈕。
(3)單擊Close按鈕返回AutoCAD主窗口。
(4)在命令行中輸入命令“Hello”,將在命令行中出現(xiàn)“Hello,ObjectARX!”。
(5)如果需要卸載程序,則再彈出“Load/UnloadApplications(加載/卸載應(yīng)用程序)”對(duì)話框,如圖38-10所示。在“LoadedApplications(已加載應(yīng)用程序)”選項(xiàng)卡內(nèi)選擇“Hello.ARX”程序,單擊Unload按鈕,則該程序被卸載。

   實(shí)例說明
1.在AutoCAD2002中還可通過“appload”和“arx”命令來載入或卸載ARX程序。
2.ARX程序還可在AutoCAD啟動(dòng)時(shí)加載。編輯AutoCAD初始加載文件acad.rx,指定需要在啟動(dòng)時(shí)加載的ARX程序名稱。

   小結(jié)
   本章主要介紹了ObjectARX的概念和作用,并通過一個(gè)最簡(jiǎn)單的ARX應(yīng)用程序?qū)嵗,介紹了ObjectARX程序的基本結(jié)構(gòu)、AutoCAD與ARX應(yīng)用程序之間的消息傳遞機(jī)制、建立ARX應(yīng)用程序的基本步驟,以及如何在AutoCAD中使用ARX程序。
民眾工作室.制作      版權(quán)所有