利用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...