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

  

AutoCAD .NET二次开发(四)的更多相关文章

  1. 利用C#进行AUTOCAD的二次开发

    众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...

  2. AutoCAD .NET二次开发(一)

    其他话不多说,直接进入主题,既然是二次开发,当然是用CAD平台已经封装好了很多类,我们需要熟悉和使用它们.常用的AutoCAD .NET API的四个主要DLL文件是: 名称 作用 备注 AcDbMg ...

  3. AutoCAD .NET二次开发(三)

    在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定.要深入理解这个,要学习一下进程与线程.在CAD.NET中,也有Lock与Unlock. 获取一个文档,在进行处 ...

  4. AutoCAD.NET二次开发:创建自定义菜单(COM)

    当我们要在CAD中创建自定菜单时,可以引用COM组件来实现. 下面是实现方式: 1.新建类库项目,并引用CAD目录(我这里用的是CAD2008)下的acdbmgd.dll.acmgd.dll,并将引用 ...

  5. AutoCAD.NET二次开发:创建自定义菜单(AcCui)

    从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单. 下面介绍一下菜单的创建过程: 1.在项目中添加引 ...

  6. AutoCAD C#二次开发

    https://www.cnblogs.com/gisoracle/archive/2012/02/19/2357925.html using System; using System.Collect ...

  7. AutoCAD.NET二次开发:扩展数据之XData

    结果缓存——ResultBuffer 结果缓存即 Autodesk.AutoCAD.DatabaseServices.ResultBuffer 类型,使用 ResultBuffer 对象时需要提供一个 ...

  8. AutoCAD.NET二次开发:创建自定义菜单的两种方法比较

    目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblo ...

  9. AutoCAD DevTV-AUTOCAD二次开发资源合集

    Webcast Language Date AutoCAD .Net - Session 2 English 13-Sep-12 AutoCAD .Net - Session 1 English 6- ...

随机推荐

  1. using-ef-code-first-with-an-existing-database

    http://weblogs.asp.net/scottgu/using-ef-code-first-with-an-existing-database http://weblogs.asp.net/ ...

  2. 2013年Linux周刊读者投票出炉 Ubuntu、Android榜上有名

    摘要:一年一度的Linux周刊读者投票结果已经登于2013第12期.这是Linux爱好者们自己的“奥斯卡”: Linux周刊的小编们列出一系列Linux相关的“最佳项目”进行面向读者的投票.竞选项目包 ...

  3. VPN理论简单介绍(转载)

    标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...

  4. $.ajax()方法参数详解

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  5. 代码演示 .NET 4.5 自带的 ReadonlyCollection 的使用

    代码如下: 1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  6. IDL中histogram的应用

    前面一段时间在使用Histogram时一直是不能更好的理解其中的奥秘,通过阅读帮助以及查看相应的文档,终于理解了其中的玄机,很多时候是因为在学习的时候英文不知道翻译成什么样的内容比较合理,这样就给后面 ...

  7. 64位Win7下安装与配置PHP环境【Apache+PHP+MySQL】

    [软件下载] 本安装实例所使用安装文件如图所示: 其中,64位版本的MySQL安装文件mysql-5.5.33-winx64.msi,可直接从官网下载,下载地址:http://dev.mysql.co ...

  8. [Node.js] Promise,Q及Async

    原文地址:http://www.moye.me/2014/12/27/promise_q_async/ 引子 在使用Node/JS编程的时候,经常会遇到这样的问题:有一连串的异步方法,需要按顺序执行, ...

  9. Direct2D开发:绘制网格

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...

  10. .NET ORM 哪家强

    ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...