AutoCAD二次开发之属性操作(1) 写属性

对CAD二次开发的程序员来说,实现操作实体XData属性的方法想必已经烂熟于心了。不过,本人在这里在赘述一下。晒晒自己的代码,如果大家有更好的方法和逻辑,请大家提出来,让我这个新手也学习一下,本人将不胜感激。

方法一如下:

输入参数为:

实体主键:需要写入(修改)属性的对象;

外部属性名:属性名称 

属性:属性值 ,和外部属性名称构成键值对。

返回是否写属性成功

 #region "写属性"
        /// <summary>
        /// 对一个实体进行写属性。
        /// </summary>
        /// <param name="objId">实体的ID</param>
        /// <param name="appName">外部数据名</param>
        /// <param name="rb">属性</param>
        /// <returns>true:成功 false:失败</returns>
        public bool AddXdata(ObjectId objId, string appName, ResultBuffer rb)
        {
           
            bool retureValue = false;
            
            try
            {
             
                using (Database db = HostApplicationServices.WorkingDatabase)
                {
                
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                   
                        RegAppTable rAt = (RegAppTable)trans.GetObject(db.RegAppTableId, OpenMode.ForWrite);
                       
                        RegAppTableRecord rAtr;
                      
                        ObjectId rAtrId = ObjectId.Null;
                   
                        if (rAt.Has(appName))
                        {
                           
                            rAtrId = rAt[appName];
                        }
                        else
                        {
                            rAtr = new RegAppTableRecord();
                            rAtr.Name = appName;
                            rAtrId = rAt.Add(rAtr);
                                                    trans.AddNewlyCreatedDBObject(rAtr, true);
                        }
                        Entity en;
                        en = (Entity)trans.GetObject(objId, OpenMode.ForWrite);
                        en.XData = rb;
                        
                        trans.Commit();
                        
                        retureValue = true;
                    }
                }
            }
           
            catch
            {
                
                retureValue = false;
            }
            
            return retureValue;
        }

          #endregion

代码说明:

启用数据库,事务,获得注册属性表

新建一条注册属性记录RegAppTableRecord

当注册表中不存在属性时,实例化注册属性记录,添加属性名称。

将resultbuffer 写入实体XData中。

提交事务。

添加实体属性即可实现。

注:如果实体中已经有属性,调用本方法的时候,会将编辑的属性放置到XData数据的最后。如下图所示的管点编号。请注意。

 

下面还有该方法的变形:

一、只需输入实体ID 属性名称 属性值即可

 

 /// <summary>
        /// 对实体进行写属性
        /// </summary>
        /// <param name="objId">实体id</param>
        /// <param name="appName">外部数据名</param>
        /// <param name="proStr">属性</param>
        /// <returns>true: 成功 false: 失败</returns>
        public bool AddXdata(ObjectId objId, string appName, string proStr)
        {
        
            bool retureValue = false;
            
            try
            {
           
                using (Database db = HostApplicationServices.WorkingDatabase)
                {
              
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                     
                        RegAppTable rAt = (RegAppTable)trans.GetObject(db.RegAppTableId, OpenMode.ForWrite);
                       
                        RegAppTableRecord rAtr;
                        
                        ObjectId rAtrId = ObjectId.Null;

                   
                   
                        TypedValue tvName = new TypedValue
                            (DxfCode.ExtendedDataRegAppName.GetHashCode(), appName);
                   
                        TypedValue tvPro = new TypedValue
                            (DxfCode.ExtendedDataAsciiString.GetHashCode(), proStr);
                    
                        ResultBuffer rb = new ResultBuffer(tvName, tvPro);

                      
                        if (rAt.Has(appName))
                        {
                         
                            rAtrId = rAt[appName];
                        }
                        else
                        {
                         
                            rAtr = new RegAppTableRecord();
                      
                            rAtr.Name = appName;
                      
                            rAtrId = rAt.Add(rAtr);
                       
                            trans.AddNewlyCreatedDBObject(rAtr, true);
                        }
                    
                        Entity en;
                    
                        en = (Entity)trans.GetObject(objId, OpenMode.ForWrite);
                      
                        en.XData = rb;
                        
                        trans.Commit();
                        
                        retureValue = true;
                    }
                }
            }
            catch
            {
                retureValue = false;
            }
            return retureValue;
        }

 

 

 

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值