cad.net開發小結——層次結構

_Naive_發表於2020-12-03

  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資料庫中的物件
  ——即他們含有實體物件,但是可以通過文字字串作為關鍵字對物件實體進行查詢,並向這些容器中新增記錄(記錄即物件)、修改記錄
  符號表與字典的不同:符號表有九種,每種符號表只能儲存特點型別的物件(如塊表只能儲存塊表記錄、層表只能記錄層表記錄),而字典則是一種通用容器,可儲存任何型別的物件。(一般多是通過符號表操作物件)

塊表尺寸標註樣式表層表線型表應用程式登錄檔文字樣式表使用者座標系表視口表檢視表
BlockTableDimStyleTableLayerTableLinetypeTableRegAppTableTextStyleTableUCSTableViewportTableViewTable

  


  根據以上程式碼可以直觀的看到: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的用處)

相關文章