利用Csharp進行AutoCAD二次開發_第1頁
利用Csharp進行AutoCAD二次開發_第2頁
利用Csharp進行AutoCAD二次開發_第3頁
利用Csharp進行AutoCAD二次開發_第4頁
利用Csharp進行AutoCAD二次開發_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

利用Csharp進行AutoCAD二次開發利用Csharp進行AutoCAD二次開發利用Csharp進行AutoCAD二次開發利用C#進行AutoCAD的二次開發(一)轉自明經通道

盡人皆知,對

AutoCAD

進行二次開發用到的主要

工擁有:ObjectArx,VBA,VLisp

。但它們的優弊端是不言而喻的

:ObjectArx

功能興盛,編

程效率高,但它的弊端是編程者必然掌握

VC++,而這門語言特其余難學

;VBA

和VLisp

固然簡單易上手

,但它們對于開發大型的程序好象無

能為力。那終究有沒有一種語言能聯合它們的長處而盡量防范它們的弊端呢

?回答是必然的

,那就是微軟新推出的

21世紀編程語言

C#。

對于C#的詳盡介紹,大家能夠參照有關的文章。C#是經過

AutoCADActiveX

這座橋梁來和

AutoCAD

之間進行通信的。

AutoCADActiveX

使用戶能夠從

AutoCAD

的內部或外面以

編程方式來操作AutoCAD。它是經過將AutoCAD對象顯示到“外面世界”來做到這一點的。一旦這些對象被顯示,很多不一樣樣的編程語言

和環境就能夠接見它們。對于AutoCADActiveX的狀況,大家能夠參照AutoCAD自帶的幫助。

呵呵,說了這么多無聊的,仍是讓我們經過一個詳盡的例子來說明如何利用C#進行AutoCAD的二次開發吧。在介紹例子以前先講

一下有關的配置:

(1)VisualS(2003和2002都能夠,我用的是2002)(2)AutoCAD2000以上版本(我用的是2004)

這個例子特別簡單,就是經過C#成立的窗體來啟動AutoCAD并畫一條直線。下邊是編程的詳盡步驟:1)經過VisualS成立一C#的windows應用程序。

(2)在“解決方案資源管理器”中右擊“引用”標簽,在彈出的菜單中選擇“增添引用”,在“增添引用”對話框中選擇“com"選項卡下的下拉列表框中的“AutoCAD2004TypeLibrary"項(注意:不一樣樣版本的CAD的數字不一樣樣),單擊右側的“選擇”按鈕,最后單擊下邊的“確立”按鈕。(3)在C#窗體中加入兩個文本框和一個按鈕,分別用于輸入直線起點、終點的坐標和在CAD中畫直線。下邊主要解說一下增添的代碼。

a)在程序的開頭加入:usingAutoCAD;//導入AutoCAD引用空間

(b)在窗體的變量申明部分加入:privateAcadApplicationa;//申明AutoCAD對象

(c)在窗體的結構函數部分加入:a=newAcadApplicationClass( );//創立AutoCAD對象

a.Visible=true;//使AutoCAD可見

(d)在按鈕的信息辦理函數中加入:

double[]startPoint=newdouble[3];//申明直線起點坐標

double[]endPoint=newdouble[3];//申明直線終點坐標

string[]str=textBox1.Text.Split(',');//拿出直線起點坐標輸入文本框的值,文本框的輸入模式為"x,y,z"

for(inti=0;i<3;i++)

startPoint=Convert.ToDouble(str);//將str數組轉為double型

str=textBox2.Text.Split(',');//拿出直線終點坐標輸入文本框的值

for(inti=0;i<3;i++)

endPoint=Convert.ToDouble(str);

a.ActiveDocument.ModelSpace.AddLine(startPoint,endPoint);//在AutoCAD中畫直線

a.Application.Update( );//更新顯示

好了,簡單吧,你能夠試著編譯一下。對于上邊一些語句的用法,我會在下一講中作詳盡介紹。利用C#進行AutoCAD的二次開發(二)大家好,今日我連續給各位介紹利用

C#進行

AutoCAD

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

在前一次的例子中我是經過引用

AutoCAD2004TypeLibrary

來進行

C#與AutoCAD

之間的通信,但這類方法存在兩個致命的弊端。第一

個弊端是每次調試程序的時候

C#都要從頭啟動

AutoCAD

,假如調試的次數特別多(比方追蹤錯誤此后調試)

,那么編程的效率就很低,

因為啟動一次

CAD

仍是需要較長的時間。相對于第一個弊端,第二個弊端則更要命。因為

.NET

自己的問題,

文件

(就是經過它才實現了

C#與AutoCAD

之間的通信)存在著一些

bug,所以固然有時你的代碼是圓滿正確的,但

C#編譯器仍是拋出莫名

其妙的錯誤。那不是完蛋了嗎?我以前有一階段就因為這兩個要命的東東差一點放棄了

C#而想改學

ObjectArx

了,呵呵,可是仍是運氣

好,我有時一次在網上看了一篇外國人寫的文章,他專門介紹了這兩個問題的解決方法。下邊就來解決這兩個問題。

第一來看第二個難題,按以下步驟來進行:1.隨意用VisualStudio.NET成立一個C#應用程序,此后依據上一篇文章中的設置加入AutoCAD2004TypeLibrary,此后不加入任何代碼,編譯你的程序。2.在VisualStudio.NET命令行工具下用ildasm.exe(這個工具能夠在VisualStudio.NET安裝光盤中找到)把文件(這個文件在步驟1中生成的項目的Bin\Release文件夾中)編譯成中間語言Interop.AutoCAD.il。注意:在步驟1中成立的項目的編譯設置為Release模式。ildasm.exe/source/output=Interop.AutoCAD.il又要注意了:把ildasm.exe,放在同一目錄下。3.在記事本中翻開Interop.AutoCAD.il文件,此后查找結尾是“SinkHelper而”開頭為".classprivateautoansisealed_DAcad的語句,把“語句中的private改為public,此后保留Interop.AutoCAD.il文件。4.使用ilasm.exe把Interop.AutoCAD.il文件編譯為文件,相同是在VisualStudio.NET命令行工具下進行。ilasm.exe/dll/output=Interop.AutoCAD.dll文件是在步驟1中生成的。5.明顯你不肯意每次編寫應用程序時都經過上一篇文章中介紹的方法來加入Interop.AutoCAD.dll,那太麻煩了。你能夠用下邊的方法來讓程序自動加入該文件:找到C:\ProgramFiles\Microsoft.NET\PrimaryInteropAssemblies文件夾,此后把上邊生成的文件拷貝進去。好了,第二個問題解決了,接下來看第一個。在VBA中,編程者能夠使用GetObject函數來獲得目前活動的AutoCAD對象,但在C#中卻沒有,為了這個函數我幾乎把MSDN給翻遍了,此后去各樣C#論壇問各位妙手,結果都沒獲得解決,呵呵,可能國內使用C#的人比較少吧。仍是在老外的論壇上看到了一篇就是講這個問題的文章才把這個難題給解決了。使用下邊的語句就能夠獲得目前活動的AutoCAD對象了:(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16")(對于CAD2000和CAD2002,則把16改為15)自然以上語句必然在AutoCAD翻開的狀況下才能使用,不然會發生錯誤,對于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

destructor.

protectedvirtualvoidDispose(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中目前文檔的標題。利用C#進行AutoCAD的二次開發(三)

C#才鳥這一講的主要內容是介紹

AutoCAD

對象模型,假如你對

VBA

開發

AutoCAD

認識的話,這部分內容應當是超簡單的。

對象是

AutoCADActiveX

接口的主要結構塊,每一個顯示的對象均精準代表一個

AutoCAD

組件。AutoCADActiveX

接口的主要對象

有:直線、圓弧、文字和注明等圖形對象。

線型與注明款式等款式設置對象

圖層、編組和塊等組織結構對象

視圖與視口等圖形顯示對象。

圖形、AutoCAD應用程序自己也是對象全部對象的根對象是介紹的方法來獲得。

AutoCAD應用程序自己,它用AcadApplication類來表示。獲得目前運轉的

AcadApplication對象下有四個子對象構成,分別是:

AcadApplication

對象能夠使用上一講中

AcadPreferences對象,經過此對象能夠接見和設置“選項”對話框中的有關選項

AcadDocuments對象,它表示AutoCAD圖形

AcadMenuBar對象,它表示AutoCAD主菜單欄(注意不是AcadMenuBars,因為應用程序只有一個主菜單欄)

AcadMenuGroups對象,它表示AutoCAD菜單和工具欄

上邊介紹了AutoCADActiveX接口對象模型的大概構成,下邊要點介紹AcadDocuments對象,因為大多數的編程都與它有關。第一大家

看到它是復數的形式,所以它是目前翻開的AutoCAD全部圖形的會合,這類對象稱為會合對象(呵呵,憂如在講空話)。會合對象有一

些比較重要的方法和特色。此中最主要的是:Count特色用于獲得會合中的對象個數(從零開始);Item方法用于獲得會合中的任何對象。

對于它們的用法我會在下邊的例子中介紹。而AcadDocuments的單數形式AcadDocument表示目前翻開的一個AutoCAD圖形。

AcadDocument對象由以下幾個主要對象構成:AcadModelSpace會合和AcadPaperSpace會合,供給對圖形對象(直線、圓、圓弧等)的接見

AcadLayers、AcadLinetypes和AcadTextStyles,則供給對非圖形對象(圖層、線型、文本款式等)的接見

AcadPlot對象供給對“打印”對話框中設置的接見,并為應用過程供給了打印圖形的各樣方法AcadUtility

對象供給用戶輸入和變換函數

圖形對象的創立使用

Add方法,比方要創立一個圓,就是用

AddCircle

方法,而非圖形對象的創立使用

Add方法。

下邊經過一個簡單的例子來說明上邊介紹的內容。

這個例子是在

AutoCAD

中成立一個新的層,此后在該層中畫一個紅色的圓和一條綠色

的直線。這是程序的源代碼:

(請先把上一講中生成的

AutoCADExample.dll

文件包括在工程中

)

usingSystem;

usingAcadExample;

usingAutoCAD;

namespaceCircleLine

{

///

///Class1的綱領說明。

///

classClass1

{

///

應用程序的主進口點。

///[STAThread]

staticvoidMain(string[]args)

{

//

TODO:在此處增添代碼以啟動應用程序

//

using(AutoCADConnectorconnector=newAutoCADConnector( ))//連結AutoCAD

{AcadDocumentaDocument=connector.Application.ActiveDocument;//獲得目前AutoCAD活動圖形對象double[]center=newDouble[3]{20,20,0};//設置圓心doubleradius=20;//設置圓的半徑double[]startPoint=newDouble[3]{0,0,0};//設置直線的起點double[]endPoint=newDouble[3]{40,40,0};//設置直線的終點AcadLayernewLayer=aDocument.Layers.Add("CircleLine");//創立一個名為CircleLine的新層aDocument.ActiveLayer=newLayer;//把CircleLine層設置為目前層AcadCirclecircle=aDocument.ModelSpace.AddCircle(center,radius);//加入圓AcadLineline=aDocument.ModelSpace.AddLine(startPoint,endPoint);//加入直線circle.color=ACAD_COLOR.acRed;//把圓變成紅色line.color=ACAD_COLOR.acGreen;//把直線變成綠色connector.Application.Update( );//更新顯示

for(inti=0;iConsole.WriteLine("這是第{0}個對象:{1}",i+1,aDocument.ModelSpace.Item(i));//遍歷目前圖形

}

Console.ReadLine( );

}

}

}

好了,今日就到這里。

利用

C#進行

AutoCAD

的二次開發(四)

---使用通用對話框

看了本站出的“AutoCADVBA

開發優異實例教程

”此后,深有啟迪。但書頂用到通用對話框時,

老是調用

windows

api函數,我一看就頭大了。想到

C#能夠調用通用對話框,所以試驗了一下,沒想到在

C#中能夠特別簡單地解決這個問題,下邊就把我

的做法給寫出來。本文的例子是調用顏色對話框,對于其余通用對話框做法是相同的。但因為要使用到

AutoCAD2004

新增添的

TrueColor屬性,所以,本

文所舉的例子只好用于

AutoCAD2004

,對于其余通用對話框

(如文件對話框),則能夠使用其余版本的

AutoCAD。

要求:會用C#編程

讀過我寫的“利用C#進行AutoCAD的二次開發“(在明經通道中有)

開始:

在中新建一C#控制臺程序,在引用選項卡中增添以下類庫:

AcadExample.dllusingSystem;

usingSystem.Drawing;

usingSystem.Collections;

usingSystem.ComponentModel;

usingSystem.Windows.Forms;

usingSystem.Data;

usingAutoCAD;

usingAcadExample;

namespaceWindowsApplication3

{

<summary>

Form1的綱領說明。

</summary>

publicclassForm1:

{

privatebutton1;

<summary>

必需的設計器變量。

</summary>

privatecomponents=null;publicForm1( )

{

//

Windows窗體設計器支持所必需的

//

InitializeComponent( );//

//TODO:在InitializeComponent調用后增添任何結構函數代碼

//

}///<summary>

清理全部正在使用的資源。

</summary>protectedoverridevoidDispose(booldisposing)

{

if(disposing)

{

if(components!=null)

{

components.Dispose( );

}

}

base.Dispose(disposing);

}#regionWindows窗體設計器生成的代碼

<summary>

設計器支持所需的方法-不要使用代碼編寫器改正

此方法的內容。

</summary>

privatevoidInitializeComponent( )

{

this.button1=newSystem.Windows.Forms.Button( );

this.SuspendLayout( );

//

button1

=newSystem.Drawing.Point(96,112);="button1";=newSystem.Drawing.Size(64,32);

=0;

="確立";

+=newSystem.EventHandler(this.button1_Click);

//

Form1

this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);

this.ClientSize=newSystem.Drawing.Size(280,213);

this.Controls.Add(this.button1);

this.Name="Form1";

this.Text="Form1";

this.ResumeLayout(false);}

#endregion///<summary>

應用程序的主進口點。

</summary>

[STAThread]

staticvoidMain( )

{

Application.Run(newForm1( ));}privatevoidbutton1_Click(objectsender,System.EventArgse)

{

AutoCADConnectorconnector=newAutoCADConnector( );AcadDocumentdocument=connector.Application.ActiveDocument;AcadAcCmColorcolor=(AcadAcCmColor)document.Application.GetInterfaceObject("AutoCAD.AcCmColor.16");

//新建一AcadAcCmColor對象,該對象用來給直線的顏色屬性賦值

AcadLineline=document.ModelSpace.AddLine(newdouble[]{0,0,0},newdouble[]{200,200,0});

//加入直線

ColorDialogdlg=newColorDialog( );//生成一顏色對話框

if(dlg.ShowDialog( )==DialogResult.OK)//顯示顏色對話框,并按確立按鈕后

{

color.SetRGB(dlg.Color.R,dlg.Color.G,dlg.Color.B);//設置顏色為顏色對話框中選擇的顏色

line.TrueColor=color;//設置直線的顏色

}

line.Update( );//更新顯示

}

}

}給AutoCAD的對象設置顏色,注意不是使用Color屬性,而是使用TrueColor

須使用GetInterfaceObject方法而不可以夠用newAcadAcCmColor( )方法申明。

屬性。TrueColor

屬性是一個

AcadAcCmColor

對象,它必

給AcadAcCmColor

對象設置顏色時,因為要使用

.net顏色對話框中選擇的值,所以可使用

SetRGB的方法,它的三個參數分別是

RGB顏

色的紅,綠,藍的值。在C#中使用ObjectDBX技術從未翻開圖形中獲得圖塊的信息

C#才鳥(QQ:2491785)

從未翻開圖形中能獲得圖塊的信息嗎?明經通道的VBA版塊已經介紹了VBA的實現方法,那在C#中可否做到呢?

回答是必然的。下邊就來說明詳盡的實現方法。

要求:

會用C#編程

讀過我寫的“利用C#進行AutoCAD的二次開發“(在明經通道中有)

開始:

在中新建一C#控制臺程序

在引用選項卡中增添以下類庫:

AcadExample.dll

ObjectDBX16(在“解決方案資源管理器”中右擊“引用”標簽,在彈出的菜單中選擇“增添引用”,在“增添引用”對話框中選擇

“com"選項卡下的下拉列表框中的“AutoCAD/ObjectDBXCommon16.0TypeLibrary"項)

此后鍵入以下代碼:

usingSystem;

usingAutoCAD;

usingdbx=AXDBLib;

usingAcadExample;

5:

namespaceConsoleApplication1

{

///<summary>

///SummarydescriptionforClass1.

///</summary>

classClass1

{

///<summary>

///Themainentrypointfortheapplication.

///</summary>

[STAThread]

staticvoidMain(string[]args)

{

using(AutoCADConnectorconnector=newAutoCADConnector( ))

{

21:stringprogid="ObjectDBX.AxDbDocument.16"http://注意,這是AutoCAD2004的寫法,//假如AutoCAD2002和AutoCAD2000i則是”“22:AcadApplicationacadApp=connector.Application;23:dbx.AxDbDocumentdbxDoc;24:dbxDoc=(dbx.AxDbDocument)acadApp.GetInterfaceObject(progid);25:dbxDoc.Open(@"F:\Test.dwg");26:foreach(dbx.AcadEntityentityindbxDoc.ModelSpace)27:{28:if(entity.EntityName=="AcDbBlockReference")//判斷實體是不是塊參照29:{30:dbx.AcadBlockReferenceblkRef;31:blkRef=(dbx.AcadBlockReference)entity;//將是塊參照的實體強迫變換為塊參照種類32:object[]atts=(object[])blkRef.GetAttributes( );//獲得塊參照中的屬性(為對象種類)33:for(inti=0;i<atts.Length;i++)//遍歷塊參照屬性34:{35:dbx.AcadAttributeReferenceatt;36:att=(dbx.AcadAttributeReference)atts;//將塊參照屬性(對象種類)強迫變換為塊參照屬性種類37:Console.WriteLine("Tag:{0}\tValue:{1}\n",38:att.TagString,39:att.TextString);//顯示塊參照屬性的Tag和Text的值40:}41:}42:}43:Console.ReadLine( );}

}

}

}

第一個要注意的是第三行,使用了一個又名。因為AutoCAD和ObjectDBX命名空間有很多相同的類名,所以,你必然使用全名,而不可以夠使

用簡寫的形式,但ObjectDBX寫起來比較麻煩,所以用又名dbx來使輸入方便一些。

程序前面部分的代碼,你能夠參照我寫的“利用C#進行AutoCAD的二次開發“這篇文章。讓我們來看第21行,程序定義了一個字符串progid,作為第24句的函數GetInterfaceObject的參數,該函數是用來產生一個AxDbDocument對象。但要注意,Get

溫馨提示

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

評論

0/150

提交評論