在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 + " "; } 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)) ;;申报地价 )