日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#.NET教程:創(chuàng)建我們自己的Employee對(duì)象

在本文中,我們將創(chuàng)建一個(gè)‘Employee 對(duì)象’(包括一個(gè)圓,一個(gè)橢圓和一個(gè)多行文本對(duì)象),這個(gè)對(duì)象屬于一個(gè)自定義的EmployeeBlock’塊(這個(gè)塊駐留在‘EmployeeLayer’層,當(dāng)在模型空間插入這個(gè)塊的時(shí)候,‘EmployeeLayer’層就會(huì)擁有這個(gè)塊的一個(gè)塊索引)。本章的每一個(gè)步驟中的代碼都可以運(yùn)行,這樣做的目的可以使你更清楚地知道每一部分代碼完成的功能。第一步將簡(jiǎn)要說(shuō)明一下如何在模型空間創(chuàng)建一個(gè)圓。

創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都做網(wǎng)站、網(wǎng)站制作網(wǎng)站開(kāi)發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢(xún)和貼心的售后服務(wù)。歡迎咨詢(xún)做網(wǎng)站需要多少錢(qián):18982081108

這一章的重點(diǎn)是在AutoCAD中訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的基礎(chǔ)。主要內(nèi)容包括事務(wù)處理(Transaction)、對(duì)象Id(ObjectId)、符號(hào)表(symbol tables,如塊表BlockTable和層表LayerTable)以及對(duì)象引用。使用的其它一些對(duì)象如顏色Color、三維點(diǎn)Point3d和三維向量Vector3d,都和各自的步驟有關(guān),但重點(diǎn)應(yīng)該放在數(shù)據(jù)庫(kù)基礎(chǔ)上。

1) 創(chuàng)建一個(gè)名為‘CREATE’的命令,它調(diào)用函數(shù)CreateEmployee()。這個(gè)函數(shù)用來(lái)在模型空間(MODELSPACE)的(10,10,0)點(diǎn)處創(chuàng)建一個(gè)半徑為2.0的圓:

 
 
 
 
  1. [CommandMethod("test")]  
  2.  
  3. public void createCircle()  
  4.  
  5. {  
  6.  
  7. //首先聲明我們要使用的對(duì)象  
  8.  
  9. Circle circle; //這個(gè)是我們要加入到模型空間的圓  
  10.  
  11. BlockTableRecord btr;//要加入圓,我們必須打開(kāi)模型空間  
  12.  
  13. BlockTable bt; //要打開(kāi)模型空間,我們必須通過(guò)塊表(BlockTable)來(lái)訪(fǎng)問(wèn)它  
  14.  
  15. //我們使用一個(gè)名為‘Transaction’的對(duì)象,把函數(shù)中有關(guān)數(shù)據(jù)庫(kù)的操作封裝起來(lái)  
  16.  
  17. Transaction trans;  
  18.  
  19. //使用TransactionManager的StartTransaction()成員來(lái)開(kāi)始事務(wù)處理  
  20.  
  21. trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();  
  22.  
  23. //現(xiàn)在創(chuàng)建圓……請(qǐng)仔細(xì)看這些參數(shù)——注意創(chuàng)建Point3d對(duì)象的‘New’和Vector3d的靜態(tài)成員ZAxis  
  24.  
  25. circle = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 2);  
  26.  
  27. bt = (BlockTable)trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead);  
  28.  
  29. //使用當(dāng)前的空間Id來(lái)獲取塊表記錄——注意我們是打開(kāi)它用來(lái)寫(xiě)入  
  30.  
  31. btr = (BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite );  
  32.  
  33. //現(xiàn)在使用btr對(duì)象來(lái)加入圓  
  34.  
  35. btr.AppendEntity(circle);  
  36.  
  37. trans.AddNewlyCreatedDBObject(circle, true); //并確定事務(wù)處理知道要加入圓!  
  38.  
  39. //一旦完成以上操作,我們就提交事務(wù)處理,這樣以上所做的改變就被保存了……  
  40.  
  41. trans.Commit();  
  42.  
  43. //…然后銷(xiāo)毀事務(wù)處理,因?yàn)槲覀円呀?jīng)完成了相關(guān)的操作(事務(wù)處理不是數(shù)據(jù)庫(kù)駐留對(duì)象,可以銷(xiāo)毀)  
  44.  
  45. trans.Dispose();  
  46.  

請(qǐng)仔細(xì)閱讀一下上面的代碼塊的結(jié)構(gòu),可以通過(guò)注釋來(lái)了解相關(guān)的細(xì)節(jié)。

注意:要編譯代碼,你必須導(dǎo)入Autodesk.AutoCAD.DatabaseServices 和Autodesk.AutoCAD.Geometry命名空間

運(yùn)行這個(gè)函數(shù)來(lái)看看它是否可行。應(yīng)該會(huì)在圖形中創(chuàng)建一個(gè)在(10,10,0)處的半徑為2.0的白色的圓。

2) 我們可以減少代碼的輸入量,這可以通過(guò)聲明一個(gè)Database變量代替HostApplicationServices.WorkingDatabase來(lái)實(shí)現(xiàn):

 
 
 
 
  1. Database db = HostApplicationServices.WorkingDatabase; 

使用這個(gè)變量來(lái)代替在代碼中出現(xiàn)的HostApplicationServices.WorkingDatabase。

3) 在上面的代碼中,我們沒(méi)有使用任何異常處理,而異常處理對(duì)一個(gè)正確的.NET應(yīng)用程序來(lái)說(shuō)是非常重要的。我們要養(yǎng)成使用異常處理的好習(xí)慣,所以讓我們?cè)谶@個(gè)函數(shù)中加入try-catch-finally。

4) 為了使代碼緊湊,我們可以把許多變量的聲明和初始化放在同一個(gè)語(yǔ)句中。現(xiàn)在,你的代碼看起來(lái)應(yīng)該是這樣的:

 
 
 
 
  1. [CommandMethod("CREATE")]  
  2.  
  3. public void CREATEEMPLOYEE()  
  4.  
  5. {  
  6.  
  7. Database db = HostApplicationServices.WorkingDatabase;  
  8.  
  9. Transaction trans = db.TransactionManager.StartTransaction();  
  10.  
  11. try 
  12.  
  13. {  
  14.  
  15. Circle circle = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 2);  
  16.  
  17. BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);  
  18.  
  19. BlockTableRecord btr = (BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite);  
  20.  
  21. btr.AppendEntity(circle);  
  22.  
  23. trans.AddNewlyCreatedDBObject(circle, true);  
  24.  
  25. trans.Commit();  
  26.  
  27. }  
  28.  
  29. catch 
  30.  
  31. {  
  32.  
  33. ed.WriteMessage("Error ");  
  34.  
  35. }  
  36.  
  37. finally 
  38.  
  39. {  
  40.  
  41. trans.Dispose();  
  42.  
  43. }  
  44.  
  45. }  
  46.  
  47. End Function 

運(yùn)行你的代碼來(lái)進(jìn)行測(cè)試……

上面的catch塊只顯示一個(gè)錯(cuò)誤信息。實(shí)際的清理工作是在finally塊中進(jìn)行的。這樣做的理由是如果在事務(wù)處理被提交(Commit())之前,Dispose()被調(diào)用的話(huà),事務(wù)處理會(huì)被銷(xiāo)毀。我們認(rèn)為如果在trans.Commit()之前出現(xiàn)任何錯(cuò)誤的話(huà),你應(yīng)該銷(xiāo)毀事務(wù)處理(因?yàn)镃ommit將永遠(yuǎn)不會(huì)被調(diào)用)。如果在Dispose()之前調(diào)用了Commit(),也就是說(shuō)沒(méi)有任何錯(cuò)誤發(fā)生,那么事務(wù)處理將會(huì)被提交給數(shù)據(jù)庫(kù)。

所以基于上面的分析,Catch塊其實(shí)并不是必須的,因?yàn)樗挥脕?lái)通知用戶(hù)程序出現(xiàn)了一個(gè)錯(cuò)誤。它將在下面的代碼中被去掉。

5) 現(xiàn)在讓我們?cè)贓mployee對(duì)象加入剩下的部分:橢圓和多行文本的實(shí)例。

多行文本實(shí)體:

中心點(diǎn)應(yīng)該與圓心的創(chuàng)建一樣:

(建議:創(chuàng)建一個(gè)名為‘center’而值為10,10,0的Point3d變量來(lái)表示中心點(diǎn))

多行文本的內(nèi)容可以是你的名字。

橢圓(提示:你可以先看一下Ellipse的構(gòu)造函數(shù))

法向量應(yīng)該沿著Z軸(請(qǐng)查看Vector3d類(lèi)型)

主軸設(shè)為Vector3d(3,0,0)(提示:不要忘了用new)

半徑比例設(shè)為0.5

橢圓還必須閉合(也就是說(shuō),開(kāi)始和結(jié)束點(diǎn)必須相同)

運(yùn)行你的代碼來(lái)進(jìn)行測(cè)試……應(yīng)該可以生成一個(gè)圓、一個(gè)橢圓和一個(gè)中心點(diǎn)在10,10,0的多行文本。

注意:和事務(wù)處理對(duì)象有關(guān)的.NET API中的Try-Catch-Finally塊結(jié)構(gòu),應(yīng)該是異常觀察者。實(shí)際上我們是在try塊中實(shí)例化對(duì)象的,但沒(méi)有顯式地銷(xiāo)毀它們。當(dāng)產(chǎn)生異常的時(shí)候可能會(huì)產(chǎn)生問(wèn)題,特別是當(dāng)觀察者注意到我們實(shí)際上用的是封裝的非托管對(duì)象!記住,當(dāng)資源不再使用的時(shí)候,垃圾收集機(jī)制就會(huì)回收內(nèi)存。垃圾收集機(jī)制會(huì)不時(shí)的調(diào)用封裝類(lèi)的Dispose()方法,刪除非托管對(duì)象。

這里還要注意的是Dispose()作用于封裝的非托管類(lèi)對(duì)象的方式取決于對(duì)象是否是數(shù)據(jù)庫(kù)駐留對(duì)象。由非數(shù)據(jù)庫(kù)駐留對(duì)象調(diào)用的Dispose()會(huì)刪除非托管對(duì)象,而由數(shù)據(jù)庫(kù)駐留對(duì)象調(diào)用的Dispose()只是關(guān)閉它們。

6) 接下來(lái)讓我們來(lái)創(chuàng)建一個(gè)新的函數(shù),它用來(lái)新建一個(gè)顏色為黃色,名字為“EmployeeLayer” 的AutoCAD層。

這個(gè)函數(shù)應(yīng)該檢查是否這個(gè)層已經(jīng)存在,但不管這個(gè)層是否存在,函數(shù)都應(yīng)該返回“EmployeeLayer”的ObjectId。下面是這個(gè)函數(shù)的代碼:

 
 
 
 
  1. public ObjectId CreateLayer()  
  2.  
  3. {  
  4.  
  5. ObjectId layerId; //它返回函數(shù)的值  
  6.  
  7. Database db = HostApplicationServices.WorkingDatabase;  
  8.  
  9. Transaction trans = db.TransactionManager.StartTransaction();  
  10.  
  11. //首先取得層表……  
  12.  
  13. LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);  
  14.  
  15. //檢查EmployeeLayer層是否存在……  
  16.  
  17. if (lt.Has("EmployeeLayer"))  
  18.  
  19. {  
  20.  
  21. layerId = lt["EmployeeLayer"];  
  22.  
  23. }  
  24.  
  25. else 
  26.  
  27. {  
  28.  
  29. //如果EmployeeLayer層不存在,就創(chuàng)建它  
  30.  
  31. LayerTableRecord ltr = new LayerTableRecord();  
  32.  
  33. ltr.Name = "EmployeeLayer"; //設(shè)置層的名字  
  34.  
  35. ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2);  
  36.  
  37. layerId = lt.Add(ltr);  
  38.  
  39. trans.AddNewlyCreatedDBObject(ltr, true);  
  40.  
  41. }  
  42.  
  43.  
  44.  
  45. trans.Commit();  
  46.  
  47. trans.Dispose();  
  48.  
  49. return layerId;  
  50.  

是不是覺(jué)得這個(gè)函數(shù)的基本結(jié)構(gòu)與在模型空間加入實(shí)體的代碼比較類(lèi)似?訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法都是這樣的:使用事務(wù)處理來(lái)獲取數(shù)據(jù)庫(kù)對(duì)象,在符號(hào)表(模型空間所在的塊表也是符號(hào)表之一)中加入實(shí)體,然后讓事務(wù)處理知道。

7) 在這個(gè)函數(shù)中加入異常處理,就像在CreateEmployee函數(shù)中的一樣。

8) 接下來(lái),改變新建層的顏色。下面是實(shí)現(xiàn)的代碼片斷,請(qǐng)把它加入到你的代碼中:

 
 
 
 
  1. ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 2) 

注意:ColorMethod.ByAci可以讓我們使用AutoCAD ACI顏色索引……這里為2(表示黃色)。

回到CreateEmployee()函數(shù),加入把上面創(chuàng)建的幾個(gè)實(shí)體設(shè)置到EmployeeLayer層的代碼。聲明一個(gè)類(lèi)型為ObjectId的變量,用CreateLayer函數(shù)的返回值給它賦值。使用每個(gè)實(shí)體(文本、圓和橢圓)的LayerId屬性設(shè)置它們所在的層。

例如: text.LayerId = empId

運(yùn)行代碼來(lái)查看“EmployeeLayer”層是否已被創(chuàng)建,所有已創(chuàng)建的實(shí)體是否都在這一層上(應(yīng)該顯示為黃色)

10) 現(xiàn)在為各個(gè)實(shí)體設(shè)置不同的顏色,可以使用ColorIndex屬性(ColorIndex屬性表示AutoCAD的顏色)

圓為紅色-1

橢圓為綠色-3

文本為黃色-2

運(yùn)行代碼,看看實(shí)體的顏色是否為設(shè)置的值,即使這些實(shí)體是在“EmployeeLayer”層上。

11) 接下來(lái),我們要在AutoCAD數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)獨(dú)立的塊,然后把它插入到塊表而不是模型空間中。

首先把CreateEmployee函數(shù)的名字改為CreateEmployeeDefinition()。

加入以下代碼來(lái)創(chuàng)建一個(gè)獨(dú)立的塊:

 
 
 
 
  1. BlockTableRecord newBtr = new BlockTableRecord();  
  2.  
  3. newBtr.Name = "EmployeeBlock";  
  4.  
  5. newBtrId = bt.Add(newBtr);  
  6.  
  7. trans.AddNewlyCreatedDBObject(newBtr, true);  

12) 現(xiàn)在,請(qǐng)稍微改動(dòng)一下加入實(shí)體到模型空間的代碼(改為加入塊到塊表中,記得加入前要打開(kāi)塊表)。

現(xiàn)在運(yùn)行代碼,然后使用INSERT命令來(lái)檢查是否可以正確插入這個(gè)塊。

13) 最后,我們要?jiǎng)?chuàng)建一個(gè)位于模型空間的塊索引,它表示上面創(chuàng)建的塊的一個(gè)實(shí)例。這一步留給大家練習(xí)。

下面是你要遵循的最基本的步驟:

創(chuàng)建一個(gè)名為CreateEmployee新的函數(shù)

把命令屬性“CREATE”移動(dòng)到CreateEmployee()

修改CreateEmployeeDefintion()來(lái)返回新創(chuàng)建的塊“EmployeeBlock”的ObjectId,操作的步驟請(qǐng)參考CreateLayer()的作法。

你需要修改CreateEmployeeDefintion()來(lái)查看塊表中是否已包含“EmployeeBlock”塊,如果包含這個(gè)塊,則返回它的ObjectId(做法與CreateLayer()一樣)。

提示:把‘bt’的聲明語(yǔ)句移動(dòng)到try塊的頂部,使用BlockTable.Has()方法,把其它的代碼移動(dòng)到else語(yǔ)句:

 
 
 
 
  1. try 
  2.  
  3. {  
  4.  
  5. //獲取BlockTable 對(duì)象  
  6.  
  7. BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);  
  8.  
  9. if ((bt.Has("EmployeeBlock")))  
  10.  
  11. {  
  12.  
  13. newBtrId =bt["EmployeeBlock"];  
  14.  
  15. }  
  16.  
  17. else 
  18.  
  19. {  
  20.  
  21. … 

在新創(chuàng)建的CreateEmployee()函數(shù)中創(chuàng)建一個(gè)新的BlockReference對(duì)象,并把它加入到模型空間。提示:我們可以使用CreateEmployeeDefinition()中引用模型空間的代碼,這些代碼在這里不需要了

在CreateEmployee中調(diào)用CreateEmployeeDefinition()函數(shù),使上面生成的BlockReference對(duì)象的BlockTableRecord()指向CreateEmployeeDefinition()函數(shù)。提示:請(qǐng)參考BlockReference的構(gòu)造函數(shù)。

這樣,我們自己的Employee對(duì)象就創(chuàng)建完成了。


分享名稱(chēng):C#.NET教程:創(chuàng)建我們自己的Employee對(duì)象
瀏覽地址:http://www.dlmjj.cn/article/dppddpo.html