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

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

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

相关扩展字典操作类。


 
 
  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace HandleXDictionaryXrecords
  8. {
  9. public static class Extension
  10. {
  11. public static T GetObject<T>(
  12. this ObjectId id,
  13. OpenMode mode = OpenMode.ForRead,
  14. bool openErased = false,
  15. bool forceOpenOnLockedLayer = false)
  16. where T : DBObject
  17. {
  18. if (id.IsNull)
  19. throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NullObjectId);
  20. Transaction tr = id.Database.TransactionManager.TopTransaction;
  21. if (tr == null)
  22. throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions);
  23. return (T)tr.GetObject(id, mode, openErased, forceOpenOnLockedLayer);
  24. }
  25. /// <summary>
  26. /// 获取扩展字典
  27. /// </summary>
  28. /// <param name="source"></param>
  29. /// <returns></returns>
  30. public static DBDictionary TryGetExtensionDictionary(this DBObject source)
  31. {
  32. if (source == null)
  33. throw new ArgumentNullException( "source为空");
  34. ObjectId dictId = source.ExtensionDictionary;
  35. if (dictId == ObjectId.Null)
  36. {
  37. return null;
  38. }
  39. return dictId.GetObject<DBDictionary>();
  40. }
  41. /// <summary>
  42. /// 获取或创建字典
  43. /// </summary>
  44. /// <param name="source"></param>
  45. /// <returns></returns>
  46. public static DBDictionary GetOrCreateExtensionDictionary(this DBObject source)
  47. {
  48. if (source == null)
  49. throw new ArgumentNullException( "source为空");
  50. if (source.ExtensionDictionary == ObjectId.Null)
  51. {
  52. source.UpgradeOpen();
  53. source.CreateExtensionDictionary();
  54. }
  55. return source.ExtensionDictionary.GetObject<DBDictionary>();
  56. }
  57. /// <summary>
  58. /// 获取扩展字典
  59. /// </summary>
  60. /// <param name="source">数据对象</param>
  61. /// <param name="key"></param>
  62. /// <returns></returns>
  63. public static ResultBuffer GetXDictionaryXrecordData(this DBObject source, string key)
  64. {
  65. if (source == null)
  66. //throw new ArgumentNullException(nameof(source));
  67. throw new ArgumentNullException( "source为空");
  68. //if (string.IsNullOrWhiteSpace(key))
  69. if (key.IsNullOrWhiteSpace())
  70. throw new ArgumentNullException( "key或为空");
  71. DBDictionary xdict = source.TryGetExtensionDictionary();
  72. if (xdict == null)
  73. {
  74. return null;
  75. }
  76. return xdict.GetXrecordData(key);
  77. }
  78. /// <summary>
  79. /// 设置字典
  80. /// </summary>
  81. /// <param name="target"></param>
  82. /// <param name="key"></param>
  83. /// <param name="values"></param>
  84. public static void SetXDictionaryXrecordData(this DBObject target, string key, params TypedValue[] values)
  85. {
  86. target.SetXDictionaryXrecordData(key, new ResultBuffer(values));
  87. }
  88. /// <summary>
  89. /// 创建字典
  90. /// </summary>
  91. /// <param name="target"></param>
  92. /// <param name="key"></param>
  93. /// <param name="data"></param>
  94. public static void SetXDictionaryXrecordData(this DBObject target, string key, ResultBuffer data)
  95. {
  96. if (target == null)
  97. //throw new ArgumentNullException(nameof(target));
  98. throw new ArgumentNullException( "target为空");
  99. //if (string.IsNullOrWhiteSpace(key))
  100. if (key.IsNullOrWhiteSpace())
  101. //throw new ArgumentNullException(nameof(key));
  102. throw new ArgumentNullException( "key或为空");
  103. target.GetOrCreateExtensionDictionary().SetXrecordData(key, data);
  104. }
  105. /// <summary>
  106. /// 获取扩展记录数据
  107. /// </summary>
  108. /// <param name="dict"></param>
  109. /// <param name="key"></param>
  110. /// <returns></returns>
  111. public static ResultBuffer GetXrecordData(this DBDictionary dict, string key)
  112. {
  113. if (dict == null)
  114. //throw new ArgumentNullException(nameof(dict));
  115. throw new ArgumentNullException( "dict为空");
  116. if (!dict.Contains(key))
  117. {
  118. return null;
  119. }
  120. ObjectId id = (ObjectId)dict[key];
  121. if (id.ObjectClass != RXObject.GetClass( typeof(Xrecord)))
  122. return null;
  123. return id.GetObject<Xrecord>().Data;
  124. }
  125. /// <summary>
  126. /// 设置扩展记录数据
  127. /// </summary>
  128. /// <param name="dict"></param>
  129. /// <param name="key"></param>
  130. /// <param name="data"></param>
  131. public static void SetXrecordData(this DBDictionary dict, string key, ResultBuffer data)
  132. {
  133. if (dict == null)
  134. // throw new ArgumentNullException(nameof(dict));
  135. throw new ArgumentNullException( "dict为空");
  136. //if (string.IsNullOrWhiteSpace(key))
  137. if( key.IsNullOrWhiteSpace())
  138. //throw new ArgumentNullException(nameof(key));
  139. throw new ArgumentNullException( "key或为空");
  140. Transaction tr = dict.Database.TransactionManager.TopTransaction;
  141. if (tr == null)
  142. throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions);
  143. Xrecord xrec;
  144. if (dict.Contains(key))
  145. {
  146. xrec = ((ObjectId)dict[key]).GetObject<Xrecord>(OpenMode.ForWrite);
  147. }
  148. else
  149. {
  150. dict.UpgradeOpen();
  151. xrec = new Xrecord();
  152. dict.SetAt(key, xrec);
  153. tr.AddNewlyCreatedDBObject(xrec, true);
  154. }
  155. xrec.Data = data;
  156. }
  157. }
  158. }

最后是一个测试类。


 
 
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. namespace HandleXDictionaryXrecords
  10. {
  11. /// <summary>
  12. /// 测试类
  13. /// </summary>
  14. class XrecordTest
  15. {
  16. [ CommandMethod("XRECTEST")]
  17. public static void XrecordTest() {
  18. Document doc = Application.DocumentManager.MdiActiveDocument;
  19. Database db = doc.Database;
  20. Editor ed = doc.Editor;
  21. PromptEntityResult per = ed.GetEntity( "\n选择一个实体: ");
  22. if (per.Status == PromptStatus.OK)
  23. {
  24. using ( var tr = db.TransactionManager.StartTransaction())
  25. {
  26. Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead);
  27. ResultBuffer data = ent.GetXDictionaryXrecordData( "TestXrec");
  28. if (data == null)
  29. {
  30. ed.WriteMessage( "\n实体不存在交 'TextXrec' Xrecord记录, 将添加到Xrecord记录中");
  31. ent.SetXDictionaryXrecordData( "TestXrec", new TypedValue( 1, "foo"), new TypedValue( 70, 42));
  32. }
  33. else
  34. {
  35. foreach (TypedValue tv in data.AsArray())
  36. {
  37. ed.WriteMessage( "\nTypeCode: {"+tv.TypeCode.ToString()+ "}, Value: {"+tv.Value.ToString()+ "}");
  38. }
  39. }
  40. tr.Commit();
  41. }
  42. }
  43. }
  44. }
  45. }

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


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

                                                                                


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值