zoukankan      html  css  js  c++  java
  • 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 + "
    ";
        }
        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))  		 ;;申报地价
    )
    

      

  • 相关阅读:
    python 文件目录/方法
    python文件
    python模块
    python数据结构
    python函数
    python迭代器和生成器
    python循环语句
    python控制语句 if
    python数字
    个人课程总结
  • 原文地址:https://www.cnblogs.com/liweis/p/4594977.html
Copyright © 2011-2022 走看看