利用c#調(diào)用AutoCAD說明_第1頁
利用c#調(diào)用AutoCAD說明_第2頁
利用c#調(diào)用AutoCAD說明_第3頁
利用c#調(diào)用AutoCAD說明_第4頁
利用c#調(diào)用AutoCAD說明_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

利用c#調(diào)用AutoCAD之一2009-02-1915:12學(xué)一點是一點,多多少少,算是有點進(jìn)步,先表揚自己一下。言歸正傳,今天在c#中實現(xiàn)了對AutoCAD的調(diào)用,中間遇到了一些問題,現(xiàn)在記下來,希望對大家有點幫助。參考文獻(xiàn)來源:/3391.html根據(jù)文章里講的:第一步:建立一C#的windows應(yīng)用程序,第二步:添加AutoCAD2008TypeLibrary的引用,第三步:根據(jù)文章里的內(nèi)容寫程序。這些都沒問題,但是編譯時,出現(xiàn)“使用了未添加的引用程序集”的錯誤,然后在安裝文件中找到“AUTODESK.AUTOCAD.INTEROP.COMMON.DLL”文件,再次添加引用,OK,程序正常運行。例子程序?qū)崿F(xiàn)了在c#中輸入點,在CAD中完成劃線的功能。方便大家,將文獻(xiàn)引入如下:眾所周知,對AutoCAD進(jìn)行二次開發(fā)用到的主要工具有:ObjectArx,VBA,VLisp。但它們的優(yōu)缺點是顯而易見的:ObjectArx功能強大,編程效率高,但它的缺點是編程者必須掌握VC++,而這門語言非常的難學(xué);VBA和VLisp雖然簡單易上手,但它們對于開發(fā)大型的程序好象無能為力。那究竟有沒有一種語言能結(jié)合它們的優(yōu)點而盡量避免它們的缺點呢?回答是肯定的,那就是微軟新推出的21世紀(jì)編程語言C#。關(guān)于C#的詳細(xì)介紹,大家可以參考有關(guān)的文章。C#是通過AutoCADActiveX這座橋梁來和AutoCAD之間進(jìn)行通訊的。AutoCADActiveX使用戶能夠從AutoCAD的內(nèi)部或外部以編程方式來操作AutoCAD。它是通過將AutoCAD對象顯示到“外部世界”來做到這一點的。一旦這些對象被顯示,許多不同的編程語言和環(huán)境就可以訪問它們。關(guān)于AutoCADActiveX的情況,大家可以參考AutoCAD自帶的幫助。呵呵,說了這么多無聊的,還是讓我們通過一個具體的例子來說明怎樣利用C#進(jìn)行AutoCAD的二次開發(fā)吧。在介紹例子之前先講一下有關(guān)的配置:(1)VisualS(2003和2002都可以,我用的是2002)(2)AutoCAD2000以上版本(我用的是2004)這個例子非常簡單,就是通過C#建立的窗體來啟動AutoCAD并畫一條直線。下面是編程的具體步驟:(1)通過VisualS建立一C#的windows應(yīng)用程序。(2)在“解決方案資源管理器”中右擊“引用”標(biāo)簽,在彈出的菜單中選擇“添加引用”,在“添加引用”對話框中選擇“com"選項卡下的下拉列表框中的“AutoCAD2004TypeLibrary"項(注意:不同版本的CAD的數(shù)字不同),單擊右邊的“選擇”按鈕,最后單擊下面的“確定”按鈕。(3)在C#窗體中加入兩個文本框和一個按鈕,分別用于輸入直線起點、終點的坐標(biāo)和在CAD中畫直線。下面主要解釋一下添加的代碼。(a)在程序的開頭加入:usingAutoCAD;//導(dǎo)入AutoCAD引用空間(b)在窗體的變量聲明部分加入:privateAcadApplicationa;//聲明AutoCAD對象(c)在窗體的構(gòu)造函數(shù)部分加入:a=newAcadApplicationClass();//創(chuàng)建AutoCAD對象a.Visible=true;//使AutoCAD可見(d)在按鈕的消息處理函數(shù)中加入:double[]startPoint=newdouble[3];//聲明直線起點坐標(biāo)double[]endPoint=newdouble[3];//聲明直線終點坐標(biāo)string[]str=textBox1.Text.Split(',');//取出直線起點坐標(biāo)輸入文本框的值,文本框的輸入模式為"x,y,z"for(inti=0;i<3;i++)startPoint[i]=Convert.ToDouble(str[i]);//將str數(shù)組轉(zhuǎn)為double型str=textBox2.Text.Split(',');//取出直線終點坐標(biāo)輸入文本框的值for(inti=0;i<3;i++)endPoint[i]=Convert.ToDouble(str[i]);a.ActiveDocument.ModelSpace.AddLine(startPoint,endPoint);//在AutoCAD中畫直線a.Application.Update();//更新顯示好了,簡單吧,你可以試著編譯一下。關(guān)于上面一些語句的用法,我會在下一講中作詳細(xì)介紹。利用c#調(diào)用AutoCAD之二2009-02-1916:23文獻(xiàn)來源:/3392.html大家好,今天我繼續(xù)給各位介紹利用C#進(jìn)行AutoCAD的二次開發(fā)。在這一講中,主要介紹上一講例子中存在的問題。在上一次的例子中我是通過引用AutoCAD2004TypeLibrary來進(jìn)行C#與AutoCAD之間的通信,但這種方法存在兩個致命的缺點。第一個缺點是每次調(diào)試程序的時候C#都要重新啟動AutoCAD,如果調(diào)試的次數(shù)非常多(比如跟蹤錯誤然后調(diào)試),那么編程的效率就很低,因為啟動一次CAD還是需要較長的時間。相對于第一個缺點,第二個缺點則更要命。由于.NET本身的問題,Interop.AutoCAD.dll文件(就是通過它才實現(xiàn)了C#與AutoCAD之間的通信)存在著一些bug,因此雖然有時你的代碼是完全正確的,但C#編譯器還是拋出莫名其妙的錯誤。那不是完蛋了嗎?我曾經(jīng)有一階段就因為這兩個要命的東東差一點放棄了C#而想改學(xué)ObjectArx了,呵呵,不過還是運氣好,我偶爾一次在網(wǎng)上看了一篇外國人寫的文章,他專門介紹了這兩個問題的解決辦法。下面就來解決這兩個問題。首先來看第二個難題,按以下步驟來進(jìn)行:1.隨便用VisualStudio.NET建立一個C#應(yīng)用程序,然后按照上一篇文章中的設(shè)置加入AutoCAD2004TypeLibrary,然后不加入任何代碼,編譯你的程序。2.在VisualStudio.NET命令行工具下用ildasm.exe(這個工具可以在VisualStudio.NET安裝光盤中找到)把Interop.AutoCAD.dll文件(這個文件在步驟1中生成的項目的Bin\Release文件夾中)編譯成中間語言Interop.AutoCAD.il。注意:在步驟1中建立的項目的編譯設(shè)置為Release模式。ildasm.exe/sourceInterop.AutoCAD.dll/output=Interop.AutoCAD.il又要注意了:把ildasm.exe,Interop.AutoCAD.dll放在同一目錄下。3.在記事本中打開Interop.AutoCAD.il文件,然后查找結(jié)尾是“SinkHelper”而開頭為".classprivateautoansisealed_DAcad“的語句,把語句中的private改為public,然后保存Interop.AutoCAD.il文件。4.使用ilasm.exe把Interop.AutoCAD.il文件編譯為Interop.AutoCAD.dll文件,同樣是在VisualStudio.NET命令行工具下進(jìn)行。ilasm.exe/resource=Interop.AutoCAD.res/dllInterop.AutoCAD.il/output=Interop.AutoCAD.dllInterop.AutoCAD.res文件是在步驟1中生成的。5.顯然你不愿意每次編寫應(yīng)用程序時都通過上一篇文章中介紹的方法來加入Interop.AutoCAD.dll,那太麻煩了。你可以用下面的方法來讓程序自動加入該文件:找到C:\ProgramFiles\Microsoft.NET\PrimaryInteropAssemblies文件夾,然后把上面生成的Interop.AutoCAD.dll文件拷貝進(jìn)去。好了,第二個問題解決了,接下來看第一個。在VBA中,編程者可以使用GetObject函數(shù)來獲得當(dāng)前活動的AutoCAD對象,但在C#中卻沒有,為了這個函數(shù)我?guī)缀醢袽SDN給翻遍了,然后去各種C#論壇問各位高手,結(jié)果都沒得到解決,呵呵,可能國內(nèi)使用C#的人比較少吧。還是在老外的論壇上看到了一篇就是講這個問題的文章才把這個難題給解決了。使用下面的語句就可以獲得當(dāng)前活動的AutoCAD對象了:(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16")(對于CAD2000和CAD2002,則把16改為15)當(dāng)然以上語句必須在AutoCAD打開的情況下才能使用,否則會發(fā)生錯誤,對于AutoCAD沒打開的情況,可以使用上一篇文章的方法來處理。完整的連接AutoCAD與C#的源程序如下所示:usingSystem;usingAutoCAD;usingSystem.Runtime.InteropServices;namespaceAcadExample{publicclassAutoCADConnector:IDisposable{privateAcadApplication_application;privatebool_initialized;privatebool_disposed;publicAutoCADConnector(){try{//Uponcreation,attempttoretrieverunninginstance_application=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16");}catch{try{//Createaninstanceandsetflagtoindicatethis_application=newAcadApplicationClass();_initialized=true;}catch{throw;}}}//Iftheuserdoesn'tcallDispose,the//garbagecollectorwillupondestruction~AutoCADConnector(){Dispose(false);}publicAcadApplicationApplication{get{//ReturnourinternalinstanceofAutoCADreturn_application;}}//Thisistheuser-callableversionofDispose.//Itcallsourinternalversionandremovesthe//objectfromthegarbagecollector'squeue.publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}//ThisversionofDisposegetscalledbyour//tectedvirtualvoidDispose(booldisposing){//IfwecreatedourAutoCADinstance,callits//Quitmethodtoavoidleakingmemory.if(!this._disposed&&_initialized)_application.Quit();_disposed=true;}}}利用VisualS把上面的程序編譯成一個類庫,你就可以在以后的程序中使用它了,下面的這個例子說明了它的用法。(首先把AcadExample類庫包含在項目中)usingSystem;usingAcadExample;usingAutoCAD;namespaceConsoleApplication6{classClass1{[STAThread]staticvoidMain(string[]args){using(AutoCADConnectorconnector=newAutoCADConnector()){Console.WriteLine(connector.Application.ActiveDocument.Name);}Console.ReadLine();}}}這個例子是在C#窗口中顯示AutoCAD中當(dāng)前文檔的標(biāo)題。這一講的主要內(nèi)容是介紹AutoCAD對象模型,如果你對VBA開發(fā)AutoCAD了解的話,這部分內(nèi)容應(yīng)該是超簡單的。對象是AutoCADActiveX接口的主要構(gòu)造塊,每一個顯示的對象均精確代表一個AutoCAD組件。AutoCADActiveX接口的主要對象有:?直線、圓弧、文字和標(biāo)注等圖形對象。?線型與標(biāo)注樣式等樣式設(shè)置對象?圖層、編組和塊等組織結(jié)構(gòu)對象?視圖與視口等圖形顯示對象。?圖形、AutoCAD應(yīng)用程序本身也是對象所有對象的根對象是AutoCAD應(yīng)用程序本身,它用AcadApplication類來表示。獲得當(dāng)前運行的AcadApplication對象可以使用上一講中介紹的方法來得到。AcadApplication對象下有四個子對象構(gòu)成,分別是:AcadPreferences對象,通過此對象可以訪問和設(shè)置“選項”對話框中的相關(guān)選項AcadDocuments對象,它表示AutoCAD圖形AcadMenuBar對象,它表示AutoCAD主菜單欄(注意不是AcadMenuBars,因為應(yīng)用程序只有一個主菜單欄)AcadMenuGroups對象,它表示AutoCAD菜單和工具欄上面介紹了AutoCADActiveX接口對象模型的大致組成,下面重點介紹AcadDocuments對象,因為大部分的編程都與它有關(guān)。首先大家看到它是復(fù)數(shù)的形式,因此它是當(dāng)前打開的AutoCAD所有圖形的集合,這種對象稱為集合對象(呵呵,好像在講廢話)。集合對象有一些比較重要的方法和特性。其中最主要的是:Count特性用于獲取集合中的對象個數(shù)(從零開始);Item方法用于獲取集合中的任何對象。關(guān)于它們的用法我會在下面的例子中介紹。而AcadDocuments的單數(shù)形式AcadDocument表示當(dāng)前打開的一個AutoCAD圖形。AcadDocument對象由以下幾個主要對象組成:AcadModelSpace集合和AcadPaperSpace集合,提供對圖形對象(直線、圓、等)的訪問AcadLayers、AcadLinetypes和AcadTextStyles,則提供對非圖形對象(圖層、線型、文本樣式等)的訪問AcadPlot對象提供對“打印”對話框中設(shè)置的訪問,并為應(yīng)用過程提供了打印圖形的各種方法AcadUtility對象提供用戶輸入和轉(zhuǎn)換函數(shù)圖形對象的創(chuàng)建使用Add方法,比如要創(chuàng)建一個圓,就是用AddCircle方法,而非圖形對象的創(chuàng)建使用Add方法。下面通過一個簡單的例子來說明上面介紹的內(nèi)容。這個例子是在AutoCAD中建立一個新的層,然后在該層中畫一個紅色的圓和一條綠色的直線。這是程序的源代碼:(請先把上一講中生成的interop.AutoCAD.dll和AutoCADExample.dll文件包含在工程中)usingSystem;usingAcadExample;usingAutoCAD;namespaceCircleLine{//////Class1的摘要說明。///classClass1{//////應(yīng)用程序的主入口點。///[STAThread]staticvoidMain(string[]args){////TODO:在此處添加代碼以啟動應(yīng)用程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論