AutoCAD .NET二次开发(四)

简介: 在CAD中,属性信息一般是以注记的形式存在,但当属性数据内容较多时,显示就成了问题。扩展属性(Xdata)可以解决这一问题,比如南方Cass中就利用了这一点。我们经常用Lisp来读取操作扩展属性。 查看实体属性信息: (entget(car(entsel))'("*")) 但我们为了方便与GIS交互,我们得在.NET中来读取、修改CAD文件中实体的扩展属性。

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

  

 

目录
相关文章
|
C++ 移动开发
【物联网智能网关-17】.NET Micro Framework之MDK C++二次开发
.NET Micro Framework虽然好学易用,但是在一些需要实时,需要高性能的应用领域,却有些勉为其难。毕竟.NET Micro Framework上层应用程序由底层CLR(TinyCLR)解释执行,执行效率被打个折扣是在所难免的。
718 0
|
缓存 NoSQL 数据库
3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S、B/S的服务端框架,可用于项目开发和学习。目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型、多库实例,简单强大; 此部分具体说明可参考博客: https://www.
1246 0
|
数据库
AutoCAD .NET二次开发(三)
在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定。要深入理解这个,要学习一下进程与线程。在CAD.NET中,也有Lock与Unlock。 获取一个文档,在进行处理前应当LockDocument,像官网帮助所说,因为修改或访问CAD的请求随时随地都在发生,为避免与其他请求冲突,我们有责任在修改前锁定文档。
1352 0
AutoCAD .NET二次开发(二)
今天专门讲一个——CommandMethod。我们都在知道CAD操作要快,必须要熟悉掌握各种命令。在Lisp开发中,在函数后C:即可添加一个命令,非常方法,在.NET API也可以非常方便的设置命令,它需要CommandMethod属性。
1331 0
|
.NET 开发框架 API
AutoCAD .NET二次开发(一)
其他话不多说,直接进入主题,既然是二次开发,当然是用CAD平台已经封装好了很多类,我们需要熟悉和使用它们。常用的AutoCAD .NET API的四个主要DLL文件是: 名称 作用 备注 AcDbMgd.
2769 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
27天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
26 0
|
27天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
4 0