AutoCAD二次开发之属性操作(2) 读属性

接续上文。通过上一篇文章,您可以实现对一个实体属性的添加。下面就跟大家聊聊读取属性的实现。

就像世间没有两片相同的叶子,读取实体属性的方式也各种各样,公司或者个人也彰显出了自己的编码风格以及特点。个人认为,读取实体属性的核心代码只有一条:

ResultBuffer rb=ent.XData;此时,即可获取实体属性。不过本人有个癖好。凡是通用性强的东西,都想自己提个方法。以便日后使用。

刚开始读写属性的时候比较茫然,各种分割ResulteBuffer。之后才知道有方法可以直接获取resultbuffer中的各个项。

初始时的代码:

  #region 拆分实体的属性名称和值
        /// <summary>
        /// 拆分实体的属性名称和值
        /// </summary>
        /// <param name="objId">Id</param>
        /// <param name="AppName">属性名称</param>
        /// <returns></returns>
        public Dat AttributeGet(ObjectId objId, string AppName)
        {
        
            Dat dt = new Dat();
        
            dt.Columns.Add("AttributeName", typeof(string));
         
            dt.Columns.Add("AttributValue", typeof(string));
         
            ResultBuffer rb = RXData(objId, AppName);
         
            if (rb != null)
            {
           
                string str1 = null;
           
                str1 = rb.ToString();
          
                string[] strRb1 = new string[] { };
          
                strRb1 = str1.Split(',');
           
                string str2 = strRb1[1].ToString();
             
                string[] strRb2 = new string[] { };
           
                strRb2 = str2.Split(')');
           
                string appName = strRb2[0];
          
                string str3 = strRb1[2].ToString();
           
                string[] strRb3 = new string[] { };
            
                strRb3 = str3.Split(')');
                
                string appValue = strRb3[0];
                
                DataRow dr = dt.NewRow();
               
                dr["AttributeName"] = appName;
               
                dr["AttributeValue"] = appValue;
              
                dt.Rows.Add(dr);
            }

            return dt;
        }

  public ResultBuffer RXData(ObjectId objId, string AppName)
        {
           
            ResultBuffer rb = null;
       
            try
            {
            
                using (Database db = HostApplicationServices.WorkingDatabase)
                {
                 
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                     
                        Entity en = (Entity)trans.GetObject(objId, OpenMode.ForRead);
                       
                        rb = en.GetXDataForApplication(AppName);
                    }
                }
            }
         
            catch
            {
                return null;
            }
           
            return rb;
        }


        #endregion

以上是获取实体XData属性。之后按照其构造形式直接拆分字符串。存储到新建的DataTable中。新手时,对CAD不甚了解,现在看来此种方法比较笨。

用rbTemp.AsArray()[i].Value;可以规避拆分字符串的麻烦,直接获得对应位置的属性名,属性值。

以下是改进的方法:

 

  /// <summary>
        /// 获得指定实体的属性名称属性值
        /// </summary>
        /// <param name="oid"></param>
        /// <returns></returns>
        private Dat GetXData(ObjectId oid)
        {
            Dat dtblTemp = new System.Data.DataTable();
            dtblTemp.Columns.Add(new System.Data.DataColumn("name", typeof(string)));
            dtblTemp.Columns.Add(new System.Data.DataColumn("value", typeof(string)));
            try
            {
                using (Transaction trans = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction())
                {

                    Entity ent = (Entity)trans.GetObject(oid, OpenMode.ForWrite);
                    ResultBuffer rbTemp = ent.XData;
                    int intAttributeCount = rbTemp.AsArray().Length;

                    for (int i = 0; i < intAttributeCount; i += 2)
                    {
                        DataRow dr = dtblTemp.NewRow();
                        dr[0] = rbTemp.AsArray()[i].Value;
                        dr[1] = rbTemp.AsArray()[i + 1].Value;
                        dtblTemp.Rows.Add(dr);
                    }
                }
            }
            catch (Exception ex)
            {
                return dtblTemp;
            }
            return dtblTemp;

        }

随着今后经验的逐渐积累。理应会写出更好的方法实现该功能。若各位大侠手里有更好的方法,请顺便贴一下,谢谢。

如有问题:请加qq1419226548或QQmail给我。 若转载,请注明出处。谢谢。

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值