亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Autodesk官方最新的.NET教程(三)(C#版)

2019-11-18 19:18:07
字體:
來源:轉載
供稿:網友

第 3 章  數據庫基礎:  創建我們自己的Employee 對象

打開Lab3文件夾下的Lab3工程文件,或或接著Lab2的代碼。

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

 

 

這一章的重點是在AutoCAD中訪問數據庫的基礎。主要內容包括事務處理(Transaction)、對象Id(ObjectId)、符號表(symbol tables,如塊表BlockTable和層表LayerTable)以及對象引用。使用的其它一些對象如顏色Color、三維點Point3d和三維向量Vector3d,都和各自的步驟有關,但重點應該放在數據庫基礎上。

1)    創建一個名為‘CREATE’的命令,它調用函數CreateEmployee()。這個函數用來在模型空間(MODELSPACE)的(10,10,0)點處創建一個半徑為2.0的圓:

[CommandMethod("test")]

public void createCircle()

{

 

//首先聲明我們要使用的對象

Circle circle; //這個是我們要加入到模型空間的圓

BlockTableRecord btr;//要加入圓,我們必須打開模型空間

BlockTable bt; //要打開模型空間,我們必須通過塊表(BlockTable)來訪問它

 

//我們使用一個名為‘Transaction’的對象,把函數中有關數據庫的操作封裝起來

Transaction trans;

 

//使用TransactionManager的StartTransaction()成員來開始事務處理

trans = HostapplicationServices.WorkingDatabase.TransactionManager.StartTransaction();

 

//現在創建圓……請仔細看這些參數——注意創建Point3d對象的‘New’和Vector3d的靜態成員ZAxis

circle = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 2);

bt = (BlockTable)trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead);

 

//使用當前的空間Id來獲取塊表記錄——注意我們是打開它用來寫入

btr = (BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite );

 

//現在使用btr對象來加入圓

btr.AppendEntity(circle);

trans.AddNewlyCreatedDBObject(circle, true); //并確定事務處理知道要加入圓!

 

//一旦完成以上操作,我們就提交事務處理,這樣以上所做的改變就被保存了……

trans.Commit();

 

//…然后銷毀事務處理,因為我們已經完成了相關的操作(事務處理不是數據庫駐留對象,可以銷毀)

trans.Dispose();

 

}

 

 

請仔細閱讀一下上面的代碼塊的結構,可以通過注釋來了解相關的細節。

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

運行這個函數來看看它是否可行。應該會在圖形中創建一個在(10,10,0)處的半徑為2.0的白色的圓。

 

2)    我們可以減少代碼的輸入量,這可以通過聲明一個Database變量代替HostApplicationServices.WorkingDatabase來實現:

           Database db = HostApplicationServices.WorkingDatabase;

 

使用這個變量來代替在代碼中出現的HostApplicationServices.WorkingDatabase。

 

3)    在上面的代碼中,我們沒有使用任何異常處理,而異常處理對一個正確的.NET應用程序來說是非常重要的。我們要養成使用異常處理的好習慣,所以讓我們在這個函數中加入try-catch-finally。

4)    為了使代碼緊湊,我們可以把許多變量的聲明和初始化放在同一個語句中?,F在,你的代碼看起來應該是這樣的:

 

 [CommandMethod("CREATE")]

public void CREATEEMPLOYEE()

{

 

Database db = HostApplicationServices.WorkingDatabase;

Transaction trans = db.TransactionManager.StartTransaction();

    try

   {

Circle circle = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 2);

BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);

BlockTableRecord btr = (BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite);

btr.AppendEntity(circle);

trans.AddNewlyCreatedDBObject(circle, true);

trans.Commit();

  }

 

 

 catch

  {

ed.WriteMessage("Error ");

 }

finally

{

trans.Dispose();

}

}

End Function

 

運行你的代碼來進行測試……

上面的catch塊只顯示一個錯誤信息。實際的清理工作是在finally塊中進行的。這樣做的理由是如果在事務處理被提交(Commit())之前,Dispose()被調用的話,事務處理會被 銷毀。我們認為如果在trans.Commit()之前出現任何錯誤的話,你應該銷毀事務處理(因為Commit將永遠不會被調用)。如果在Dispose()之前調用了Commit(),也就是說沒有任何錯誤發生,那么事務處理將會被提交給數據庫。

所以基于上面的分析,Catch塊其實并不是必須的,因為它只用來通知用戶程序出現了一個錯誤。它將在下面的代碼中被去掉。

5)    現在讓我們在Employee加入剩下的部分:橢圓和多行文本的實例。

       多行文本實體:

              中心點應該與圓心的創建一樣:

                     (建議:創建一個名為‘center’而值為10,10,0的Point3d變量來表示中心點)

              多行文本的內容可以是你的名字。

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

              法向量應該沿著Z軸(請查看Vector3d類型)

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

              半徑比例設為0.5

              橢圓還必須閉合(也就是說,開始和結束點必須相同)

運行你的代碼來進行測試……應該可以生成一個圓、一個橢圓和一個中心點在10,10,0的多行文本。

注意:和事務處理對象有關的.NET API中的Try-Catch-Finally塊結構,應該是異常觀察者。實際上我們是在try塊中實例化對象的,但沒有顯式地銷毀它們。當產生異常的時候可能會產生問題,特別是當觀察者注意到我們實際上用的是封裝的非托管對象!記住,當資源不再使用的時候,垃圾收集機制就會回收內存。垃圾收集機制會不時的調用封裝類的Dispose()方法,刪除非托管對象。

這里還要注意的是Dispose()作用于封裝的非托管類對象的方式取決于對象是否是數據庫駐留對象。由非數據庫駐留對象調用的Dispose()會刪除非托管對象,而由數據庫駐留對象調用的Dispose()只是關閉它們。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

6)         接下來讓我們來創建一個新的函數,它用來新建一個顏色為黃色,名字為“EmployeeLayer” 的AutoCAD層。

這個函數應該檢查是否這個層已經存在,但不管這個層是否存在,函數都應該返回“EmployeeLayer”的ObjectId。下面是這個函數的代碼:

public ObjectId CreateLayer()

{

ObjectId layerId; //它返回函數的值

Database db = HostApplicationServices.WorkingDatabase;

Transaction trans = db.TransactionManager.StartTransaction();

//首先取得層表……

LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);

//檢查EmployeeLayer層是否存在……

if (lt.Has("EmployeeLayer"))

{

         layerId = lt["EmployeeLayer"];

}

else

{

//如果EmployeeLayer層不存在,就創建它

LayerTableRecord ltr = new LayerTableRecord();

ltr.Name = "EmployeeLayer"; //設置層的名字

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

layerId = lt.Add(ltr);

trans.AddNewlyCreatedDBObject(ltr, true);

}

 

trans.Commit();

trans.Dispose();

return layerId;

}

 

是不是覺得這個函數的基本結構與在模型空間加入實體的代碼比較類似?訪問數據庫的方法都是這樣的:使用事務處理來獲取數據庫對象,在符號表(模型空間所在的塊表也是符號表之一)中加入實體,然后讓事務處理知道。

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

8)    接下來,改變新建層的顏色。下面是實現的代碼片斷,請把它加入到你的代碼中:

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

 

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

<!--[if !supportLists]-->9)                   <!--[endif]-->回到CreateEmployee()函數,加入把上面創建的幾個實體設置到EmployeeLayer層的代碼。聲明一個類型為ObjectId的變量,用CreateLayer函數的返回值給它賦值。使用每個實體(文本、圓和橢圓)的LayerId屬性設置它們所在的層。

 

例如: text.LayerId = empId

 

運行代碼來查看“EmployeeLayer”層是否已被創建,所有已創建的實體是否都在這一層上(應該顯示為黃色)

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

       圓為紅色-1

       橢圓為綠色-3

       文本為黃色-2

 

運行代碼,看看實體的顏色是否為設置的值,即使這些實體是在“EmployeeLayer”層上。

11)   接下來,我們要在AutoCAD數據庫中創建一個獨立的塊,然后把它插入到塊表而不是模型空間中。

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

加入以下代碼來創建一個獨立的塊:

 

BlockTableRecord newBtr = new BlockTableRecord();

newBtr.Name = "EmployeeBlock";

newBtrId = bt.Add(newBtr);

trans.AddNewlyCreatedDBObject(newBtr, true);

              

 

12)   現在,請稍微改動一下加入實體到模型空間的代碼(改為加入塊到塊表中,記得加入前要打開塊表)。

現在運行代碼,然后使用INSERT命令來檢查是否可以正確插入這個塊。

 

13)   最后,我們要創建一個位于模型空間的塊索引,它表示上面創建的塊的一個實例。這一步留給大家練習。

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

<!--[if !supportLists]-->A)                  <!--[endif]-->創建一個名為CreateEmployee新的函數

<!--[if !supportLists]-->B)                  <!--[endif]-->把命令屬性“CREATE”移動到CreateEmployee()

<!--[if !supportLists]-->C)                  <!--[endif]-->修改CreateEmployeeDefintion()來返回新創建的塊“EmployeeBlock”的ObjectId,操作的步驟請參考CreateLayer()的作法。

<!--[if !supportLists]-->D)                  <!--[endif]-->你需要修改CreateEmployeeDefintion()來查看塊表中是否已包含“EmployeeBlock”塊,如果包含這個塊,則返回它的ObjectId(做法與CreateLayer()一樣)。

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

try

                     {

      //獲取BlockTable 對象

BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);

                            if ((bt.Has("EmployeeBlock")))

                            {

                                   newBtrId =bt["EmployeeBlock"];

                            }

                            else

      {

  …

 

<!--[if !supportLists]-->E)                  <!--[endif]-->在新創建的CreateEmployee()函數中創建一個新的BlockReference對象,并把它加入到模型空間。提示:我們可以使用CreateEmployeeDefinition()中引用模型空間的代碼,這些代碼在這里不需要了

<!--[if !supportLists]-->F)                  <!--[endif]-->在CreateEmployee中調用CreateEmployeeDefinition()函數,使上面生成的BlockReference對象的BlockTableRecord()指向CreateEmployeeDefinition()函數。提示:請參考BlockReference的構造函數。

 

附加的問題:

讓我們來看一下代碼的運行情況,執行命令會生成一個EmployeeBlock的塊索引,你會看到它被插入到20,20,0而不是10,10,0。為什么?

如果你知道原因,那么怎樣才能使塊索引插入到正確的點?

當你用List命令查看塊索引時,它會告訴你它位于0層(或者當命令運行時位于當前層)。為什么?

怎樣才能讓塊索引總是位于EmployeeLayer層?


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美一二三区| 欧美大片在线看免费观看| 九九热99久久久国产盗摄| 亚洲日本aⅴ片在线观看香蕉| 久久天天躁狠狠躁夜夜av| 91视频8mav| 亚洲一区二区三区成人在线视频精品| 国产精品入口免费视频一| 国产精品免费久久久久久| 久久久噜噜噜久噜久久| 欧美一级大胆视频| 在线视频欧美日韩| 欧美国产亚洲精品久久久8v| 日韩美女免费线视频| 欧美激情精品久久久久久大尺度| 亚洲天堂2020| 91视频国产一区| 久久综合电影一区| 国产精品成人在线| 91精品啪aⅴ在线观看国产| 欧美成人小视频| 日本高清久久天堂| 欧美多人乱p欧美4p久久| 欧美美女18p| 日韩亚洲国产中文字幕| 亚洲精品久久久久久久久久久久久| 在线精品国产欧美| 国产成人+综合亚洲+天堂| 国产精品一区二区三区成人| 欧美最猛性xxxxx(亚洲精品)| 91免费综合在线| 国产91免费看片| 中文字幕精品—区二区| 午夜精品在线视频| 亚洲成人av在线播放| 亚洲美女性生活视频| 久久精品人人爽| 亚洲国产精品99| 国产日产欧美a一级在线| 免费99精品国产自在在线| 91久久精品美女高潮| 欧美日韩国产91| 97香蕉超级碰碰久久免费的优势| 永久免费看mv网站入口亚洲| 亚洲性日韩精品一区二区| 国产午夜精品视频免费不卡69堂| 国产国语刺激对白av不卡| 久久免费视频网| 欧美日韩在线观看视频小说| 亚洲欧洲中文天堂| 国产精品高潮在线| 久久青草福利网站| 国产精品欧美在线| 少妇久久久久久| 91欧美精品午夜性色福利在线| www.色综合| 欧美性受xxxx白人性爽| 理论片在线不卡免费观看| 国产精品爽爽爽| 亚洲精品综合精品自拍| 日韩专区中文字幕| 中文字幕日本精品| 在线日韩中文字幕| 国产精品激情av在线播放| 亚洲综合中文字幕在线| 亚洲va久久久噜噜噜久久天堂| 亚洲精品短视频| 日韩欧美国产网站| 久久激情视频免费观看| 国产亚洲免费的视频看| 亚洲第一精品夜夜躁人人躁| 国内精品视频久久| 精品成人在线视频| 国产成人在线播放| 成人免费网站在线| 91精品国产自产在线观看永久| 国产精品视频一| 国产精品嫩草影院一区二区| 北条麻妃一区二区三区中文字幕| 欧美日本黄视频| 久久久女女女女999久久| 国产拍精品一二三| 亚洲精品永久免费精品| 国产精品一区二区女厕厕| 秋霞午夜一区二区| 人人做人人澡人人爽欧美| 日韩激情在线视频| 亚洲精品久久久久久久久久久久久| 97视频在线观看网址| 97香蕉久久超级碰碰高清版| 国产精品第10页| 91在线|亚洲| 一区二区三区四区视频| 亚洲色图偷窥自拍| 久久亚洲私人国产精品va| 国内揄拍国内精品| 夜夜嗨av一区二区三区四区| 欧美视频专区一二在线观看| 国产中文欧美精品| 中文字幕精品一区久久久久| 国产精品三级美女白浆呻吟| 国产亚洲视频中文字幕视频| 亚洲图中文字幕| 亚洲精品久久久久久久久| 欧洲永久精品大片ww免费漫画| 最好看的2019的中文字幕视频| 2023亚洲男人天堂| 91精品国产色综合久久不卡98口| 欧美中文在线字幕| 国产精品美女久久久久久免费| 日韩亚洲欧美中文在线| 亚洲丁香婷深爱综合| 在线播放日韩专区| 在线观看视频亚洲| 亚洲电影天堂av| 97精品久久久中文字幕免费| 久久九九有精品国产23| 亚洲人成免费电影| 欧美在线激情网| 欧美激情视频在线观看| 日韩精品免费观看| 最新91在线视频| 亚洲欧美中文日韩v在线观看| 成人在线视频福利| 91免费福利视频| 亚洲国产欧美一区| 91色中文字幕| 亚洲第一精品自拍| 久久久精品一区| 色噜噜亚洲精品中文字幕| 黄色精品在线看| 亚洲欧洲在线免费| 91久久久亚洲精品| 91精品国产91久久久久久不卡| 日韩中文字幕不卡视频| 日韩中文字在线| 成人午夜在线观看| 国产欧美在线看| 欧美激情网友自拍| 日本高清视频一区| 69av视频在线播放| 福利二区91精品bt7086| 91亚洲精华国产精华| 欧美激情一二区| 久久人人爽人人爽爽久久| 欧美日韩免费区域视频在线观看| 日韩中文字幕在线播放| 成人激情黄色网| 国产91精品视频在线观看| 亚洲精品久久在线| 日韩免费在线电影| 精品国产乱码久久久久久婷婷| 国产一区二区丝袜高跟鞋图片| 国产精品男人的天堂| 中文日韩在线观看| 国产精品∨欧美精品v日韩精品| 欧美日韩国产一区二区三区| 国产精品久久久久aaaa九色| 成人a免费视频| 欧美国产日韩二区| 亚洲精品xxx| 成人激情视频在线播放| 国产一区二区三区在线看| 在线精品视频视频中文字幕|