AutoCAD .NET二次開發(四)


在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))  		 ;;申報地價
)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM