開發概述
ObjectARX應用程式是一個動態程式庫(DLL),它共享AutoCAD的地址空間並直接調用AutoCAD的函式。我們可以利用ObjectARX直接訪問AutoCAD的資料庫結構、圖形系統以及AutoCAD幾何構造核心。我們可以向ObjectARX編程環境添加新類,並將其輸出以供其他程式調用。我們創建的自定義實體與AutoCAD內部實體沒有任何區別。我們也可以在運行時通過向既有的AutoCAD類添加函式來擴充ObjectARX協定。由ObjectARX定義的外部命令與AutoCAD內部命令的執行機制是一樣的。
ObjectARX應用程式的本質是Windows的DLL程式,而AutoCAD本身則是一個典型的Windows程式,ObjectARX應用程式與AutoCAD、Windows之間均採用Windows訊息傳遞機制直接進行通信。
ObjectARX應用程式與AutoCAD在同一地址空間內運行並能直接利用AutoCAD核心資料庫結構和代碼。由ObjectARX應用程式定義的外部命令通過acedRegCmds()宏註冊。這些外部命令與AutoCAD本身固有命令一樣由AutoCAD本身執行。
ObjectARX應用程式以VisualC++語言為開發基礎,具有面向對象編程方式的數據可封裝性、可繼承性及多態性等特點。由它開發的工程CAD軟體具有模組性好、獨立性強、連線簡單、使用方便、內部功能高效實用以及代碼可重用性強等優點,而且支持微軟的MFC類庫,能簡潔高效的實現很多複雜的功能。
開發環境
運用ObjectARX進行二次開發,必須首先設定好ObjectARX的開發環境。目前常用的開發環境是Microsoft Visual C++ 6.0 、Microsoft visual studio 2005、Microsoft visual studio 2008、Microsoft visual studio 2010。同時,還需要安裝ObjectARX SDK,ObjectARX SDK可以在AutoDesk公司的網站上免費下載。不同的AutoCAD版本對應相應的ObjectARX SDK的版本,目前常用的是ObjectARX SDK for AutoCADR14和ObjectARX SDK for AutoCAD2000i。這兩個開發工具在設定上略有不同,將進行對比介紹。 安裝好VC++和ObjectARX後,就可以開始設定開發環境了。
尋找路徑
設定INC和LIB檔案尋找路徑
INC和LIB檔案尋找路徑為VC++的環境參數,設定一次即可,對以後的所有項目均有效。 選擇 Tools→Options …,出現Option對話框,選擇Directories頁,在Show Directories for中選擇Include files,然後在Directories中加上ARX的INC目錄路徑c:\objectarx\inc(假定ARX的開發工具在c:\objectarx\中)。 在Show Directories for中選擇Library files,然後在Directories中加上ARX的LIB目錄路徑c:\objectarx\lib(假定ARX的開發工具在c:\objectarx\中
項目環境
建立項目並設定編譯環境
一般來說,開發的ObjectARX應用程式都需要支持MFC(如採用對話框等),因此,我們可以直接建立支持MFC的ObjectARX開發項目。每個項目均應設定編譯環境,一般項目的編譯環境可以有兩個設定,分別為發布版本(Win32 Release)和調試版本(Win32 Debug)。在本節里,介紹的是發布版本的設定,而調試版本的設定將在下一節介紹。ObjectARX SDK for AutoCADR14和ObjectARX SDK for AutoCAD2000i在設定上面存在著差別,下面分別進行介紹
1.對於ObjectARX SDK for ACADR14
a. 選擇 File→New ,選擇projects頁→MFC AppWizard,給定項目名(helloR14)及位置,選OK,在DLL type中選擇MFC Extension DLL(using share MFC DLL),再選擇Finish。建立項目。
b. 選擇Build→Set Active Configration…→helloR14 Win32 Release,然後選OK。
c. 選擇Project→Setting,出現Project Settings對話框,開始設定編譯環境。
d. General中,Microsoft Foundation Classes選擇Use MFC in a Share DLL。
e. C/C++→Code Generation中,Use run-time library選擇Multithreaded DLL。
f. C/C++→Preprocessor中,Preprocessor definitions填入ACRXAPP,RADPACK,WIN32,NDEBUG,_WINDOWS。
g. Link→General中,Output file Name填入helloR14.arx。
h. Link→Input中,Object/library modules添加Acad.lib acedapi.lib rxapi.lib libacge.lib庫檔案名稱。
i. Link→Output中,Base address填入0xc10000,Entry-point symbol中填入DllEntryPoing@12。
j. 點擊OK退出Project Settings對話框。
k. 添加HelloR14.cpp主程式,為了使ARX支持MFC,把 HelloR14.cpp的內容直接替換為ObjectARX/UTILS/MFCEXTRAS/目錄下ARXMFCTMPL.CPP的內容,其中包含了MFC所需的支持函式。同時加入公用頭檔案 resourcehelper.h到項目中去,這個頭檔案也可以在上面的目錄找到。
l. 添加註冊命令,在 initApp ()函式中,用 acedRegCmds->addCommand()冊新的AutoCAD命令。
m. 添加HelloR14.def定義檔案,EXPORTS下加入 acrxEntryPoint acrxGetApiVersion
n. 對話框的可以採用一般VC++的對話框,繼承 CDialog類。
2.對於ObjectARX SDK for ACAD2000i
a. 選擇 File→New ,選擇projects頁→MFC AppWizard,給定項目名(hello2000)及位置,選OK,在DLL type中選擇MFC Extension DLL(using share MFC DLL),再選擇Finish。建立項目。
b. 選擇Build→Set Active Configration…→hello2000 Win32 Release,然後選OK。
c. 選擇Project→Setting,出現Project Settings對話框,開始設定編譯環境。
d. C/C++→Code Generation中,Use run-time library選擇Multithreaded DLL。
e. C/C++→Preprocessor中,Preprocessor definitions填入ACRXAPP, WIN32,NDEBUG,_WINDOWS,_WINDLL,_AFXDLL,AFXEXT。
f. Link→General中,Output file Name填入hello2000.arx。
g. Link→Input中,Object/library modules添加acge15.lib acad.lib acedapi.lib acrx15.lib acdb15.lib acutil15.lib rxapi.lib acui15.lib adui15.lib庫檔案名稱。
h. Link→Output中,Base address填入0xc1000000。
i. 點擊OK退出Project Settings對話框。
j. 添加Hello2000.cpp主程式,為了使ARX支持MFC,需要把 Hello2000.cpp的內容直接替換為ObjectARX/DOCSAMPS/MFCSAMPS/DYNAMIC/目錄下ARXMFCTMPL.CPP的內容,其中包含了MFC所需的支持函式。同時加入兩個公用頭檔案 resourcehelper.h和stdafx.h到項目中去,這兩個頭檔案也可以在上面的目錄找到。
k. 添加註冊命令,在 initApp ()函式中,用 acedRegCmds->addCommand()新的AutoCAD命令。
l. 修改Hello2000.def檔案,在EXPORTS下加入 acrxEntryPoint acrxGetApiVersion
m. 對話框採用的是ObjectARX提供的對話框類型,採用MFC UI提供的相關類。類的頭檔案為 acui.h和adui.h。使用時可以先按照一般VC++的對話框建立對話框,然後修改該對話框繼承的類為CAcUiDialog。可以通過查找和替換,直接把項目中的CDialog全部替換為CAcUiDialog。在引用該對話框時用採用下面的方法,如: HelloDlg Hello2000dlg(CWnd::FromHandle(adsw_acadMainWnd()))
加卸載
項目編譯完成後,就可以在AutoCAD中載入運行了。載入ObjectARX程式,可以選擇Tools→Load Application…,然後選擇相應的 arx檔案,點擊Load即可。 運行ObjectARX程式則通過鍵入程式中所註冊的命令進行調用。 需要卸載程式時,可以選擇Tools→Load Application…,然後選擇相應的 arx檔案,點擊Unload即可。也可以直接鍵入(arxunload “ARX 程式名 ” )。
調試技巧
程式編寫中需要進行大量的調試工作,ObjectARX程式的調試可以跟普通的VC++程式一樣通過設定斷點來跟蹤,同時,還有一些ObjectARX獨特的調試技巧。
斷點跟蹤
ObjectARX的跟蹤調試需要首先設定調試版本(Win32 Debug)的編譯環境。不同版本的調試環境設定也略有不同。 對於ObjectARX SDK for ACADR14
a. 選擇Build→Set Active Configration…→helloR14 Win32 Debug,然後選OK。
b. 選擇Project→Setting,出現Project Settings對話框,開始設定編譯環境。
c. General中,Microsoft Foundation Classes選擇Use MFC in a Share DLL。
d. Debug→General中,Executable for debug session中選擇AutocadR14運行程式的位置,如C:\Program Files\AutoCAD R14\acad.exe。
e. C/C++→Code Generation中,Use run-time library選擇Debug Multithreaded DLL。
f. C/C++→Preprocessor、Link→General、Link→Input、Link→Output的設定均同發布版本(Win32 Release)
g. 點擊OK退出Project Settings對話框。
h. 編譯完成後,點擊F9在相應位置設定斷點。
i. 點擊F5開始跟蹤調試,調試開始時會自動打開AutoCAD,載入運行ARX後,到達斷點的位置,進入調試界面,可以查詢程式中變數的當前值,點擊F5可以繼續調試。
j. 程式運行完成後,退出AutoCAD,結束調試。 對於ObjectARX SDK for 2000i,調試環境的設定與R14的基本相同,主要的區別在於第e 步中,Use run-time library需要選擇Multithreaded DLL,否則會出現DLL的版本問題,而導致ARX無法載入。
其他技巧
ObjectARX的程式由於是運行在AutoCAD圖形支撐環境下的,程式中很多元素都是對應著圖形中的相應位置,因此,在調試的時候,除了通過設定斷點跟蹤變數外,還可以通過圖形顯示來觀察變數。 但是,ObjectARX在AutoCAD裡面進行繪製時,需要與AutoCAD資料庫進行互動,代碼比較長,直接在程式裡面寫入容易造成混亂。因此,可以利用我們開發的ObjectARX基本繪圖函式館(Plot1和Plot2)。該函式 庫提供了大量的圖形繪製函式、文字輸出函式以及圖形編輯函式,調用時只需一行代碼就可以完成,十分方便。其中常用的函式有以下這些:
l 繪圖相關函式 createLine 畫直線 createDimR 傾斜尺寸標註 createDim 水平或豎直尺寸標註 createPoint 創建點 createCircle 畫圓 createArc 畫圓弧 createText 寫字元串 createTextN 寫 一整數 createTextR 寫 一實數 createPline 畫等寬多義線 createHatch 區域填充 insertBlock 插入圖塊 l 圖形編輯相關函式 eraseByName 按實體的 ads_name 刪除實體 eraseById 按實體的ID刪除實體 changeLayerByName 按實體的 ads_name 改變實體的層 changeColorByName 按實體的 ads_name 改變實體的顏色 changeTextByName 按實體的 ads_name 改變實體字元內容 有了這個函式館,就可以通過添加輔助線和輔助圖元、顯示不同位置的變數值、改變圖元的顏色等調試方法進行程式的調試了。