许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  AutoCAD二次开发:创建和获取扩展字典对象与扩展记录数据

AutoCAD二次开发:创建和获取扩展字典对象与扩展记录数据

阅读数 2
点赞 0
article_banner

这是一个与学习创建和获取扩展 字典 对象与扩展记录数据相关的内容。我们知道在南方cass中有一部分数据是存在扩展数据xdata属性中,其中宗地的宗地基本属性就是印证了这一点。而我们接下了的学习是字典Dictionary扩展数据、扩展记录数据Xrecord。这对了解AutoCAD扩展数据具有一定帮助。

工程的代码是摘自相关网站,源代码使用的是..net6.0,由于本次使用的是AutoCAD2010,因此版本为net3.5,而相应的函数是在原有类的基础上扩展得来的,比如string.IsNullOrWhiteSpace(),单独写一个关于string的扩展函数IsNullOrWhiteSpace()。而代码中出现的nameof函数,用于获取类型等信息标记异常信息,这里使用另外的一些标记代替。具体可以参考提供的源代码。下面的源代码中函数GetObject是一泛型方法,其中还使用了where关键字对基类进行了约束。其他函数的使用看注释即可。

相关扩展字典操作类。

using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace HandleXDictionaryXrecords{    public static class Extension    {      public static T GetObject<T>( this ObjectId id, OpenMode mode = OpenMode.ForRead, bool openErased = false, bool forceOpenOnLockedLayer = false)       where T : DBObject        {            if (id.IsNull)                throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NullObjectId);            Transaction tr = id.Database.TransactionManager.TopTransaction;            if (tr == null)                throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions);            return (T)tr.GetObject(id, mode, openErased, forceOpenOnLockedLayer);        }      /// <summary>      /// 获取扩展字典      /// </summary>      /// <param name="source"></param>      /// <returns></returns>      public static DBDictionary TryGetExtensionDictionary(this DBObject source)      {          if (source == null)              throw new ArgumentNullException("source为空");          ObjectId dictId = source.ExtensionDictionary;          if (dictId == ObjectId.Null)          {              return null;          }          return dictId.GetObject<DBDictionary>();      }      /// <summary>      /// 获取或创建字典      /// </summary>      /// <param name="source"></param>      /// <returns></returns>      public static DBDictionary GetOrCreateExtensionDictionary(this DBObject source)      {          if (source == null)              throw new ArgumentNullException("source为空");          if (source.ExtensionDictionary == ObjectId.Null)          {              source.UpgradeOpen();              source.CreateExtensionDictionary();          }          return source.ExtensionDictionary.GetObject<DBDictionary>();      }        /// <summary>        /// 获取扩展字典        /// </summary>        /// <param name="source">数据对象</param>        /// <param name="key">键</param>        /// <returns></returns>      public static ResultBuffer GetXDictionaryXrecordData(this DBObject source, string key)      {          if (source == null)              //throw new ArgumentNullException(nameof(source));              throw new ArgumentNullException("source为空");          //if (string.IsNullOrWhiteSpace(key))          if (key.IsNullOrWhiteSpace())              throw new ArgumentNullException("key或为空");          DBDictionary xdict = source.TryGetExtensionDictionary();          if (xdict == null)          {              return null;          }          return xdict.GetXrecordData(key);      }      /// <summary>      /// 设置字典      /// </summary>      /// <param name="target"></param>      /// <param name="key"></param>      /// <param name="values"></param>      public static void SetXDictionaryXrecordData(this DBObject target, string key, params TypedValue[] values)      {          target.SetXDictionaryXrecordData(key, new ResultBuffer(values));      }      /// <summary>      /// 创建字典      /// </summary>      /// <param name="target"></param>      /// <param name="key"></param>      /// <param name="data"></param>      public static void SetXDictionaryXrecordData(this DBObject target, string key, ResultBuffer data)      {          if (target == null)              //throw new ArgumentNullException(nameof(target));              throw new ArgumentNullException("target为空");          //if (string.IsNullOrWhiteSpace(key))          if (key.IsNullOrWhiteSpace())              //throw new ArgumentNullException(nameof(key));              throw new ArgumentNullException("key或为空");          target.GetOrCreateExtensionDictionary().SetXrecordData(key, data);      }      /// <summary>      /// 获取扩展记录数据      /// </summary>      /// <param name="dict"></param>      /// <param name="key"></param>      /// <returns></returns>      public static ResultBuffer GetXrecordData(this DBDictionary dict, string key)      {          if (dict == null)              //throw new ArgumentNullException(nameof(dict));              throw new ArgumentNullException("dict为空");          if (!dict.Contains(key))          {              return null;          }          ObjectId id = (ObjectId)dict[key];          if (id.ObjectClass != RXObject.GetClass(typeof(Xrecord)))              return null;          return id.GetObject<Xrecord>().Data;      }        /// <summary>        /// 设置扩展记录数据        /// </summary>        /// <param name="dict"></param>        /// <param name="key"></param>        /// <param name="data"></param>      public static void SetXrecordData(this DBDictionary dict, string key, ResultBuffer data)      {          if (dict == null)           // throw new ArgumentNullException(nameof(dict));              throw new ArgumentNullException("dict为空");          //if (string.IsNullOrWhiteSpace(key))           if( key.IsNullOrWhiteSpace())              //throw new ArgumentNullException(nameof(key));               throw new ArgumentNullException("key或为空");          Transaction tr = dict.Database.TransactionManager.TopTransaction;          if (tr == null)              throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions);          Xrecord xrec;          if (dict.Contains(key))          {              xrec = ((ObjectId)dict[key]).GetObject<Xrecord>(OpenMode.ForWrite);          }          else          {              dict.UpgradeOpen();              xrec = new Xrecord();              dict.SetAt(key, xrec);              tr.AddNewlyCreatedDBObject(xrec, true);          }          xrec.Data = data;      }     }  }

最后是一个测试类。

using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Runtime;using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace HandleXDictionaryXrecords{    /// <summary>    /// 测试类    /// </summary>    class XrecordTest    {         [CommandMethod("XRECTEST")]        public static void XrecordTest() {            Document doc = Application.DocumentManager.MdiActiveDocument;            Database db = doc.Database;            Editor ed = doc.Editor;             PromptEntityResult per = ed.GetEntity("\n选择一个实体: ");            if (per.Status == PromptStatus.OK)            {                using (var tr = db.TransactionManager.StartTransaction())                {                    Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead);                    ResultBuffer data = ent.GetXDictionaryXrecordData("TestXrec");                    if (data == null)                    {                        ed.WriteMessage("\n实体不存在交 'TextXrec' Xrecord记录, 将添加到Xrecord记录中");                        ent.SetXDictionaryXrecordData("TestXrec", new TypedValue(1, "foo"), new TypedValue(70, 42));                    }                    else                    {                        foreach (TypedValue tv in data.AsArray())                        {                            ed.WriteMessage("\nTypeCode: {"+tv.TypeCode.ToString()+"}, Value: {"+tv.Value.ToString()+"}");                        }                    }                    tr.Commit();                }            }        }    }}

在visual studio中编译好源代码后,在命令行输入netload加载生成的dll,然后再运行XRECTEST命令,按照相关步骤执行即可。



                                                                     更多内容,微信扫二维码关注公众号

                                                                               



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空