cad.net開發小結——層次結構
CAD圖紙DWG就是一個資料庫。個人覺得可以理解為一個”樹形資料庫“,包含了資料庫、實體、容器、符號表、字典等等內容。這些內容又都可以稱之為物件,包括資料庫本身也可以稱之為物件。
每一個DWG檔案,都會包含:九個固定的符號表和一個有名物件字典。符號表,每個符號表只能儲存特定型別的物件,字典則是一個通用的容器可以儲存任何型別的物件。
對於符號表和有名物件詞典的區別、用法,需要在使用的時候感受。用文字比較難表達。甚至DWG資料庫中各物件的層次,也是需要通過實際的使用,在程式碼中去做以區分。
常用的物件及其呼叫關係:
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Application = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using DataTable = Autodesk.AutoCAD.DatabaseServices.DataTable;
//文件
Document doc = Application.DocumentManager.MdiActiveDocument;
//資料庫物件
//兩種方式
Database db = HostApplicationServices.WorkingDatabase;
Database db = Application.DocumentManager.MdiActiveDocument.Database;
//編輯器
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
//獲得塊id
ObjectId blockTableId = db.BlockTableId;
//開啟一個事務
//使用using,當using結束時,整個using塊中的程式碼被及時釋放,減少資源的佔用
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//塊表
BlockTable blockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
//塊表記錄
//根據塊表獲取塊表記錄,BlockTable[BlockTableRecord.ModelSpace]
BlockTableRecord record = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
//建立一個實體(可以是引線、圓圈等等)
Entity entity = new Entity();
//向資料庫
tr.AddNewlyCreateDBObject(entity, true);
//第一種選擇集的使用方式
//getentity(string message),輸入的字串主要是做提示用,該字串會在CAD下方的命令列中展示、也會在滑鼠上有所提示
PromptEntityResult ent = ed.GetEntity("\n請選擇一個引線");
MLeader mleader = tr.GetObject(ent.ObjectId, OpenMode.ForWrite, true) as MLeader;
//或者。tr.getobject的返回值型別即為Entity
Entity entity = tr.GetObject(ent.ObjectId, OpenMode.ForWrite, true);
//第二種選擇集的使用方式
//定義好強制輸入的型別
PromptEntityOptions peo = new PromptEntityOptions("\n請選擇塊:");
peo.SetRejectMessage("\n選擇的必須是塊");
peo.AddAllowedClass(typeof(BlockReference), false);
PromptEntityResult res = ed.GetEntity(peo);
//當找到了匹配的實體型別,則status即為OK
//開啟原始碼可查:OK Other Naone Modeless Error Cancel Keyword
if (res.Status != PromptStatus.OK)
return null;
//屬性塊 //建立一個屬性塊的系列操作:
//首先在CAD圖紙上建立一個名為norm的塊
//然後通過blockTable["norm"]得到這個塊的ObjectId
//新建一個塊參照並設定插入點。型別為norm(塊定義的名稱即為塊參照的型別)
PromptPointResult pt = ed.GetPoint("\n選取屬性塊生成位置:");
Point3d position = (Point3d)pt.Value;
BlockReference br = new BlockReference(position, blockTable["norm"]);
ed.WriteMessage("\n新建立的塊參照是否為空? -> "+(br == null).ToString() + " 塊參照名稱:" + br.Name);
BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
//塊參照id
//ObjectId brId = br.ObjectId;
ObjectId brId = space.AppendEntity(br);//把塊參照新增到模型空間
//資料字典
DBDictionary DictForRead = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
//操作結束之後,關閉事務
tr.Commit();
}
CAD中所有物件都放在這些容器物件中,符號表和有名物件字典都具有相同的功能——組織和管理CAD資料庫中的物件
——即他們含有實體物件,但是可以通過文字字串作為關鍵字對物件實體進行查詢,並向這些容器中新增記錄(記錄即物件)、修改記錄
符號表與字典的不同:符號表有九種,每種符號表只能儲存特點型別的物件(如塊表只能儲存塊表記錄、層表只能記錄層表記錄),而字典則是一種通用容器,可儲存任何型別的物件。(一般多是通過符號表操作物件)
塊表 | 尺寸標註樣式表 | 層表 | 線型表 | 應用程式登錄檔 | 文字樣式表 | 使用者座標系表 | 視口表 | 檢視表 |
---|---|---|---|---|---|---|---|---|
BlockTable | DimStyleTable | LayerTable | LinetypeTable | RegAppTable | TextStyleTable | UCSTable | ViewportTable | ViewTable |
根據以上程式碼可以直觀的看到:API的最高層次是Application,其次是DocumentManager.MdiActiveDocument
Application物件是AutoCAD API物件模型的根物件,通過Application,使用者可以訪問主視窗以及任何開啟的圖形(dwg)。一旦使用者獲得了圖形(dwg),就可以訪問圖形(dwg)中的物件。獲得Application等同獲得了進入CAD的許可權。
例如:Application.DocumentManager,該物件允許對當前圖形的訪問,並允許使用者建立、儲存和開啟圖形檔案。通過Application物件提供的其他特性可以使用:資訊中心(InfoCenter)、主視窗(MainWindow)、狀態列(StatusBar)等等物件。主視窗API允許使用者訪問應用程式的名稱、大小、位置和可見性等。(注:雖然說是做CAD二次開發,但是並不是僅僅在CAD中加入一個外掛,利用CAD提供的API是可以重建一個新的、模仿AutoCAD的CAD應用的。這就是高層次API的用處)
相關文章
- dump index 的層次結構Index
- 繪製層次結構圖
- WordPress模板層次02:模板層次結構和原理
- MFC9.0層次結構圖
- 儲存器的層次結構
- 深入理解 Flutter 框架層次結構Flutter框架
- 六、層次結構儲存系統
- LB 負載均衡的層次結構負載
- Ecshop檔案結構,二次開發
- 談一談資料域層次結構
- iOS10 UI教程管理層次結構iOSUI
- Tomcat伺服器層次結構研究Tomcat伺服器
- 計算機網路的七層結構、五層結構和四層結構計算機網路
- Flutter 開發小結Flutter
- django開發小結Django
- ocx開發小結.
- iOS10 UI教程層次結構的事件iOSUI事件
- JDK安裝方法、使用方法和層次結構JDK
- 關於Spring Cloud的特性與層次結構SpringCloud
- SQL Server 2008的加密層次結構SQLServer加密
- 小程式開發總結
- Vue元件開發小結Vue元件
- 解析物件導向開發和分層開發結構的重要性物件
- IPv6優點之層次化的地址結構
- 在JavaScript裡寫類層次結構?別那麼做!JavaScript
- 改變eclipse工程中程式碼的層次結構Eclipse
- iOS開發-工程結構iOS
- Flutter 開發小結 | TipsFlutter
- Taro小程式開發總結
- 移動端開發小結
- mpvue開發小程式總結Vue
- 小程式開發技巧總結
- 微信小程式開發總結微信小程式
- javascript 詞法結構小結JavaScript
- ORACLE體系結構小結Oracle
- 架構分層的小糾結-層級該如何劃分與定位?架構
- 3系統結構層
- WebService開發的層次Web