在CAD中,屬性信息一般是以注記的形式存在,但當屬性數據內容較多時,顯示就成了問題。擴展屬性(Xdata)可以解決這一問題,比如南方Cass中就利用了這一點。我們經常用Lisp來讀取操作擴展屬性。
查看實體屬性信息:
(entget(car(entsel))'("*"))
但我們為了方便與GIS交互,我們得在.NET中來讀取、修改CAD文件中實體的擴展屬性。本文先只講解怎么讀取擴展屬性。
第一步,不管怎么樣,都要先打開文件,獲取文檔,選擇對象,獲取實體。下面這段代碼在測試中肯定會經常用到。
[CommandMethod("GA", CommandFlags.Session)] public void GetAttribute() { //文檔管理器 DocumentCollection acDocMgr = Application.DocumentManager; //激活的文檔 Document acDoc = acDocMgr.MdiActiveDocument; Database acCurDb = acDoc.Database; using (acDoc.LockDocument()) { // 啟動事務 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // 請求在圖形區域選擇對象 PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection(); // 如果提示狀態OK,表示已選擇對象 if (acSSPrompt.Status == PromptStatus.OK) { SelectionSet acSSet = acSSPrompt.Value; //遍歷選擇集內的對象 foreach (SelectedObject acSSObj in acSSet) { // 確認返回的是合法的SelectedObject對象 if (acSSObj != null) { //獲取實體 Entity acEnt = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite) as Entity; if (acEnt != null) { ////////以下是獲取擴展屬性的代碼 //…… } else { MessageBoxEx.Show("該實體為空!", "提示"); } } } // 保存新對象到數據庫 acTrans.Commit(); } } } }
下面是獲取擴展屬性的代碼:
if (acEnt.XData != null) { string result = ""; Autodesk.AutoCAD.DatabaseServices.TypedValue[] valueArray = acEnt.XData.AsArray(); for (int i = 0; i < valueArray.Length; i++) { result += i + "-" + valueArray[i].TypeCode + "-" + valueArray[i].Value + "\n"; } Console.WriteLine(result); System.Windows.Forms.MessageBox.Show(result); }
其實也簡單,先判斷獲取到的實例是否有擴展屬性(XData),如果有就調用其AsArray方法,將擴展屬性轉為TypedValue數組,於常規數據用法一致。然后遍歷讀取出擴展屬性即可。其中,TypeCode即為組碼,Value即為屬性值。
當然為了用戶更好的體驗,我們需要將讀取出來的屬性放在窗體上顯示。
附:Cass擴展屬性
(-3 ("SOUTH" (1000 . "300000")(1000 . "513434101209JC00140")(1000 . "羅克雄") (1000 . "")) ;;宗地 ("QHDM" (1000 . "")) ;;區號代碼 ("SJZGBM" (1000 . "")) ;;上級主管部門 ("FRDBXM" (1000 . "")) ;;法人代表姓名 ("FRDBZMS" (1000 . "")) ;;法人代表證明書 ("FRDBDH" (1000 . "")) ;;法人代表電話 ("DLRXM" (1000 . "")) ;;代理人姓名 ("DLRSFZ" (1000 . "")) ;;代理人身份證 ("DLRDH" (1000 . "")) ;;代理人電話 ("TXDZ" (1000 . "")) ;;通訊地址 ("TDZL" (1000 . "")) ;;土地坐落 ("DONGZHI" (1000 . "")) ;;東至 ("NANZHI" (1000 . "")) ;;南至 ("XIZHI" (1000 . "")) ;;西至 ("BEIZHI" (1000 . "")) ;;北至 ("QSLYZM" (1000 . "")) ;;權屬來源證明 ("PZTDYT" (1000 . "")) ;;批准土地用途 ("TDSYZ" (1000 . "")) ;;土地所有者 ("SBJZWQS" (1000 . "")) ;;申報建築物權屬 ("YBDJH" (1000 . "")) ;;預編地籍號 ("TDZH" (1000 . "")) ;;土地證號 ("SHRQ" (1000 . "")) ;;審核日期 ("DJRQ" (1000 . "")) ;;登記日期 ("ZZRQ" (1000 . "")) ;;終止日期 ("DWXZ" (1000 . "")) ;;單位性質 ("QSXZ" (1000 . "")) ;;權屬性質 ("SYQLX" (1000 . "")) ;;使用權類型 ("TDDJ" (1000 . "")) ;;土地等級 ("MPH" (1000 . "")) ;;門牌號 ("TUFU" (1000 . "3163.13-548.63")) ;;所在圖幅 ("JZMJ" (1040 . 177.157)) ;;建築面積 ("BDDJ" (1040 . 0.0)) ;;標定地價 ("SBDJ" (1040 . 0.0)) ;;申報地價 )