您當前的位置:主頁>>AutoCAD>>AutoCAD二次開發(fā) |
使用VisualC 創(chuàng)建ARX程序 本節(jié)通過一個簡單的實例來講述ARX程序的創(chuàng)建過程,介紹編制ObjectARX程序的一些基本ARX程序與進行通訊的方式。如同學習其它計算機語言一樣,我們首先來創(chuàng)建一個最簡單的ARX程序—“Hello.ARX”,在AutoCAD2002中加載并運行該程序,將會在命令行出現(xiàn)-“Hello,ObjectARX!”。 1.1 建立ARX程序的基本步驟 由于ARX程序是一種可以共享AutoCAD地址空間并對AutoCAD進行直接調(diào)用的動態(tài)鏈接庫,因此應(yīng)該按照下列基本步驟建立ARX程序: (1)創(chuàng)建自定義類來實現(xiàn)新的命令:用戶可以從ARX類層次關(guān)系中的大多數(shù)類和符號表類中派生自己的類。 (2)決定ARX程序應(yīng)該響應(yīng)的AutoCAD消息:AutoCAD通過向ARX程序發(fā)出一系列的消息指明在它內(nèi)部發(fā)生的特殊事件,ARX程序必須對其中的某些消息作出反映,并觸發(fā)相應(yīng)的操作。 (3)實現(xiàn)應(yīng)用程序與AutoCAD通信的入口:AutoCAD通過函數(shù)acrxEntryPoint()來調(diào)用ARX程序,而不是象普通的C 程序那樣使用main()函數(shù)。函數(shù)acrxEntryPoint()中可以用switch語句處理AutoCAD的各種返回信息,根據(jù)不同信息執(zhí)行不同的函數(shù),并返回狀態(tài)碼。如果針對特定的消息返回出錯代碼,則必須用case語句來處理。最后,必須用AcRx::kRetOk作為函數(shù)acrxEntryPoint()的最終返回值。 (4)完成ARX程序的初始化:用戶必須在acrxEntryPoint()函數(shù)的AcRx::kInitAppMsg事件中或者該事件調(diào)用的函數(shù)(例如:initApp()函數(shù))中,對程序中自定義的所有類進行初始化,然后調(diào)用acedRegCmds->addCommand()函數(shù)在AutoCAD命令堆棧中注冊新命令。 (5)實現(xiàn)卸載(Unload)功能:用戶必須在acrxEntryPoint()函數(shù)的AcRx::kUnloadAppMsg事件中或者該事件調(diào)用的函數(shù)(例如:unloadApp()函數(shù))中,調(diào)用acedRegCmds->removeGroup()函數(shù)將initApp()函數(shù)中注冊的新命令組從AutoCAD命令堆棧中清除,調(diào)用deleteAcRxClass()函數(shù)清除程序中自定義的任何類,然后刪除所有由應(yīng)用程序添加到AutoCAD中的對象,并清除所有與AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor對象相關(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ù)注冊AutoLISP函數(shù)的ARX程序的消息:kUnloadDwgMsg、kInvkSubrMsg、kEndMsg、kQuitMsg、kSaveMsgkCfgMsg。 (3)只發(fā)送給注冊service對象的ARX程序的消息:kDependencyMsg、kNoDependencyMsg。 (4)只發(fā)送給使用ActiveX控件對象的ARX程序的消息:kOleUnloadAppMsg。 普通的ARX程序僅需要響應(yīng)消息kInitAppMsg和kUnloadAppMsg,這兩種消息的含義和ARX程序?qū)λ鼈兊捻憫?yīng)方式為: (1)消息kInitAppMsg:當AutoCAD加載ObjectARX應(yīng)用程序并開始進行與應(yīng)用程序的通信時發(fā)送此消息。 對于此消息,ARX程序應(yīng)該注冊服務(wù)對象、類、AcEd命令和事件反應(yīng)器,以及AcRxDynamicLinker類事件反應(yīng)器,初始化應(yīng)用程序的系統(tǒng)資源(如設(shè)備、窗口),并執(zhí)行簡單的初始化操作;這時,AcRx、AcEd和AcGe類庫都應(yīng)該被激活;如果需要對應(yīng)用程序進行解鎖或重新加鎖操作,還應(yīng)該保存pkt參數(shù)。 但是這里不能進行下列操作:初始化設(shè)備驅(qū)動程序、激活用戶界面資源、按特殊順序加載應(yīng)用程序、執(zhí)行AutoLISP程序以及打開任何數(shù)據(jù)庫,否則將導致錯誤發(fā)生或者系統(tǒng)崩潰;AcDb和AcGi類庫也不能在這里激活,盡管它們與AcRx和其它結(jié)構(gòu)有聯(lián)系。 (2)消息kUnloadAppMsg:當ObjectARX程序被卸載時(由用戶卸載或者AutoCAD程序終止時),AutoCAD發(fā)送此消息,關(guān)閉當前文件并執(zhí)行清除操作。 對于此消息,ARX程序應(yīng)該清除所有系統(tǒng)資源,所有對kInitAppMsg消息所做的初始化等工作都應(yīng)該在這里被終止或者析構(gòu)。AutoCAD不會自動解除初始化所做的工作。 1.3 實例 :最簡單的ARX程序——“Hello.ARX” Hello.ARX是最簡單的ARX程序,但是麻雀雖小,五臟俱全,它是進一步學習編寫復雜程序的基礎(chǔ),現(xiàn)在請大家和我來一步步的完成它,具體過程如下: Step1 :創(chuàng)建工程 (1)運行VisualC 6.0,選擇菜單命令【File】→【New…】,彈出“New”對話框。 (2)在“New”對話框中選擇“Projects”選項卡。 (3)在“Projects”選項卡中選擇“Win32Dynamic-LinkLibrary”項。 (4)輸入程序名稱“Hello”和存放目錄,并確認“Platforms:”內(nèi)選中“Win32”。 (5)完成以上步驟后(如圖38-2所示),單擊OK按鈕,并在下一提示對話框中單擊Finishig按鈕來建立一個空的DLL工程。 Step2 :建立源文件“Hello.cpp” (1)選擇菜單命令【File】→【New…】,彈出“New”對話框。 (2)在“New”對話框中選擇“Files”選項卡。 (3)在“Files”選項卡中選擇“C SourceFile”項。 (4)輸入源文件名稱“Hello.cpp”和存放目錄,確認“Addtoproject:”項被選中,并選擇加入的工程為“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命令時被調(diào)用 voidHello() { acutPrintf("Hello,ObjectARX!"); } //初始化函數(shù) //在acrxEntryPoint()函數(shù)的kInitAppMsg事件中被調(diào)用, //向AutoCAD命令堆棧中添加新命令組以及ACRX類層次 //中添加新的自定義類,本實例中無自定義類,故不用初始化新類 voidinitApp() { //顯示提示信息 acutPrintf("\n初始化函數(shù)\n"); //addCommand函數(shù)在AutoCAD命令堆棧中注冊 //新的命令組名“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” 重復Step2中步驟,建立源文件“Hello.def”, 程序內(nèi)容如下: LIBRARYHelloARX DESCRIPTION'ThesimplestObjectARXsampleprogram-Hello' EXPORTS acrxEntryPointPRIVATE acrxGetApiVersionPRIVATE Step4 :設(shè)置ObjectARX文件路徑 (1)選擇菜單命令【Tools】→【Options…】,彈出“Options”對話框。 (2)在“Options”對話框中選擇“Directories”選項卡。 (3)在“Showdirectoriesfor:”下拉列表中選擇“Includefiles”項。 (4)在“Directories:”列表的空白項中添加ObjectARX中“Inc”目錄的路徑(如圖38-4所示)。 (5)在“Showdirectoriesfor:”下拉列表中選擇“Libraryfiles”項。 (6)在“Directories:”列表的空白項中添加ObjectARX中“Lib”目錄的路徑(如圖38-5所示)。 Step5 :ObjectARX工程設(shè)置 (1)選擇菜單命令【Project】→【Settings…】,彈出“ProjectSettings”對話框。 (2)在“ProjectSettings”對話框中選擇“SettingFor:”下拉列表的“AllConfigurations”項。 (3)在“ProjectSettings”對話框中選擇“C/C ”選項卡。 (4)在“Category:”下拉列表中選擇“CodeGeneration”項。然后選中“Userun-timelibrary”下拉列表中的“MultithreadedDLL”選項(如圖38-6所示)。再在“Category:”下拉列表框中選擇“Preprocessor”項,然后在“Preprocessordefinitions:”編輯框中內(nèi)容的后面添加“ACRXAPP,RADPACK”,表示需要預鏈接的庫(如圖38-7所示)。 (5)在“ProjectSettings”對話框中選擇“Link”選項卡。 (6)在“Category:”下拉列表中選擇“General”項,然后在“Outputfilename:”編輯框中鍵入應(yīng)用程序名“.\HelloARX.arx”(圖38-8);在“Object/librarymodules:”編輯框中添加“acutil15.libacrx15.libacdb15.libacedapi.librxapi.libacad.libacge15.lib”;在“Category:”下拉列表框中選擇“Output”項,然后在“Baseaddress:”編輯框中鍵入“0x1c000000”(圖38-9)。 (7)完成上述步驟后,單擊OK按鈕確定設(shè)置。 Step6 :編譯和建立ARX程序 選擇菜單命令【Build】→【BuildHelloARX】,編譯和建立Hello.arx程序。 Step7 :加載并運行ARX程序 (1)在AutoCAD2002環(huán)境中,選擇菜單命令【Tools(工具)】→【LoadApplication…(加載應(yīng)用程序)】,彈出“Load/UnloadApplications(加載/卸載應(yīng)用程序)”對話框。 (2)選中“Hello.arx”文件,單擊Load...按鈕。 (3)單擊Close按鈕返回AutoCAD主窗口。 (4)在命令行中輸入命令“Hello”,將在命令行中出現(xiàn)“Hello,ObjectARX!”。 (5)如果需要卸載程序,則再彈出“Load/UnloadApplications(加載/卸載應(yīng)用程序)”對話框,如圖38-10所示。在“LoadedApplications(已加載應(yīng)用程序)”選項卡內(nèi)選擇“Hello.ARX”程序,單擊Unload按鈕,則該程序被卸載。 實例說明 1.在AutoCAD2002中還可通過“appload”和“arx”命令來載入或卸載ARX程序。 2.ARX程序還可在AutoCAD啟動時加載。編輯AutoCAD初始加載文件acad.rx,指定需要在啟動時加載的ARX程序名稱。 小結(jié) 本章主要介紹了ObjectARX的概念和作用,并通過一個最簡單的ARX應(yīng)用程序?qū)嵗,介紹了ObjectARX程序的基本結(jié)構(gòu)、AutoCAD與ARX應(yīng)用程序之間的消息傳遞機制、建立ARX應(yīng)用程序的基本步驟,以及如何在AutoCAD中使用ARX程序。 |
民眾工作室.制作 版權(quán)所有 |