利用C 進行AutoCAD的二次開發

2021-04-02 05:36:20 字數 3491 閱讀 1645

利用c sharp

進行autocad

的二次開發。在這一講中,主要介紹上一講例子中存在的問題。

在上一次的例子中我是通過引用

autocad 2004 type library

來進行c sharp

與autocad

之間的通訊,但這種方法存在兩個致命的缺點。第乙個缺點是每次除錯程式的時候

c sharp

都要重新啟動

autocad

,如果除錯的次數非常多(比如跟蹤錯誤然後除錯),那麼程式設計的效率就很低,因為啟動一次

cad還是需要較長的時間。相對於第乙個缺點,第二個缺點則更要命。由於

.net

本身的問題,

interop.autocad.dll

檔案(就是通過它才實現了

c sharp

與autocad

之間的通訊)存在著一些

bug,因此雖然有時你的**是完全正確的,但

c sharp

編譯器還是丟擲莫名其妙的錯誤。那不是完蛋了嗎?我曾經有一階段就因為這兩個要命的東東差一點放棄了

c sharp

而想改學

objectarx

了,呵呵,不過還是運氣好,我偶爾一次在網上看了一篇外國人寫的文章,他專門介紹了這兩個問題的解決辦法。下面就來解決這兩個問題。

首先來看第二個難題,按以下步驟來進行:

1.隨便用

visual studio .net

建立乙個

c sharp

autocad 2004 type library

,然後不加入任何**,編譯你的程式。2.在

visual studio .net

命令列工具下用

ilda**.exe

(這個工具可以在

visual studio .net

安裝光碟中找到)把

interop.autocad.dll

檔案(這個檔案在步驟

1中生成的專案的

bin/release

資料夾中)編譯成中間語言

interop. autocad.il

。注意:在步驟

1中建立的專案的編譯設定為

release

模式。ilda**.exe /source interop.autocad.dll /output=interop. autocad.il

又要注意了:把

ilda**.exe

,interop.autocad.dll

放在同一目錄下。

3.在記事本中開啟

interop. autocad.il

檔案,然後查詢結尾是「

sinkhelper

」而開頭為

".class private auto ansi sealed _dacad

「的語句,把語句中的

private

改為public,

然後儲存

interop. autocad.il

檔案。4

.使用ila**.exe

把interop. autocad.il

檔案編譯為

interop.autocad.dll

檔案,同樣是在

visual studio .net

命令列工具下進行。

ila**.exe /resource=interop.autocad.res /dll interop.autocad.il /output=interop. autocad.dll

interop.autocad.res

檔案是在步驟

1中生成的。

5interop. autocad.dll

,那太麻煩了。你可以用下面的方法來讓程式自動加入該檔案:找到

c:/program files/microsoft.net/ primary interop assemblies

資料夾,然後把上面生成的

interop.autocad.dll

檔案拷貝進去。

好了,第二個問題解決了,接下來看第乙個。

在vba

中,程式設計者可以使用

getobject

函式來獲得當前活動的

autocad

物件,但在

c sharp

中卻沒有,為了這個函式我幾乎把

msdn

給翻遍了,然後去各種

c sharp

論壇問各位高手,結果都沒得到解決,呵呵,可能國內使用

c sharp

的人比較少吧。還是在老外的論壇上看到了一篇就是講這個問題的文章才把這個難題給解決了。使用下面的語句就可以獲得當前活動的

autocad

物件了: (對於

cad2000

和cad2002,

則把16

改為15)

當然以上語句必須在

autocad

開啟的情況下才能使用,否則會發生錯誤,對於

autocad

autocad

與c sharp

的源程式如下所示:

using system;

using autocad;

using system.runtime.interopservices;

namespace acadexample

catch

catch }

} // if the user doesn't call dispose, the

// garbage collector will upon destruction

~autocadconnector()

} // this is the user-callable version of dispose.

// it calls our internal version and removes the

// object from the garbage collector's queue.

public void dispose()

// this version of dispose gets called by our

// destructor.

protected virtual void dispose(bool disposing) }

} 利用

visual studio.net

把上面的程式編譯成乙個類庫,你就可以在以後的程式中使用它了,下面的這個例子說明了它的用法。(首先把

acadexample

類庫包含在專案中)

using system;

using acadexample;

using autocad;

console.readline();

} }

} 這個例子是在

c sharp

視窗中顯示

autocad

中當前文件的標題。

利用C 進行AutoCAD的二次開發(三)

利用c 進行 方法,比如要建立乙個圓,就是用addcircle方法,而非圖形物件的建立使用add方法。下面通過乙個簡單的例子來說明上面介紹的內容。這個例子是在 autocad中建立乙個新的層,然後在該層中畫乙個紅色的圓和一條綠色的直線。這是程式的源 請先把上一講中生成的interop.autocad...

利用C 進行AutoCAD的二次開發(一)

眾所周知,對autocad進行二次開發用到的主要工具有 objectarx,vba,vlisp。但它們的優缺點是顯而易見的 objectarx功能強大,程式設計效率高,但它的缺點是程式設計者必須掌握vc 而這門語言非常的難學 vba和vlisp雖然簡單易上手,但它們對於開發大型的程式好象無能為力。那...

AutoCAD進行二次開發

本文基於autocad 2006新推出的.net api為工具,介紹了在.net平台下對autocad進行二次開發的技術,並與目前常用的vba objectarx作了對比。同時討論了如何彌補.net api某些不足的功能。當前autocad的二次開發工具主要有 visuallisp vba和obje...