AutoCAD二次開發教程_第1頁
AutoCAD二次開發教程_第2頁
AutoCAD二次開發教程_第3頁
AutoCAD二次開發教程_第4頁
AutoCAD二次開發教程_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第1章HelloWorld:工程的創建在這一章中,我們將不使用ObjectARX向導來創建一個新的工程。我們將使用VisualStudio.NET來創建一個新的類庫工程。通過這個工程,你可以創建一個能被AutoCAD裝載的.NETdll文件。這個dll文件會向AutoCAD加入一個名為“HelloWorld”的新命令。當用戶運行這個命令后,在AutoCAD命令行上將顯示“HelloWorld”文本。1)啟動VisualStudio.NET,選擇”文件新建工程”(FileNewProject)。在新建工程對話框中選擇工程類型為”VisualBasic工程”,然后選擇”類庫”模板,在工程名字框中輸

2、入”Labi”,然后選擇工程存放的位置。點擊確定按鈕來創建工程。2)在工程的Classl.vb文件中,一個公有類“Classi”已經被系統自動創建了。接下來向這個類加入命令。要加入命令,你必須使用AutoCAD.NET托管封裝類。這些托管封裝類包含在兩個托管模塊中。要加入對這兩個托管模塊的引用,請用鼠標右鍵單擊”引用”然后選擇”添加引用”。在彈出的”添加引用”對話框中選擇”瀏覽”。在”選擇組件”對話框中,選擇AutoCAD2006的安裝目錄(這里假定為C:ProgramFilesAutoCAD2006),在這個目錄下找到“acdbmgd.dll”然后選擇并打開它。再一次選擇”瀏覽”,在Auto

3、CAD2006的安裝目錄下找到“acmgd.dll”并打開它。當這兩個組件被加入后,請單擊”添加引用”對話框中的”確定”按鈕。正如它們的名字所表示的acdbmgd.dll包含ObjectDBX托管類,而acmgd.dll包含AutoCAD托管類。3)使用對象瀏覽器(VisualStudio.NET的”查看其它窗口對象瀏覽器”菜單項)來瀏覽加入的兩個托管模塊所提供的類。請展開“AutoCAD.NETManagedWrapper”對象(在對象瀏覽器中顯示為acmgd),在整個教程中我們將使用這個對象中的類。在本章中,我們將使用“Autodesk.AutoCAD.Editorlnput.Editor

4、”類的一個實例來在AutoCAD命令行中顯示文本。請再展開“ObjectDBX.NETManagedWrapper”對象(在對象瀏覽器中顯示為acdbmgd),這個對象中的類將被用來訪問和編輯AutoCAD圖形中的實體(這部分內容將在以后的章節中介紹)。4)引用了ObjectARX.NET封裝類后,我們就可以導入它們。在Classi類的聲明語句(位于Classl.vb文件的頂部的)之前,導入ApplicationServices,EditorInput和Runtime命名空間。ImportsAutodesk.AutoCAD.ApplicationServicesImportsAutodesk.

5、AutoCAD.EditorInputImportsAutodesk.AutoCAD.Runtime5)接下來在類Classi中加入命令。要加入能在AutoCAD中調用的命令,你必須使用“CommandMethod”屬性。這個屬性由Runtime命名空間提供。在類Classi中加入下列屬性和子程序。注意續行符”_”的使用。PublicClassClassiCommandMethod(HelloWorld)_PublicSubHelloWorld()EndSubEndClass6)當“HelloWorld”命令在AutoCAD中運行的時候,上面定義的HelloWorld子程序就會被調用。在這個子

6、程序中,一個Editor類的實例將被創建。Editor類擁有訪問AutoCAD命令行的相關方法,它還包括選擇對象和其它一些重要的功能。AutoCAD當前活動文檔的Editor對象可以使用Application類來訪問。當Editor對象被創建后,你可以使用它的WriteMessage方法在命令行中顯示“HelloWorld”文本。在HelloWorld子程序中加入以下代碼:DimedAsEditor二Application.DocumentManager.MdiActiveDocument.Editored.WriteMessage(HelloWorld)要在AutoCAD中調試這個程序,你可

7、以讓VisualStudio.NET啟動一個AutoCAD進程。在解決方案管理器中右鍵單擊“Labi”,然后選擇”屬性”。在Labi的屬性頁對話框中,選擇”配置屬性調試”。在”啟動”項中,選擇”啟動一個外部程序”,接下來單擊省略號按鈕然后選擇AutoCAD2006安裝目錄下的acad.exe。設置好以后,按F5來啟動一個AutoCAD進程。這樣就會編譯你的程序然后自動啟動AutoCAD,而當編譯后有錯誤的時候就會停止。請修正你可能碰到的任何錯誤。“NETL0AD”命令被用來裝載你剛才編譯的托管程序。在AutoCAD命令行中輸入NETLOAD,會出現”選擇.NET組件”的對話框。選擇上面生成的“

8、lab1.dll”然后打開它。在命令行中輸入“HellowWorld”。如果一切順利的話,命令行中將顯示“HelloWorld”文本。切換到VisualStudio.NET,在ed.WriteMessage(“HelloWorld”);語句處加入一個斷點。在AutoCAD中再次運行HelloWorld命令,你會注意到你可以跟蹤代碼的運行VisulStudio.NET的”調試”菜單有好幾項可以用來跟蹤程序的運行。如果有時間的話,請瀏覽一下CommandMethod屬性。你會發現它有七種不同的形式。在上面的例子中,我們使用了最簡單的形式,它只有一個輸入參數(命令的名字)。你可以使用其它的形式來控制

9、命令的工作方式,例如你可以確定命令組的名字、全局和局部名字、命令標識(命令如何來運行)等。第2章.netAutoCAD向導及簡單用戶輸入在第一章中,我們使用的是類庫模板,這樣就不得不手工加入acdbmdg.dll和acmgd.dll這兩個引用。在這一章中,我們將使用AutoCAD托管C#應用程序向導來創建.NET工程,它會自動加入以上兩個引用。在開始本章之前,你首先得安裝ObjectARX向導(ObjectARX2006開發包的utilsObjARXWizArxWizards.msi)。啟動VisualStudio.NET,選擇”文件新建工程”(FileNewProject)。在新建工程對話框

10、中選擇工程類型為VisualBasic工程”,然后選擇“AutoCADManagedVBProjectApplication”模板。在工程名字框中輸入”Lab2”,然后選擇工程存放的位置。點擊確定按鈕,“AutoCADManagedVBApplicationWizard,對話框將會出現。因為我們不需要使用非托管代碼,所以不要選擇“EnableUnmanagedDebugging項。“ReGISteredDeveloperSymbol將會使用你在安裝ObjectARX向導時輸入的值。單擊”finish”按鈕來創建工程。下面來看一下向導生成的工程。在解決方案瀏覽器中,你會看到acdbmgd和acm

11、gd已經被引用了。在Class.vb文件中,“Autodesk.AutoCAD.Runtime命名空間已被導入,工程使ReturnNothing用“RegisteredDeveloperSymbol”的名字來命名缺省的公有類。向導還為類加入了一個CommandMethod屬性和一個函數,它們用于AutoCAD命令。3)在前一章中,我們使用一個“Autodesk.AutoCAD.Editorlnput.Editor類的實例對象在AutoCAD命令行上輸出文本。在這一章中,我們將使用這個類來提示用戶在AutoCAD圖形中選擇一個點,然后將用戶選擇的點的x,y,z值顯示出來。和前一章一樣,請導入Au

12、todesk.AutoCAD.ApplicationServices和Autodesk.AutoCAD.EditorInput命名空間。ImportsAutodesk.AutoCAD.ApplicationServicesImportsAutodesk.AutoCAD.EditorInput4)把向導生成的CommandMethod屬性的值改為有意義一些的名字如“selectPoint”(函數的名字可以不用修改)。PromptPointOptions類用來設置提示字符串和其它的一些控制提示的選項。這個類的一個實例作為參數被傳入到Editor.GetPoint方法。在函數的開始,實例化這個類,設

13、置字符串參數為Selectapoint。因為Editor.GetPoint方法會返回一個PromptPointResult類的實例對象,所以我們也要把它實例化。DimprPointOptionsAsPromptPointOptions=NewPromptPointOptions(Selectapoint)DimprPointResAsPromptPointResult5)接下來實例化一個Editor類的對象并使用參數為PromptPointOptions對象的GetPoint方法。用GetPoint方法的返回值來給上面聲明的PromptPointResult對象賦值。賦值好以后,我們可以測試P

14、romptPointResult對象的狀態,如果不是OK就返回。DimedAsEditor=Application.DocumentManager.MdiActiveDocument.EditorprPointRes=ed.GetPoint(prPointOptions)IfprPointRes.StatusPromptStatus.OKThen6)如果PromptPointResult對象返回了一個有效的點,我們就可以使用WriteMessage方法把結果輸出到命令行。PromptPointResult.Value的ToString方法使輸出非常容易:ed.WriteMessage(Yous

15、electedpoint&prPointRes.Value.ToString)按F5來運行一個調試AutoCAD的進程。(注意:向導已經設置好用acad.exe來調試)在AutoCAD命令行中輸入NETLOAD,選擇Lab2.dll并打開。在命令行中輸入你起的命令名字(selectPoint)。在選擇點的提示下,單擊圖形中的任一點。如果一切正常的話,你可以在命令行中看到你所選的點的坐標值。在Class.vb文件的“ReturnNothing”行加入斷點,然后再次運行selectPoint命令。這一次,在選擇點的提示下按ESC鍵而不是選擇一個點。PromptPointResult對象的狀態就不是

16、OK了,所以上面代碼中的if語句就會被執行,“ReturnNothing”語句就會被調用。接下來我們將加入另外一個命令,它可以獲取兩個點之間的距離。向導沒有添加命令的功能,所以我們必須手工添加。在Class.vb文件的選擇點的函數(getPoint)下面添加一個名為getDistance的新命令。加入命令的方法請參考上一章的內容或本章的源代碼,這里就不列出了。使用CommandMethod屬性并使字符串參數為getdistance”或其它類似的名字。在命令的函數中使用PromptDistanceOptions代替PromptPointOptions。當然GetDistance方法的返回值是一個

17、PromptDoubleResult類的實例對象,所以請用PromptDoubleResult來代替PromptPointResult:DimprDistOptionsAsPromptDistanceOptions=NewPromptDistanceOptions(Finddistance,selectfirstpoint:)DimprDistResAsPromptDoubleResultprDistRes=ed.GetDistance(prDistOptions)和前面的命令一樣,也可以測試PromptDoubleResult的狀態,然后用WriteMessage方法在命令行中顯示值。Ifp

18、rDistRes.StatusPromptStatus.OKThened.WriteMessage(Thedistanceis:&prDistRes.Value.ToString)第3章數據庫基礎:創建我們自己的Employee對象打開Lab3文件夾下的Lab3工程文件,或或接著Lab2的代碼。在這一章中,我們將創建一個Employee對象,(包括一個圓,一個橢圓和一個多行文本對象),這個對象屬于一個自定義的EmployeeBlock塊(這個塊駐留在EmployeeLayer層,當在模型空間插入這個塊的時候,EmployeeLayer層就會擁有這個塊的一個塊索引)。本章的每一個步驟中的代碼都可

19、以運行,這樣做的目的可以使你更清楚地知道每一部分代碼完成的功能。第一步將簡要說明一下如何在模型空間創建一個圓。這一章的重點是在AutoCAD中訪問數據庫的基礎。主要內容包括事務處理(Transaction)、對象Id(Objectld)、符號表(symboltables,如塊表BlockTable和層表LayerTable)以及對象引用。使用的其它一些對象如顏色Color、三維點Point3d和三維向量Vector3d,都和各自的步驟有關,但重點應該放在數據庫基礎上。1)創建一個名為CREATE的命令,它調用函數CreateEmployee()。這個函數用來在模型空間(MODELSPACE)的

20、(10,10,0)點處創建一個半徑為2.0的圓:PublicFunctionCreateEmployee()首先聲明我們要使用的對象DimcircleAsCircle這個是我們要加入到模型空間的圓DimbtrAsBlockTableRecord要加入圓,我們必須打開模型空間DimbtAsBlockTable要打開模型空間,我們必須通過塊表(BlockTable)來訪問它我們使用一個名為Transaction的對象,把函數中有關數據庫的操作封裝起來DimtransAsTransaction使用TransactionManager的StartTransaction()成員來開始事務處理trans=

21、HostApplicationServices.WorkingDatabase().TransactionManager.StartTransaction()現在創建圓請仔細看這些參數注意創建Point3d對象的New和Vector3d的靜態成員ZAxiscircle=NewCircle(NewPoint3d(10,10,0),Vector3d.ZAxis,2.0)我們需要獲得塊表和模型空間對象注意我們是用事務處理的成員GetObject來獲取它們的bt=trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableld,O

22、penMode.ForRead)現在,我們聲明了一個Objectld對象用來表示模型空間塊表記錄DimbtrIdAsObjectId=bt.Item(btr.ModelSpace)使用這個Objectld對象來獲取塊表記錄對象-注意我們是打開它用來寫入btr=trans.GetObject(btrld,OpenMode.ForWrite)現在使用btr對象來加入圓btr.AppendEntity(circle)trans.AddNewlyCreatedDBObject(circle,True)并確定事務處理知道要加入圓!trans.Commit()一旦完成以上操作,我們就提交事務處理,這樣以上

23、所做的改變就被保存了trans.Dispose()然后銷毀事務處理,因為我們已經完成了相關的操作(事務處理不是數據庫駐留對象,可以銷毀)EndFunction請仔細閱讀一下上面的代碼塊的結構,可以通過注釋來了解相關的細節。注意:要編譯代碼,你必須導入Autodesk.AutoCAD.DatabaseServices和Autodesk.AutoCAD.Geometry命名空間運行這個函數來看看它是否可行。應該會在圖形中創建一個在0,10,0)處的半徑為2.0的白色的圓。2)我們可以減少代碼的輸入量,這可以通過聲明一個Database變量代替HostApplicationServices.Work

24、ingDatabase來實現:DimdbasDatabase=HostApplicationServices.WorkingDatabase()使用這個變量來代替在代碼中出現的HostApplicationServices.WorkingDatabase()。3)注意:bt.Item(btr.ModelSpace)用來獲取模型空間塊表記錄的Objectld。我們也可以使用BlockTable的可數化屬性來做同樣的事:bt(btr.ModelSpace)上面的方法使代碼變得容易和精簡(像下面一樣改變有關的代碼):bt=trans.GetObject(db.BlockTableld,OpenMod

25、e.ForRead)btr=trans.GetObject(bt(btr.ModelSpace),OpenMode.ForWrite)在上面的代碼中,我們沒有使用任何異常處理,而異常處理對一個正確的.NET應用程序來說是非常重要的。我們要養成使用異常處理的好習慣,所以讓我們在這個函數中加入Try-Catch-Finally。為了使代碼緊湊,我們可以把許多變量的聲明和初始化放在同一個語句中。現在,你的代碼看起來應該是這樣的:_PublicFunctionCreateEmployee()DimdbAsDatabase=HostApplicationServices.WorkingDatabase(

26、)DimtransAsTransaction=db.TransactionManager.StartTransaction()TryDimCircleAsCircle=NewCircle(NewPoint3d(10,10,0),Vector3d.ZAxis,2.0)DimbtasBlockTable=trans.GetObject(db.BlockTableld,OpenMode.ForRead)DimbtrasBlockTableRecord=trans.GetObject(bt(btr.ModelSpace),OpenMode.ForWrite)btr.AppendEntity(circl

27、e)trans.AddNewlyCreatedDBObject(circle,True)trans.Commit()CatchMsgBox(ErrorAddingEntities)Finallytrans.Dispose()EndTryEndFunction運行你的代碼來進行測試上面的catch塊只顯示一個錯誤信息。實際的清理工作是在finally塊中進行的。這樣做的理由是如果在事務處理被提交(Commit。)之前,Dispose()被調用的話,事務處理會被銷毀。我們認為如果在trans.Commit()之前出現任何錯誤的話,你應該銷毀事務處理(因為Commit將永遠不會被調用)。如果在Dis

28、pose()之前調用了Commit。,也就是說沒有任何錯誤發生,那么事務處理將會被提交給數據庫。所以基于上面的分析,Catch塊其實并不是必須的,因為它只用來通知用戶程序出現了一個錯誤。它將在下面的代碼中被去掉。6)現在讓我們在Employee加入剩下的部分:橢圓和多行文本的實例。現在讓我們在Employee加入剩下的部分:橢圓和多行文本的實例。多行文本實體:中心點應該與圓心的創建一樣:(建議:創建一個名為center而值為10,10,0的Point3d變量來表示中心點)多行文本的內容可以是你的名字。橢圓(提示:你可以先看一下Ellipse的構造函數)法向量應該沿著Z軸(請查看Vector3d

29、類型)主軸設為Vector3d(3,0,0)(提示:不要忘了用new)半徑比例設為0.5橢圓還必須閉合(也就是說,開始和結束點必須相同)運行你的代碼來進行測試應該可以生成一個圓、一個橢圓和一個中心點在10,10,0的多行文本。注意:和事務處理對象有關的.NETAPI中的Try-Catch-Finally塊結構,應該是異常觀察者。實際上我們是在try塊中實例化對象的,但沒有顯式地銷毀它們。當產生異常的時候可能會產生問題,特別是當觀察者注意到我們實際上用的是封裝的非托管對象!記住,當資源不再使用的時候,垃圾收集機制就會回收內存。垃圾收集機制會不時的調用封裝類的Dispose()方法,刪除非托管對象

30、。這里還要注意的是Dispose()作用于封裝的非托管類對象的方式取決于對象是否是數據庫駐留對象。由非數據庫駐留對象調用的Dispose()會刪除非托管對象,而由數據庫駐留對象調用的Dispose()只是關閉它們。7)接下來讓我們來創建一個新的函數,它用來新建一個顏色為黃色,名字為EmployeeLayer的AutoCAD層。這個函數應該檢查是否這個層已經存在,但不管這個層是否存在,函數都應該返回EmployeeLayer的Objectld。下面是這個函數的代碼:PublicFunctionCreateLayer()AsObjectldDimlayerIdAsObjectId它返回函數的值Di

31、mdbAsDatabase=HostApplicationServices.WorkingDatabaseDimtransAsTransaction=db.TransactionManager.StartTransaction()首先取得層表DimltAsLayerTable=trans.GetObject(db.LayerTableld,OpenMode.ForWrite)檢查EmployeeLayer層是否存在Iflt.Has(EmployeeLayer)ThenlayerId=lt.ltem(EmployeeLayer)Else如果EmployeeLayer層不存在,就創建它Dimltr

32、AsLayerTableRecord=NewLayerTableRecord()ltr.Name=EmployeeLayer/設置層的名字layerId=lt.Add(ltr)trans.AddNewlyCreatedDBObject(ltr,True)EndIftrans.Commit()trans.Dispose()ReturnlayerldEndFunction是不是覺得這個函數的基本結構與在模型空間加入實體的代碼比較類似?訪問數據庫的方法都是這樣的:使用事務處理來獲取數據庫對象,在符號表(模型空間所在的塊表也是符號表之一)中加入實體,然后讓事務處理知道。8)在這個函數中加入異常處理,就

33、像在CreateEmployee函數中的一樣。9)接下來,改變新建層的顏色。下面是實現的代碼片斷,請把它加入到你的代碼中:ltr.Color=Color.FromColorlndex(ColorMethod.ByAci,2)注意:ColorMethod.ByAci可以讓我們使用AutoCADACI顏色索引這里為2(表示黃色)。10)回到CreateEmployee(),加入把上面創建的幾個實體設置到EmployeeLayer層的代碼。聲明一個類型為ObjectId的變量,用CreateLayer函數的返回值給它賦值。使用每個實體(文本、圓和橢圓)的LayerId屬性設置它們所在的層。例如:te

34、xt.LayerId=empId運行代碼來查看EmployeeLayer層是否已被創建,所有已創建的實體是否都在這一層上(應該顯示為黃色)11)現在為各個實體設置不同的顏色,可以使用ColorIndex屬性(ColorIndex屬性表示AutoCAD的顏色)圓為紅色一1橢圓為綠色一3文本為黃色一2運行代碼,看看實體的顏色是否為設置的值,即使這些實體是在EmployeeLayer層上。12)接下來,我們要在AutoCAD數據庫中創建一個獨立的塊,然后把它插入到塊表而不是模型空間中。首先把CreateEmployee函數的名字改為CreateEmployeeDefinition()。加入以下代碼來創建一個獨立的塊:DimmyBtrAsBlockTableRecord=NewBlockTableRecord()m

溫馨提示

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

評論

0/150

提交評論