原文转载自:http://through-the-interface.typepad.com/through_the_interface/jigs/(该口已无法访问)

可访问转载入口:http://bbs.mjtd.com/thread-75618-1-1.html(转载自明镜通道by雪山飞狐_lzh

原kean博客已经无法看到,故转载明经通道 雪山飞狐_lzh 老师整理内容

 

 

1.kean原文翻译

 

 

March 18, 2009
Jigging an AutoCAD block with attributes using .NET

利用.net做AutoCAD的属性块拖动
Thanks, once again, to Philippe Leefsma, a DevTech engineer based in Prague, for contributing the code for this post.再次感谢  Philippe Leefsma 一名位于布拉格的开发技术工程师,贡献了这篇文章中的代码

While researching an issue he was working on Philippe stumbled across a comment on this previous post where I more-or-less said jigging attributes wasn’t possible. 在研究一个他工作中的问题的时候,Philippe

突然发现在之前的文章中发表的一个评论,或多或少的提到拖动属性块是不可能的

Ahem. Anyway, Philippe decided to – quite rightly – prove me wrong, and the result is today’s post. :-)

Philippe决定用正确的方式证明我是不对的,所有就有了个今天这篇帖子
It turns out that the trick to jigging a block with attributes is to add the block reference to the database prior to running the jig.他证实拖动属性块的技巧是在进行拖动之前先将块参照添加到数据库中

I’d been coming at this from another direction – working out how to call through to the right version of the ObjectARX function, the one that allows the block reference to be in-memory rather than db-resident – but Philippe’s approach means that’s no longer needed.对于这个问题我一直朝着另一个方向,通过如何调用正确的ObjectARX 功能来完成一个允许将块属性保存在内存中而不是宿主在图形数据库中,这也就是意味着Philippe采用的方法不再被需要啦

I see this technique as potentially being useful when jigging other entities that benefit from being database resident (Solid3d objects spring to mind), so I really appreciate Philippe’s hard work on this.我知道这个技术在拖拽其他受益于宿主图形数据库中的实体是非常有用的,所有我真的很欣赏Philippe对于这方面做出的努力
Here’s the C# code which I’ve edited for posting:

  1. using Autodesk.AutoCAD.Runtime;

  2. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.ApplicationServices;

  3. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.DatabaseServices;

  4. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.EditorInput;

  5. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.Geometry;

  6. Kean专题:拖动一个属性块(JIG拖拽)using System.Collections.Generic;

  7. Kean专题:拖动一个属性块(JIG拖拽)

  8. Kean专题:拖动一个属性块(JIG拖拽)namespace BlockJig

  9. Kean专题:拖动一个属性块(JIG拖拽){

  10. Kean专题:拖动一个属性块(JIG拖拽) class CBlockJig : EntityJig

  11. Kean专题:拖动一个属性块(JIG拖拽)  {

  12. Kean专题:拖动一个属性块(JIG拖拽) private Point3d _pos;

  13. Kean专题:拖动一个属性块(JIG拖拽) private Dictionary<string, Point3d> _attPos;

  14. Kean专题:拖动一个属性块(JIG拖拽) private Transaction _tr;

  15. Kean专题:拖动一个属性块(JIG拖拽)

  16. Kean专题:拖动一个属性块(JIG拖拽) public CBlockJig(Transaction tr, BlockReference br)

  17. Kean专题:拖动一个属性块(JIG拖拽)      : base(br)

  18. Kean专题:拖动一个属性块(JIG拖拽)    {

  19. Kean专题:拖动一个属性块(JIG拖拽)      _pos = br.Position;

  20. Kean专题:拖动一个属性块(JIG拖拽)

  21. Kean专题:拖动一个属性块(JIG拖拽) // Initialize our dictionary with the tag /

  22. Kean专题:拖动一个属性块(JIG拖拽) // AttributeDefinition position

  23. Kean专题:拖动一个属性块(JIG拖拽)

  24. Kean专题:拖动一个属性块(JIG拖拽)      _attPos = new Dictionary<string, Point3d>();

  25. Kean专题:拖动一个属性块(JIG拖拽)

  26. Kean专题:拖动一个属性块(JIG拖拽)      _tr = tr;

  27. Kean专题:拖动一个属性块(JIG拖拽)

  28. Kean专题:拖动一个属性块(JIG拖拽)      BlockTableRecord btr =

  29. Kean专题:拖动一个属性块(JIG拖拽) (BlockTableRecord)_tr.GetObject(

  30. Kean专题:拖动一个属性块(JIG拖拽)          br.BlockTableRecord,

  31. Kean专题:拖动一个属性块(JIG拖拽)          OpenMode.ForRead

  32. Kean专题:拖动一个属性块(JIG拖拽) );

  33. Kean专题:拖动一个属性块(JIG拖拽)

  34. Kean专题:拖动一个属性块(JIG拖拽) if (btr.HasAttributeDefinitions)

  35. Kean专题:拖动一个属性块(JIG拖拽)      {

  36. Kean专题:拖动一个属性块(JIG拖拽) foreach (ObjectId id in btr)

  37. Kean专题:拖动一个属性块(JIG拖拽)        {

  38. Kean专题:拖动一个属性块(JIG拖拽)          DBObject obj =

  39. Kean专题:拖动一个属性块(JIG拖拽)            tr.GetObject(id, OpenMode.ForRead);

  40. Kean专题:拖动一个属性块(JIG拖拽)          AttributeDefinition ad =

  41. Kean专题:拖动一个属性块(JIG拖拽)            obj as AttributeDefinition;

  42. Kean专题:拖动一个属性块(JIG拖拽)

  43. Kean专题:拖动一个属性块(JIG拖拽) if (ad != null)

  44. Kean专题:拖动一个属性块(JIG拖拽)          {

  45. Kean专题:拖动一个属性块(JIG拖拽)            _attPos.Add(ad.Tag, ad.Position);

  46. Kean专题:拖动一个属性块(JIG拖拽)          }

  47. Kean专题:拖动一个属性块(JIG拖拽)        }

  48. Kean专题:拖动一个属性块(JIG拖拽)      }

  49. Kean专题:拖动一个属性块(JIG拖拽)    }

  50. Kean专题:拖动一个属性块(JIG拖拽)

  51. Kean专题:拖动一个属性块(JIG拖拽) protected override bool Update()

  52. Kean专题:拖动一个属性块(JIG拖拽)    {

  53. Kean专题:拖动一个属性块(JIG拖拽)      BlockReference br = Entity as BlockReference;

  54. Kean专题:拖动一个属性块(JIG拖拽)

  55. Kean专题:拖动一个属性块(JIG拖拽)      br.Position = _pos;

  56. Kean专题:拖动一个属性块(JIG拖拽)

  57. Kean专题:拖动一个属性块(JIG拖拽) if (br.AttributeCollection.Count != 0)

  58. Kean专题:拖动一个属性块(JIG拖拽)      {

  59. Kean专题:拖动一个属性块(JIG拖拽) foreach (ObjectId id in br.AttributeCollection)

  60. Kean专题:拖动一个属性块(JIG拖拽)        {

  61. Kean专题:拖动一个属性块(JIG拖拽)          DBObject obj =

  62. Kean专题:拖动一个属性块(JIG拖拽)            _tr.GetObject(id, OpenMode.ForRead);

  63. Kean专题:拖动一个属性块(JIG拖拽)          AttributeReference ar =

  64. Kean专题:拖动一个属性块(JIG拖拽)            obj as AttributeReference;

  65. Kean专题:拖动一个属性块(JIG拖拽)

  66. Kean专题:拖动一个属性块(JIG拖拽) // Apply block transform to att def position

  67. Kean专题:拖动一个属性块(JIG拖拽)

  68. Kean专题:拖动一个属性块(JIG拖拽) if (ar != null)

  69. Kean专题:拖动一个属性块(JIG拖拽)          {

  70. Kean专题:拖动一个属性块(JIG拖拽)            ar.UpgradeOpen();

  71. Kean专题:拖动一个属性块(JIG拖拽)            ar.Position =

  72. Kean专题:拖动一个属性块(JIG拖拽)              _attPos[ar.Tag].TransformBy(br.BlockTransform);

  73. Kean专题:拖动一个属性块(JIG拖拽)          }

  74. Kean专题:拖动一个属性块(JIG拖拽)        }

  75. Kean专题:拖动一个属性块(JIG拖拽)      }

  76. Kean专题:拖动一个属性块(JIG拖拽) return true;

  77. Kean专题:拖动一个属性块(JIG拖拽)    }

  78. Kean专题:拖动一个属性块(JIG拖拽)

  79. Kean专题:拖动一个属性块(JIG拖拽) protected override SamplerStatus Sampler(JigPrompts prompts)

  80. Kean专题:拖动一个属性块(JIG拖拽)    {

  81. Kean专题:拖动一个属性块(JIG拖拽)      JigPromptPointOptions opts =

  82. Kean专题:拖动一个属性块(JIG拖拽) new JigPromptPointOptions("\nSelect insertion point:");

  83. Kean专题:拖动一个属性块(JIG拖拽)      opts.BasePoint = new Point3d(0, 0, 0);

  84. Kean专题:拖动一个属性块(JIG拖拽)      opts.UserInputControls =

  85. Kean专题:拖动一个属性块(JIG拖拽)        UserInputControls.NoZeroResponseAccepted;

  86. Kean专题:拖动一个属性块(JIG拖拽)

  87. Kean专题:拖动一个属性块(JIG拖拽)      PromptPointResult ppr = prompts.AcquirePoint(opts);

  88. Kean专题:拖动一个属性块(JIG拖拽)

  89. Kean专题:拖动一个属性块(JIG拖拽) if (_pos == ppr.Value)

  90. Kean专题:拖动一个属性块(JIG拖拽)      {

  91. Kean专题:拖动一个属性块(JIG拖拽) return SamplerStatus.NoChange;

  92. Kean专题:拖动一个属性块(JIG拖拽)      }

  93. Kean专题:拖动一个属性块(JIG拖拽)

  94. Kean专题:拖动一个属性块(JIG拖拽)      _pos = ppr.Value;

  95. Kean专题:拖动一个属性块(JIG拖拽)

  96. Kean专题:拖动一个属性块(JIG拖拽) return SamplerStatus.OK;

  97. Kean专题:拖动一个属性块(JIG拖拽)    }

  98. Kean专题:拖动一个属性块(JIG拖拽)

  99. Kean专题:拖动一个属性块(JIG拖拽) public PromptStatus Run()

  100. Kean专题:拖动一个属性块(JIG拖拽)    {

  101. Kean专题:拖动一个属性块(JIG拖拽) Document doc =

  102. Kean专题:拖动一个属性块(JIG拖拽) Application.DocumentManager.MdiActiveDocument;

  103. Kean专题:拖动一个属性块(JIG拖拽) Editor ed = doc.Editor;

  104. Kean专题:拖动一个属性块(JIG拖拽)

  105. Kean专题:拖动一个属性块(JIG拖拽)      PromptResult promptResult = ed.Drag(this);

  106. Kean专题:拖动一个属性块(JIG拖拽) return promptResult.Status;

  107. Kean专题:拖动一个属性块(JIG拖拽)    }

  108. Kean专题:拖动一个属性块(JIG拖拽)  }

  109. Kean专题:拖动一个属性块(JIG拖拽)

  110. Kean专题:拖动一个属性块(JIG拖拽) public class Commands

  111. Kean专题:拖动一个属性块(JIG拖拽)  {

  112. Kean专题:拖动一个属性块(JIG拖拽) [CommandMethod("BJ")]

  113. Kean专题:拖动一个属性块(JIG拖拽) static public void BlockJig()

  114. Kean专题:拖动一个属性块(JIG拖拽)    {

  115. Kean专题:拖动一个属性块(JIG拖拽) Document doc =

  116. Kean专题:拖动一个属性块(JIG拖拽) Application.DocumentManager.MdiActiveDocument;

  117. Kean专题:拖动一个属性块(JIG拖拽) Database db = doc.Database;

  118. Kean专题:拖动一个属性块(JIG拖拽) Editor ed = doc.Editor;

  119. Kean专题:拖动一个属性块(JIG拖拽)

  120. Kean专题:拖动一个属性块(JIG拖拽)      PromptStringOptions pso =

  121. Kean专题:拖动一个属性块(JIG拖拽) new PromptStringOptions("\nEnter block name: ");

  122. Kean专题:拖动一个属性块(JIG拖拽)      PromptResult pr = ed.GetString(pso);

  123. Kean专题:拖动一个属性块(JIG拖拽)

  124. Kean专题:拖动一个属性块(JIG拖拽) if (pr.Status != PromptStatus.OK)

  125. Kean专题:拖动一个属性块(JIG拖拽) return;

  126. Kean专题:拖动一个属性块(JIG拖拽)

  127. Kean专题:拖动一个属性块(JIG拖拽)      Transaction tr =

  128. Kean专题:拖动一个属性块(JIG拖拽)        doc.TransactionManager.StartTransaction();

  129. Kean专题:拖动一个属性块(JIG拖拽) using (tr)

  130. Kean专题:拖动一个属性块(JIG拖拽)      {

  131. Kean专题:拖动一个属性块(JIG拖拽)        BlockTable bt =

  132. Kean专题:拖动一个属性块(JIG拖拽) (BlockTable)tr.GetObject(

  133. Kean专题:拖动一个属性块(JIG拖拽)            db.BlockTableId,

  134. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForRead

  135. Kean专题:拖动一个属性块(JIG拖拽) );

  136. Kean专题:拖动一个属性块(JIG拖拽)        BlockTableRecord space =

  137. Kean专题:拖动一个属性块(JIG拖拽) (BlockTableRecord)tr.GetObject(

  138. Kean专题:拖动一个属性块(JIG拖拽)            db.CurrentSpaceId,

  139. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForRead

  140. Kean专题:拖动一个属性块(JIG拖拽) );

  141. Kean专题:拖动一个属性块(JIG拖拽)

  142. Kean专题:拖动一个属性块(JIG拖拽) if (!bt.Has(pr.StringResult))

  143. Kean专题:拖动一个属性块(JIG拖拽)        {

  144. Kean专题:拖动一个属性块(JIG拖拽)          ed.WriteMessage(

  145. Kean专题:拖动一个属性块(JIG拖拽) "\nBlock \"" + pr.StringResult + "\" not found.");

  146. Kean专题:拖动一个属性块(JIG拖拽) return;

  147. Kean专题:拖动一个属性块(JIG拖拽)        }

  148. Kean专题:拖动一个属性块(JIG拖拽)

  149. Kean专题:拖动一个属性块(JIG拖拽)        space.UpgradeOpen();

  150. Kean专题:拖动一个属性块(JIG拖拽)

  151. Kean专题:拖动一个属性块(JIG拖拽)        BlockTableRecord btr =

  152. Kean专题:拖动一个属性块(JIG拖拽) (BlockTableRecord)tr.GetObject(

  153. Kean专题:拖动一个属性块(JIG拖拽)            bt[pr.StringResult],

  154. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForRead);

  155. Kean专题:拖动一个属性块(JIG拖拽)

  156. Kean专题:拖动一个属性块(JIG拖拽) // Block needs to be inserted to current space before

  157. Kean专题:拖动一个属性块(JIG拖拽) // being able to append attribute to it

  158. Kean专题:拖动一个属性块(JIG拖拽)

  159. Kean专题:拖动一个属性块(JIG拖拽)        BlockReference br =

  160. Kean专题:拖动一个属性块(JIG拖拽) new BlockReference(new Point3d(), btr.ObjectId);

  161. Kean专题:拖动一个属性块(JIG拖拽)        space.AppendEntity(br);

  162. Kean专题:拖动一个属性块(JIG拖拽)        tr.AddNewlyCreatedDBObject(br, true);

  163. Kean专题:拖动一个属性块(JIG拖拽)

  164. Kean专题:拖动一个属性块(JIG拖拽) if (btr.HasAttributeDefinitions)

  165. Kean专题:拖动一个属性块(JIG拖拽)        {

  166. Kean专题:拖动一个属性块(JIG拖拽) foreach (ObjectId id in btr)

  167. Kean专题:拖动一个属性块(JIG拖拽)          {

  168. Kean专题:拖动一个属性块(JIG拖拽)            DBObject obj =

  169. Kean专题:拖动一个属性块(JIG拖拽)              tr.GetObject(id, OpenMode.ForRead);

  170. Kean专题:拖动一个属性块(JIG拖拽)            AttributeDefinition ad =

  171. Kean专题:拖动一个属性块(JIG拖拽)              obj as AttributeDefinition;

  172. Kean专题:拖动一个属性块(JIG拖拽)

  173. Kean专题:拖动一个属性块(JIG拖拽) if (ad != null && !ad.Constant)

  174. Kean专题:拖动一个属性块(JIG拖拽)            {

  175. Kean专题:拖动一个属性块(JIG拖拽)              AttributeReference ar =

  176. Kean专题:拖动一个属性块(JIG拖拽) new AttributeReference();

  177. Kean专题:拖动一个属性块(JIG拖拽)              ar.SetAttributeFromBlock(ad, br.BlockTransform);

  178. Kean专题:拖动一个属性块(JIG拖拽)              ar.Position =

  179. Kean专题:拖动一个属性块(JIG拖拽)                ad.Position.TransformBy(br.BlockTransform);

  180. Kean专题:拖动一个属性块(JIG拖拽)

  181. Kean专题:拖动一个属性块(JIG拖拽)              ar.TextString = ad.TextString;

  182. Kean专题:拖动一个属性块(JIG拖拽)

  183. Kean专题:拖动一个属性块(JIG拖拽)              br.AttributeCollection.AppendAttribute(ar);

  184. Kean专题:拖动一个属性块(JIG拖拽)              tr.AddNewlyCreatedDBObject(ar, true);

  185. Kean专题:拖动一个属性块(JIG拖拽)            }

  186. Kean专题:拖动一个属性块(JIG拖拽)          }

  187. Kean专题:拖动一个属性块(JIG拖拽)        }

  188. Kean专题:拖动一个属性块(JIG拖拽)

  189. Kean专题:拖动一个属性块(JIG拖拽) // Run the jig

  190. Kean专题:拖动一个属性块(JIG拖拽)

  191. Kean专题:拖动一个属性块(JIG拖拽)        CBlockJig myJig = new CBlockJig(tr, br);

  192. Kean专题:拖动一个属性块(JIG拖拽)

  193. Kean专题:拖动一个属性块(JIG拖拽) if (myJig.Run() != PromptStatus.OK)

  194. Kean专题:拖动一个属性块(JIG拖拽) return;

  195. Kean专题:拖动一个属性块(JIG拖拽)

  196. Kean专题:拖动一个属性块(JIG拖拽) // Commit changes if user accepted, otherwise discard

  197. Kean专题:拖动一个属性块(JIG拖拽)

  198. Kean专题:拖动一个属性块(JIG拖拽)        tr.Commit();

  199. Kean专题:拖动一个属性块(JIG拖拽)      }

  200. Kean专题:拖动一个属性块(JIG拖拽)    }

  201. Kean专题:拖动一个属性块(JIG拖拽)  }

  202. Kean专题:拖动一个属性块(JIG拖拽)}

 

 

When you run the BJ command (short for BlockJig) and specify the name of a block in the current drawing which contains attributes, you’ll now see the attributes with their default values shown as part of the block being jigged.当你运行一个BJ命令并且制定一个块名在当前包含特性的图形中,你会看到定义的属性值作为作为被拖拽块的一部分被显示

Implementing the code to allow editing of those attributes after insertion is left as an exercise for the reader.

编写一段代码允许编辑已经插入的属性留给读者作为练习完成

练习部分由我完成

 

 


Update:
This code didn't work for a few situations, such as when using justification (attributes would end up at the origin after being dragged) or with MText attributes (which would start at the origin until the mouse was moved).

这个代码不能工作在一些情况,例如当你使用对正(再被拖拽后属性将会回到原点处)或多行文本(当鼠标被移动是属性将从原点开始)等情况
A big thanks to Roland Feletic from PAUSER ZT-GMBH for helping identify and diagnose the various cases.
Here's the updated C# code:

 

 

 

  1. using Autodesk.AutoCAD.Runtime;

  2. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.ApplicationServices;

  3. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.DatabaseServices;

  4. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.EditorInput;

  5. Kean专题:拖动一个属性块(JIG拖拽)using Autodesk.AutoCAD.Geometry;

  6. Kean专题:拖动一个属性块(JIG拖拽)using System.Collections.Generic;

  7. Kean专题:拖动一个属性块(JIG拖拽)

  8. Kean专题:拖动一个属性块(JIG拖拽)namespace BlockJigApplication

  9. Kean专题:拖动一个属性块(JIG拖拽){

  10. Kean专题:拖动一个属性块(JIG拖拽) class AttInfo

  11. Kean专题:拖动一个属性块(JIG拖拽)  {

  12. Kean专题:拖动一个属性块(JIG拖拽) private Point3d _pos;

  13. Kean专题:拖动一个属性块(JIG拖拽) private Point3d _aln;

  14. Kean专题:拖动一个属性块(JIG拖拽) private bool _aligned;

  15. Kean专题:拖动一个属性块(JIG拖拽)

  16. Kean专题:拖动一个属性块(JIG拖拽) public AttInfo(Point3d pos, Point3d aln, bool aligned)

  17. Kean专题:拖动一个属性块(JIG拖拽)    {

  18. Kean专题:拖动一个属性块(JIG拖拽)      _pos = pos;

  19. Kean专题:拖动一个属性块(JIG拖拽)      _aln = aln;

  20. Kean专题:拖动一个属性块(JIG拖拽)      _aligned = aligned;

  21. Kean专题:拖动一个属性块(JIG拖拽)    }

  22. Kean专题:拖动一个属性块(JIG拖拽)

  23. Kean专题:拖动一个属性块(JIG拖拽) public Point3d Position

  24. Kean专题:拖动一个属性块(JIG拖拽)    {

  25. Kean专题:拖动一个属性块(JIG拖拽)      set { _pos = value; }

  26. Kean专题:拖动一个属性块(JIG拖拽)      get { return _pos; }

  27. Kean专题:拖动一个属性块(JIG拖拽)    }

  28. Kean专题:拖动一个属性块(JIG拖拽)

  29. Kean专题:拖动一个属性块(JIG拖拽) public Point3d Alignment

  30. Kean专题:拖动一个属性块(JIG拖拽)    {

  31. Kean专题:拖动一个属性块(JIG拖拽)      set { _aln = value; }

  32. Kean专题:拖动一个属性块(JIG拖拽)      get { return _aln; }

  33. Kean专题:拖动一个属性块(JIG拖拽)    }

  34. Kean专题:拖动一个属性块(JIG拖拽)

  35. Kean专题:拖动一个属性块(JIG拖拽) public bool IsAligned

  36. Kean专题:拖动一个属性块(JIG拖拽)    {

  37. Kean专题:拖动一个属性块(JIG拖拽)      set { _aligned = value; }

  38. Kean专题:拖动一个属性块(JIG拖拽)      get { return _aligned; }

  39. Kean专题:拖动一个属性块(JIG拖拽)    }

  40. Kean专题:拖动一个属性块(JIG拖拽)  }

  41. Kean专题:拖动一个属性块(JIG拖拽)

  42. Kean专题:拖动一个属性块(JIG拖拽) class BlockJig : EntityJig

  43. Kean专题:拖动一个属性块(JIG拖拽)  {

  44. Kean专题:拖动一个属性块(JIG拖拽) private Point3d _pos;

  45. Kean专题:拖动一个属性块(JIG拖拽) private Dictionary<ObjectId, AttInfo> _attInfo;

  46. Kean专题:拖动一个属性块(JIG拖拽) private Transaction _tr;

  47. Kean专题:拖动一个属性块(JIG拖拽)

  48. Kean专题:拖动一个属性块(JIG拖拽) public BlockJig(

  49. Kean专题:拖动一个属性块(JIG拖拽)      Transaction tr,

  50. Kean专题:拖动一个属性块(JIG拖拽)      BlockReference br,

  51. Kean专题:拖动一个属性块(JIG拖拽)      Dictionary<ObjectId, AttInfo> attInfo

  52. Kean专题:拖动一个属性块(JIG拖拽) ) : base(br)

  53. Kean专题:拖动一个属性块(JIG拖拽)    {

  54. Kean专题:拖动一个属性块(JIG拖拽)      _pos = br.Position;

  55. Kean专题:拖动一个属性块(JIG拖拽)      _attInfo = attInfo;

  56. Kean专题:拖动一个属性块(JIG拖拽)      _tr = tr;

  57. Kean专题:拖动一个属性块(JIG拖拽)    }

  58. Kean专题:拖动一个属性块(JIG拖拽)

  59. Kean专题:拖动一个属性块(JIG拖拽) protected override bool Update()

  60. Kean专题:拖动一个属性块(JIG拖拽)    {

  61. Kean专题:拖动一个属性块(JIG拖拽)      BlockReference br = Entity as BlockReference;

  62. Kean专题:拖动一个属性块(JIG拖拽)

  63. Kean专题:拖动一个属性块(JIG拖拽)      br.Position = _pos;

  64. Kean专题:拖动一个属性块(JIG拖拽)

  65. Kean专题:拖动一个属性块(JIG拖拽) if (br.AttributeCollection.Count != 0)

  66. Kean专题:拖动一个属性块(JIG拖拽)      {

  67. Kean专题:拖动一个属性块(JIG拖拽) foreach (ObjectId id in br.AttributeCollection)

  68. Kean专题:拖动一个属性块(JIG拖拽)        {

  69. Kean专题:拖动一个属性块(JIG拖拽)          DBObject obj =

  70. Kean专题:拖动一个属性块(JIG拖拽)            _tr.GetObject(id, OpenMode.ForRead);

  71. Kean专题:拖动一个属性块(JIG拖拽)          AttributeReference ar =

  72. Kean专题:拖动一个属性块(JIG拖拽)            obj as AttributeReference;

  73. Kean专题:拖动一个属性块(JIG拖拽)

  74. Kean专题:拖动一个属性块(JIG拖拽) // Apply block transform to att def position

  75. Kean专题:拖动一个属性块(JIG拖拽)

  76. Kean专题:拖动一个属性块(JIG拖拽) if (ar != null)

  77. Kean专题:拖动一个属性块(JIG拖拽)          {

  78. Kean专题:拖动一个属性块(JIG拖拽)            ar.UpgradeOpen();

  79. Kean专题:拖动一个属性块(JIG拖拽)            AttInfo ai = _attInfo[ar.ObjectId];

  80. Kean专题:拖动一个属性块(JIG拖拽)            ar.Position =

  81. Kean专题:拖动一个属性块(JIG拖拽)              ai.Position.TransformBy(br.BlockTransform);

  82. Kean专题:拖动一个属性块(JIG拖拽) if (ai.IsAligned)

  83. Kean专题:拖动一个属性块(JIG拖拽)            {

  84. Kean专题:拖动一个属性块(JIG拖拽)              ar.AlignmentPoint =

  85. Kean专题:拖动一个属性块(JIG拖拽)                ai.Alignment.TransformBy(br.BlockTransform);

  86. Kean专题:拖动一个属性块(JIG拖拽)            }

  87. Kean专题:拖动一个属性块(JIG拖拽) if (ar.IsMTextAttribute)

  88. Kean专题:拖动一个属性块(JIG拖拽)            {

  89. Kean专题:拖动一个属性块(JIG拖拽)              ar.UpdateMTextAttribute();

  90. Kean专题:拖动一个属性块(JIG拖拽)            }

  91. Kean专题:拖动一个属性块(JIG拖拽)          }

  92. Kean专题:拖动一个属性块(JIG拖拽)        }

  93. Kean专题:拖动一个属性块(JIG拖拽)      }

  94. Kean专题:拖动一个属性块(JIG拖拽) return true;

  95. Kean专题:拖动一个属性块(JIG拖拽)    }

  96. Kean专题:拖动一个属性块(JIG拖拽)

  97. Kean专题:拖动一个属性块(JIG拖拽) protected override SamplerStatus Sampler(JigPrompts prompts)

  98. Kean专题:拖动一个属性块(JIG拖拽)    {

  99. Kean专题:拖动一个属性块(JIG拖拽)      JigPromptPointOptions opts =

  100. Kean专题:拖动一个属性块(JIG拖拽) new JigPromptPointOptions("\nSelect insertion point:");

  101. Kean专题:拖动一个属性块(JIG拖拽)      opts.BasePoint = new Point3d(0, 0, 0);

  102. Kean专题:拖动一个属性块(JIG拖拽)      opts.UserInputControls =

  103. Kean专题:拖动一个属性块(JIG拖拽)        UserInputControls.NoZeroResponseAccepted;

  104. Kean专题:拖动一个属性块(JIG拖拽)

  105. Kean专题:拖动一个属性块(JIG拖拽)      PromptPointResult ppr = prompts.AcquirePoint(opts);

  106. Kean专题:拖动一个属性块(JIG拖拽)

  107. Kean专题:拖动一个属性块(JIG拖拽) if (_pos == ppr.Value)

  108. Kean专题:拖动一个属性块(JIG拖拽)      {

  109. Kean专题:拖动一个属性块(JIG拖拽) return SamplerStatus.NoChange;

  110. Kean专题:拖动一个属性块(JIG拖拽)      }

  111. Kean专题:拖动一个属性块(JIG拖拽)

  112. Kean专题:拖动一个属性块(JIG拖拽)      _pos = ppr.Value;

  113. Kean专题:拖动一个属性块(JIG拖拽)

  114. Kean专题:拖动一个属性块(JIG拖拽) return SamplerStatus.OK;

  115. Kean专题:拖动一个属性块(JIG拖拽)    }

  116. Kean专题:拖动一个属性块(JIG拖拽)

  117. Kean专题:拖动一个属性块(JIG拖拽) public PromptStatus Run()

  118. Kean专题:拖动一个属性块(JIG拖拽)    {

  119. Kean专题:拖动一个属性块(JIG拖拽) Document doc =

  120. Kean专题:拖动一个属性块(JIG拖拽) Application.DocumentManager.MdiActiveDocument;

  121. Kean专题:拖动一个属性块(JIG拖拽) Editor ed = doc.Editor;

  122. Kean专题:拖动一个属性块(JIG拖拽)

  123. Kean专题:拖动一个属性块(JIG拖拽)      PromptResult promptResult = ed.Drag(this);

  124. Kean专题:拖动一个属性块(JIG拖拽) return promptResult.Status;

  125. Kean专题:拖动一个属性块(JIG拖拽)    }

  126. Kean专题:拖动一个属性块(JIG拖拽)  }

  127. Kean专题:拖动一个属性块(JIG拖拽)

  128. Kean专题:拖动一个属性块(JIG拖拽) public class Commands

  129. Kean专题:拖动一个属性块(JIG拖拽)  {

  130. Kean专题:拖动一个属性块(JIG拖拽) [CommandMethod("BJ")]

  131. Kean专题:拖动一个属性块(JIG拖拽) static public void BlockJigCmd()

  132. Kean专题:拖动一个属性块(JIG拖拽)    {

  133. Kean专题:拖动一个属性块(JIG拖拽) Document doc =

  134. Kean专题:拖动一个属性块(JIG拖拽) Application.DocumentManager.MdiActiveDocument;

  135. Kean专题:拖动一个属性块(JIG拖拽) Database db = doc.Database;

  136. Kean专题:拖动一个属性块(JIG拖拽) Editor ed = doc.Editor;

  137. Kean专题:拖动一个属性块(JIG拖拽)

  138. Kean专题:拖动一个属性块(JIG拖拽)      PromptStringOptions pso =

  139. Kean专题:拖动一个属性块(JIG拖拽) new PromptStringOptions("\nEnter block name: ");

  140. Kean专题:拖动一个属性块(JIG拖拽)      PromptResult pr = ed.GetString(pso);

  141. Kean专题:拖动一个属性块(JIG拖拽)

  142. Kean专题:拖动一个属性块(JIG拖拽) if (pr.Status != PromptStatus.OK)

  143. Kean专题:拖动一个属性块(JIG拖拽) return;

  144. Kean专题:拖动一个属性块(JIG拖拽)

  145. Kean专题:拖动一个属性块(JIG拖拽)      Transaction tr =

  146. Kean专题:拖动一个属性块(JIG拖拽)        doc.TransactionManager.StartTransaction();

  147. Kean专题:拖动一个属性块(JIG拖拽) using (tr)

  148. Kean专题:拖动一个属性块(JIG拖拽)      {

  149. Kean专题:拖动一个属性块(JIG拖拽)        BlockTable bt =

  150. Kean专题:拖动一个属性块(JIG拖拽) (BlockTable)tr.GetObject(

  151. Kean专题:拖动一个属性块(JIG拖拽)            db.BlockTableId,

  152. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForRead

  153. Kean专题:拖动一个属性块(JIG拖拽) );

  154. Kean专题:拖动一个属性块(JIG拖拽)

  155. Kean专题:拖动一个属性块(JIG拖拽) if (!bt.Has(pr.StringResult))

  156. Kean专题:拖动一个属性块(JIG拖拽)        {

  157. Kean专题:拖动一个属性块(JIG拖拽)          ed.WriteMessage(

  158. Kean专题:拖动一个属性块(JIG拖拽) "\nBlock \"" + pr.StringResult + "\" not found.");

  159. Kean专题:拖动一个属性块(JIG拖拽) return;

  160. Kean专题:拖动一个属性块(JIG拖拽)        }

  161. Kean专题:拖动一个属性块(JIG拖拽)

  162. Kean专题:拖动一个属性块(JIG拖拽)        BlockTableRecord space =

  163. Kean专题:拖动一个属性块(JIG拖拽) (BlockTableRecord)tr.GetObject(

  164. Kean专题:拖动一个属性块(JIG拖拽)            db.CurrentSpaceId,

  165. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForWrite

  166. Kean专题:拖动一个属性块(JIG拖拽) );

  167. Kean专题:拖动一个属性块(JIG拖拽)

  168. Kean专题:拖动一个属性块(JIG拖拽)        BlockTableRecord btr =

  169. Kean专题:拖动一个属性块(JIG拖拽) (BlockTableRecord)tr.GetObject(

  170. Kean专题:拖动一个属性块(JIG拖拽)            bt[pr.StringResult],

  171. Kean专题:拖动一个属性块(JIG拖拽)            OpenMode.ForRead);

  172. Kean专题:拖动一个属性块(JIG拖拽)

  173. Kean专题:拖动一个属性块(JIG拖拽) // Block needs to be inserted to current space before

  174. Kean专题:拖动一个属性块(JIG拖拽) // being able to append attribute to it

  175. Kean专题:拖动一个属性块(JIG拖拽)

  176. Kean专题:拖动一个属性块(JIG拖拽)        BlockReference br =

  177. Kean专题:拖动一个属性块(JIG拖拽) new BlockReference(new Point3d(), btr.ObjectId);

  178. Kean专题:拖动一个属性块(JIG拖拽)        space.AppendEntity(br);

  179. Kean专题:拖动一个属性块(JIG拖拽)        tr.AddNewlyCreatedDBObject(br, true);

  180. Kean专题:拖动一个属性块(JIG拖拽)

  181. Kean专题:拖动一个属性块(JIG拖拽)        Dictionary<ObjectId, AttInfo> attInfo =

  182. Kean专题:拖动一个属性块(JIG拖拽) new Dictionary<ObjectId,AttInfo>();

  183. Kean专题:拖动一个属性块(JIG拖拽)

  184. Kean专题:拖动一个属性块(JIG拖拽) if (btr.HasAttributeDefinitions)

  185. Kean专题:拖动一个属性块(JIG拖拽)        {

  186. Kean专题:拖动一个属性块(JIG拖拽) foreach (ObjectId id in btr)

  187. Kean专题:拖动一个属性块(JIG拖拽)          {

  188. Kean专题:拖动一个属性块(JIG拖拽)            DBObject obj =

  189. Kean专题:拖动一个属性块(JIG拖拽)              tr.GetObject(id, OpenMode.ForRead);

  190. Kean专题:拖动一个属性块(JIG拖拽)            AttributeDefinition ad =

  191. Kean专题:拖动一个属性块(JIG拖拽)              obj as AttributeDefinition;

  192. Kean专题:拖动一个属性块(JIG拖拽)

  193. Kean专题:拖动一个属性块(JIG拖拽) if (ad != null && !ad.Constant)

  194. Kean专题:拖动一个属性块(JIG拖拽)            {

  195. Kean专题:拖动一个属性块(JIG拖拽)              AttributeReference ar =

  196. Kean专题:拖动一个属性块(JIG拖拽) new AttributeReference();

  197. Kean专题:拖动一个属性块(JIG拖拽)

  198. Kean专题:拖动一个属性块(JIG拖拽)              ar.SetAttributeFromBlock(ad, br.BlockTransform);

  199. Kean专题:拖动一个属性块(JIG拖拽)              ar.Position =

  200. Kean专题:拖动一个属性块(JIG拖拽)                ad.Position.TransformBy(br.BlockTransform);

  201. Kean专题:拖动一个属性块(JIG拖拽)

  202. Kean专题:拖动一个属性块(JIG拖拽) if (ad.Justify != AttachmentPoint.BaseLeft)

  203. Kean专题:拖动一个属性块(JIG拖拽)              {

  204. Kean专题:拖动一个属性块(JIG拖拽)                ar.AlignmentPoint =

  205. Kean专题:拖动一个属性块(JIG拖拽)                  ad.AlignmentPoint.TransformBy(br.BlockTransform);

  206. Kean专题:拖动一个属性块(JIG拖拽)              }

  207. Kean专题:拖动一个属性块(JIG拖拽) if (ar.IsMTextAttribute)

  208. Kean专题:拖动一个属性块(JIG拖拽)              {

  209. Kean专题:拖动一个属性块(JIG拖拽)                ar.UpdateMTextAttribute();

  210. Kean专题:拖动一个属性块(JIG拖拽)              }

  211. Kean专题:拖动一个属性块(JIG拖拽)

  212. Kean专题:拖动一个属性块(JIG拖拽)              ar.TextString = ad.TextString;

  213. Kean专题:拖动一个属性块(JIG拖拽)

  214. Kean专题:拖动一个属性块(JIG拖拽)              ObjectId arId =

  215. Kean专题:拖动一个属性块(JIG拖拽)                br.AttributeCollection.AppendAttribute(ar);

  216. Kean专题:拖动一个属性块(JIG拖拽)              tr.AddNewlyCreatedDBObject(ar, true);

  217. Kean专题:拖动一个属性块(JIG拖拽)

  218. Kean专题:拖动一个属性块(JIG拖拽) // Initialize our dictionary with the ObjectId of

  219. Kean专题:拖动一个属性块(JIG拖拽) // the attribute reference + attribute definition info

  220. Kean专题:拖动一个属性块(JIG拖拽)

  221. Kean专题:拖动一个属性块(JIG拖拽)              attInfo.Add(

  222. Kean专题:拖动一个属性块(JIG拖拽)                arId,

  223. Kean专题:拖动一个属性块(JIG拖拽) new AttInfo(

  224. Kean专题:拖动一个属性块(JIG拖拽)                  ad.Position,

  225. Kean专题:拖动一个属性块(JIG拖拽)                  ad.AlignmentPoint,

  226. Kean专题:拖动一个属性块(JIG拖拽)                  ad.Justify != AttachmentPoint.BaseLeft

  227. Kean专题:拖动一个属性块(JIG拖拽) )

  228. Kean专题:拖动一个属性块(JIG拖拽) );

  229. Kean专题:拖动一个属性块(JIG拖拽)            }

  230. Kean专题:拖动一个属性块(JIG拖拽)          }

  231. Kean专题:拖动一个属性块(JIG拖拽)        }

  232. Kean专题:拖动一个属性块(JIG拖拽) // Run the jig

  233. Kean专题:拖动一个属性块(JIG拖拽)

  234. Kean专题:拖动一个属性块(JIG拖拽)        BlockJig myJig = new BlockJig(tr, br, attInfo);

  235. Kean专题:拖动一个属性块(JIG拖拽)

  236. Kean专题:拖动一个属性块(JIG拖拽) if (myJig.Run() != PromptStatus.OK)

  237. Kean专题:拖动一个属性块(JIG拖拽) return;

  238. Kean专题:拖动一个属性块(JIG拖拽)

  239. Kean专题:拖动一个属性块(JIG拖拽) // Commit changes if user accepted, otherwise discard

  240. Kean专题:拖动一个属性块(JIG拖拽)

  241. Kean专题:拖动一个属性块(JIG拖拽)        tr.Commit();

  242. Kean专题:拖动一个属性块(JIG拖拽)      }

  243. Kean专题:拖动一个属性块(JIG拖拽)    }

  244. Kean专题:拖动一个属性块(JIG拖拽)  }

  245. Kean专题:拖动一个属性块(JIG拖拽)}

A few comments on this code:
It's been refactored to make a single pass through the block definition to both create the block reference and collect the attribute information to store in our dictionary.
The attribute information is now held in a class, which allows us to store more than just the position in our dictionary (without using multiple dictionaries), I went to the effort of exposing public properties for the various private members, as this is generally a good technique to use (if a little redundant, here).
The dictionary now stores this attribute information against an ObjectId rather than the tag string. Roland made the excellent point that blocks can contain attributes with duplicate tags, so this is much safe. We also had to use the ObjectId of the AttributeReference, as later on inside the jig's Update() function we no longer have access to the AttributeDefinition.

一些对于这些代码的评价

它被重构用来定义一个块来创建块参照并收集属性信息存储在我们的字典。

属性信息现在被约束在一个类中,它可以让我们存储更多的不仅仅是位置在我们的字典中(在不使用多个词典的情况下),我们努力为更多的私有成员暴漏他们的公有属性,因为这通常是一个良好的技术使用(但是在这有点多余)。

字典存储现在针对的ObjectId,而不是标记字符串该属性信息。罗兰提出,块可以包含重复的标记属性非常好的一点,所以这是非常安全的。我们也可以用AttributeReference的的ObjectId,作为后来拖拽的更新()函数中我们不再有机会获得AttributeDefinition。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-02
  • 2022-12-23
  • 2021-12-22
  • 2021-04-09
猜你喜欢
  • 2022-01-23
  • 2022-02-17
  • 2021-09-01
  • 2021-07-05
  • 2021-09-25
  • 2021-11-21
  • 2022-01-26
相关资源
相似解决方案