天天看點

ObjectARX-學習筆記

ObjectARX 程式設計環境,為開發者使用、使用者化和擴充AutoCAD,提供了一個面向對象的C++應用程式設計接口。目前,ObjectARX 功能如下:

1、  通路AutoCAD資料庫。

AutoCAD 圖是一個儲存在資料庫中的對象的集合,這些對象不僅表示圖形實體,而且表示内部結構,如符号表和詞典。ObjectARX為我們的應用程式提供了通路這些資料庫結構的能力,我們也可以專用應用程式建立新的資料庫對象。

2、  與AutoCAD編輯器通信。

ObjectARX 提供了與AutoCAD編輯器通信的類和成員函數。我們可以用AutoCAD注冊指令。該指令可以當作AutoCAD内部指令一樣使用。應用程式可以接收和回應發生在AutoCAD内的各種事件。

3、  可以用MFC建立使用者界面。

可以使用與AutoCAD共享的動态鍊結MFC建立ObjectARX應用程式。我們可以使用該庫建立标準的GUI。

4、  支援多文檔界面(MDI)。

使用ObjectARX,我們可以建立支援AutoCAD多文檔界面的應用程式,并且可以保證在Windows環境下建立的應用程式與其他的應用程式正常通信。

5、  建立自定義類。

我們可以用ObjectARX類層次結構中的類建立自己的自定義類,也可以使用ObjectARX 的擴充圖形庫建立自定義類。

6、  編制複雜應用程式。

ObjectARX支援複雜應用程式的開發,并提供如下特性:通知、事務管理、     深層克隆、引用編輯、協定擴充、代理對象支援。

7、  和其他的程式設計環境通信。

ObjectARX 應用程式可以與其他的程式接口通信。如Visual LISP、ActiveX和COM。通過URL與實體相連接配接,或者網際網路加裁和存儲圖檔案,ObjectARX應用程式也可以和網際網路通信。

ObjectARX環境包含下列幾組類和函數:

AcRx             用于綁定應用程式及運作時類的注冊和辨別的類。

AcEd             注冊本地AutoCAD指令和AutoACD事件通知的類。

AcDb             AutoCAD資料庫類。

AcGi              顯示AutoACD實體的圖形類。

AcGe             公用線性數學和幾何學對象應用類。

AcRx庫提供了一些系統級類,用于DLL的初始化和連結及運作時類的注冊和辨別。該庫的基類是AcRxObject,它提供如下功能:對象運作時類辨別和繼承分析、運作時向既有類添加新協定、對象比較測試、對象複制。運作時類型辨別是AcRxObject的每個子類都有一個相關的類描述者對象(AcRxClass類型),用于運作時類型的辨別。

AcEd庫提供定義和注冊新的AutoCAD指令的類,新指令的操作性能與AutoCAD内部指令是完全一樣的。我們定義的新指令被當作本地指令是因為它們與AutoACD内部指令具有相同的内部結構 (AcEdCommandStack)。AcEd庫還提供編輯器反應器和一套與AutoCAD通信的全局函數。注:該庫中一個重要的類是AcEditorReactor,它監視AutoCAD編輯器的狀态,并當指定事件發生時(如形開始、終止和删除指令)通知應用程式。

AcDb庫提供了組成AutoCAD資料庫的類。AutoCAD資料庫用于存儲所有的圖形對象和非對象;圖形對象稱為實體,組成AutoCAD圖;非圖形對象(如層、線型和字型)也是圖形的一部分。同時我們可以使用AcDb庫查詢和管理AutoCAD實體的實體對象,也可以建立新的資料庫對象執行個體。AutoCAD資料庫包含如下主要元素:九個符号表,每個表都擁有唯一的指令符号表條目對象,這些對象表示各種常用的AcDbDatabase對象和資料成員;命名的對象詞典(類AcDbDictionary),提供AutoCAD圖的目錄表。對于新圖來說,該目錄表包含四個AutoCAD使用的其他詞典ID,同時我們的應用程式可以任意向該詞典添加其他的對象;一套固定的環境變量,大約200個環境變量,其值上由AutoCAD設定的。

AcGi庫提供了用于繪制AutoCAD實體的圖形界面,AcDbEntity成員函數worldDraw()、viewportDraw()和saveAs(),及所有标準實體協定部件都使用AcGi庫。

AcGe庫提供了應用類,如向量和矩陣,用來完成二維和三維幾何操作,它還提供基本的幾何對象,如點、曲線和表面。AcGe還包含兩個主要子集:二維和三維幾何類,主要抽象基類分别為AcGeEntity2d和AcGeEntity3d。

ObjectARX目錄結構

├─arxlabs           目錄存放AutoCAD ARX使用指南。

├─classmap        目錄存放AutoCAD圖形形式的ObjectARX類層次結構圖。

├─docs                     目錄存放ObjectARX開發者的線上幫助檔案,

├─inc                 ObjectARX頭檔案。

├─lib                  ObjectARX庫檔案。

├─redistrib          ObjectARX發行庫。

├─samples          ObjectARX例子目錄。

└─utils               ObjectARX的擴充和開發小工具。

    這幾天都是學習一些AutoCAD和ObjectARX的理論知識,主要目的是和它們混個臉熟,了解它們的過去和現在,學習它們的組織結構,為以後做需求打好基礎。

     AutoCAD資料庫用來存儲組成AutoCAD圖的對象和實體。基本的資料庫對象是實體、符号表和詞典。實體是在AutoCAD圖内部表示圖的一種特殊資料庫對象,線、圓、弧、文本、實心體、區域、複合線和橢圓都是實體,使用者可以在螢幕上看見實體并能對其進行操作。符号表和詞典是用于存儲資料庫對象的容器。層表(AcDbLayerTable)是符号表之一,它包含層表記錄,塊表(AcDbBlockTable)也是一個符号表,包含塊表記錄。所有AutoCAD實體都屬于塊表記錄。詞典為存儲對象提供了比符号表更加普通的容器。

     在AutoCAD中建立的對象被添加到資料庫對應的容器對象中,實體被添加到塊表的記錄中,符号表記錄被添加相應的符号表中,所有其他對象被添加到命名對象詞典中,或添加到其他對象擁有的對象(擁有其他對象的對象最終屬于命名對象詞典)中,或添加到擴充詞典中。

     資料庫中包含一套(九個)符号表和一個命名對象詞典,表包括塊表、層表和線型表。塊表最初包含三個記錄,一個記錄叫做*MODEL_SPACE, 兩個圖紙空間記錄叫作*PAPER_SPACE和*PAPER_SPACE0。這些塊表記錄表示模型空間和兩個預先确定的圖紙空間布局。層表最初包含一個0層記錄。線型表最初包含CONTINUOUS線型。命名對象詞典是當資料庫被建立後,命名對象詞典就已經包含四個資料庫詞典:GROUP(組)詞典、MLINE類型詞典、布局詞典和繪圖式樣名詞典,在MLINE類型詞典内,總有STANDARD類型。

根據上面的圖,在AutoCAD中建立線,并将其添加到模型空間塊表記錄中需要以下幾步:

1、  建立線對象(new AcDbLine)。

2、  通過acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBT)傳回目前圖中塊表對象指針。

3、  然後通過得到的塊表以寫模式打開模型空間塊表記錄,同時把塊表對象關閉(不用就馬上關閉)。

4、  通過塊表記錄的appendAcDbEntity把建立立的線實體追加到記錄中去,同時傳回新添加線的實體ID。

5、  關閉塊記錄和線對象。

同理,Circle也是這樣操作的。

今天主要了解AutoCAD中怎麼建立實體對象,以及AutoCAD是怎樣存放的。由于時間原因,建立層和添加組就不說了,都比較類似的。

   今天是學習AutoCAD ObjectARX的第三天,三天來一直在看一本叫《AutoCAD ObjectARX 2000 開發技術指南》技術從書,當今天看ObjectARX 2007開發文檔的時候,突然感覺自己都已經看過了,雖然都是英文的。汗,結果兩者一樣。大汗一把!現在的出版的書… 竟然書上還寫着誰誰著。

    ObjectARX應用程式是一個動态連結庫,它共享AutoCAD的位址空間并且直接調用AutoCAD函數。

    建立一個ObjectARX應用程式通常包括以下幾個步驟:

1、 建立實作新指令的自定義類。一般都是從ObjectARX提供的類派生出來的自定義類。

2、 決定我們的ObjectARX應用程式将處理哪一個AutoCAD消息。AutoCAD向ObjectARX應用程式發送各種消息,指出在AutoCAD内發生了特定的事件,我們決定應用程式将對哪一個消息作出響應,并觸發哪一個操作。

3、 為AutoCAD提供入口。在ObjectARX2007以上的版本中有一預設的入口定義檔案(AcRxDefault.def)不用使用者再建立。

4、 實作初始化。在ObjectARX應用程式内,我們需要初始化已建立的任何自定義,并且重建ObjectARX運作時類樹;如果要添加指令,必須注冊在AutoCAD中的指令。

5、 解除安裝準備。解除安裝前必須删除所有自定義類和指令。

     注冊新指令的方法可以用AcEdCommandStack的addCommand的方法和acedDefun還有acedRegFunc的方法。後兩咱們以後再說,主要是addCommand注冊指令的方法。

    AutoCAD指令是由AcEdCommandStack類定義的,按組存儲在指令棧中。一般況下用addCommand函數一次添加一個指令,并用removeGroup函數成組的删除指令,也可以用removeCmd函數一次删除一個指令。作為退出前消除工作的一部分,我們應用程式需要删除它注冊的所有指令。

addCommand函數的原型聲明為:

Acad::ErrorStatus

addCommand(

 const char* cmdGroupName,

const char* cmdGlobalName,

const char* cmdLocalName,

Adesk::Int32 commandFlags,

AcRxPtr Addr,

AcEdUIContext *UIContext = NULL,

int fcode=-1);

其中:

 cmdGroupName 需要添加指令的組名(用ASCII表示)。如果組不存在,則會自動在添加指令前建立組。

cmdGlobalName 要添加的指令名(用ASCII表示)。該名字是全局的。

cmdLocalName 要添加的指令名(用ASCII表示)。該名字是本地的。

commandFlags 與指令有關的标記,有效值為: ACRX_CMD_TRANSPARENT, ACRX_CMD_MODAL, ACRX_CMD_USEPICKSET, 和 ACRX_CMD_REDRAW。

Addr 當執行指令時,要執行的函數位址。

UiContext AcEdUIContext回調類的輸入指針。

fcode 配置設定給指令的輸入整形碼。

removeCmd()函數的原型聲明為:

 virtual Acad::ErrorStatus

AcEdCommandStack::removeCmd( const char * cmdGroupName, const char * cmdGlobalName) = 0;

removeGroup()函數原型聲明為:

 virtual Acad::ErrorStatus

AcEdCommandStack:: removeGroup ( const char * cmdGroupName);

    對于指令的查找順序可以用AcEdCommandStack::popGroupToTop()函數放在棧頂,AutoCAD會首先查找這個組。

    全局與本地指令名的差別是:全局指令名可以在任何語言環境中使用,而本地指令名是用于非英語版AutoCAD指令名的翻譯。

    透明與模态指令,我的了解是像對話框一樣,非模态與模态的差別。

    到此,自己完全可以看着文檔做一個例子出來了!享受你的成果吧!