码迷,mamicode.com
首页 > 其他好文 > 详细

Kean专题:内容JIG(拖拽)

时间:2015-10-16 23:24:04      阅读:854      评论:0      收藏:0      [点我收藏+]

标签:

一、使用Jig动态旋转实体(转载:明经通道 mccad 翻译)

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

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

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

1.keen源码内容翻译及源码展示:
2008年3月28日
通过 .NET 动态旋转AutoCAD  图元
本文由明经通道 mccad 翻译,转载请注明出处
在上一文章中有一有趣的需求与另一文章中的问题相似。原来的问题是以矩形的中心旋转矩形多段线图元,并且之后还可继续旋转它。有几点我比较感兴趣:
矩形是由四个点组成的简单多段线,它并不存在中心点和旋转角度的概念。
至少对我来说,很明显需要计算中心点并将旋转角度做为XData保存在多段线上。
要形象化的修改最好是以动态方式。
大部分示例是演示如何使用动态来创建新图元,而非修改现有图元。
因此,考虑到这一点,我使用以下C#代码来解决这个问题:

keen源码:

  1. 技术分享using Autodesk.AutoCAD.ApplicationServices;

  2. 技术分享using Autodesk.AutoCAD.DatabaseServices;

  3. 技术分享using Autodesk.AutoCAD.EditorInput;

  4. 技术分享using Autodesk.AutoCAD.Runtime;

  5. 技术分享using Autodesk.AutoCAD.Geometry;

  6. 技术分享

  7. 技术分享namespace RotatingRectangles

  8. 技术分享{

  9. 技术分享 public class Commands

  10. 技术分享  {

  11. 技术分享 // Define some constants we‘ll use to

  12. 技术分享 // store our XData   定义一些常量,我们用来储存扩展数据

  13. 技术分享

  14. 技术分享 // AppName is our RDS (TTIF, for

  15. 技术分享 // "Through The InterFace") plus an indicator

  16. 技术分享 // what it‘s for (ROTation)   在解释那个TTIF_ROT   RDS 远程数据服务?

  17. 技术分享

  18. 技术分享 const string kRegAppName = "TTIF_ROT";

  19. 技术分享 const int kAppCode = 1001;

  20. 技术分享 const int kRotCode = 1040;

  21. 技术分享

  22. 技术分享 class RotateJig : EntityJig

  23. 技术分享    {

  24. 技术分享 // Declare some internal state  声明一些内容状态

  25. 技术分享

  26. 技术分享 double m_baseAngle, m_deltaAngle;

  27. 技术分享      Point3d m_rotationPoint;

  28. 技术分享      Matrix3d m_ucs;

  29. 技术分享

  30. 技术分享 // Constructor sets the state and clone the entity passed in (adequate for simple entities)

  31. 构造器设置状态并且复制传入的实体

  32. 技术分享 public RotateJig(

  33. 技术分享        Entity ent,

  34. 技术分享        Point3d rotationPoint,

  35. 技术分享 double baseAngle,

  36. 技术分享        Matrix3d ucs)

  37. 技术分享        : base(ent.Clone() as Entity)

  38. 技术分享      {

  39. 技术分享        m_rotationPoint = rotationPoint;

  40. 技术分享        m_baseAngle = baseAngle;

  41. 技术分享        m_ucs = ucs;

  42. 技术分享      }

  43. 技术分享

  44. 技术分享 protected override SamplerStatus Sampler(

  45. 技术分享        JigPrompts jp

  46. 技术分享 )

  47. 技术分享      {

  48. 技术分享 // We acquire a single angular value

  49. 技术分享

  50. 技术分享        JigPromptAngleOptions jo =

  51. 技术分享 new JigPromptAngleOptions(

  52. 技术分享 "\nAngle of rotation: "

  53. 技术分享 );

  54. 技术分享        jo.BasePoint = m_rotationPoint;

  55. 技术分享        jo.UseBasePoint = true;

  56. 技术分享

  57. 技术分享        PromptDoubleResult pdr =

  58. 技术分享          jp.AcquireAngle(jo);

  59. 技术分享

  60. 技术分享 if (pdr.Status == PromptStatus.OK)

  61. 技术分享        {

  62. 技术分享 // Check if it has changed or not (reduces flicker)

  63. 技术分享 if (m_deltaAngle == pdr.Value)

  64. 技术分享          {

  65. 技术分享 return SamplerStatus.NoChange;

  66. 技术分享          }

  67. 技术分享 else

  68. 技术分享          {

  69. 技术分享 // Set the change in angle to the new value

  70. 技术分享

  71. 技术分享            m_deltaAngle = pdr.Value;

  72. 技术分享 return SamplerStatus.OK;

  73. 技术分享          }

  74. 技术分享        }

  75. 技术分享 return SamplerStatus.Cancel;

  76. 技术分享      }

  77. 技术分享

  78. 技术分享 protected override bool Update()

  79. 技术分享      {

  80. 技术分享 // We rotate the polyline by the change minus the base angle

  81. 技术分享

  82. 技术分享        Matrix3d trans =

  83. 技术分享          Matrix3d.Rotation(

  84. 技术分享            m_deltaAngle - m_baseAngle,

  85. 技术分享            m_ucs.CoordinateSystem3d.Zaxis,

  86. 技术分享            m_rotationPoint);

  87. 技术分享        Entity.TransformBy(trans);

  88. 技术分享

  89. 技术分享 // The base becomes the previous delta and the delta gets set to zero

  90. 技术分享

  91. 技术分享        m_baseAngle = m_deltaAngle;

  92. 技术分享        m_deltaAngle = 0.0;

  93. 技术分享

  94. 技术分享 return true;

  95. 技术分享      }

  96. 技术分享

  97. 技术分享 public Entity GetEntity()

  98. 技术分享      {

  99. 技术分享 return Entity;

  100. 技术分享      }

  101. 技术分享

  102. 技术分享 public double GetRotation()

  103. 技术分享      {

  104. 技术分享 // The overall rotation is the base plus the delta

  105. 技术分享 return m_baseAngle + m_deltaAngle;

  106. 技术分享      }

  107. 技术分享    }

  108. 技术分享 [CommandMethod("ROT")]

  109. 技术分享 public void RotateEntity()

  110. 技术分享    {

  111. 技术分享 Document doc =

  112. 技术分享 Application.DocumentManager.MdiActiveDocument;

  113. 技术分享 Editor ed = doc.Editor;

  114. 技术分享 Database db = doc.Database;

  115. 技术分享 // First we prompt for the entity to rotate

  116.    PromptEntityOptions peo =

  117. 技术分享 new PromptEntityOptions(

  118. 技术分享 "\nSelect entity to rotate: "

  119. 技术分享 );

  120. 技术分享      PromptEntityResult per =

  121. 技术分享        ed.GetEntity(peo);

  122. if (per.Status == PromptStatus.OK)

  123. 技术分享      {

  124. 技术分享        Transaction tr =

  125. 技术分享          db.TransactionManager.StartTransaction();

  126. 技术分享 using (tr)

  127. 技术分享        {

  128. 技术分享          DBObject obj =

  129. 技术分享            tr.GetObject(per.ObjectId, OpenMode.ForRead);

  130. 技术分享          Entity ent = obj as Entity;

  131.   // Use the origin as the default center

  132. 技术分享 Point3d rotationPoint = Point3d.Origin;

  133. 技术分享// If the entity is a polyline,assume it is rectangular and then set the rotation point as its center

  134. 技术分享          Polyline pl = obj as Polyline;

  135. 技术分享 if (pl != null)

  136. 技术分享          {

  137. 技术分享            LineSegment3d ps0 =

  138. 技术分享              pl.GetLineSegmentAt(0);

  139. 技术分享            LineSegment3d ps1 =

  140. 技术分享              pl.GetLineSegmentAt(1);

  141. 技术分享            Vector3d vec =

  142. 技术分享 ((ps0.EndPoint - ps0.StartPoint) / 2.0) +

  143. 技术分享 ((ps1.EndPoint - ps1.StartPoint) / 2.0);

  144. 技术分享            rotationPoint = pl.StartPoint + vec;

  145. 技术分享          }

  146. 技术分享 // Get the base rotation angle stored with the

  147. 技术分享 // entity, if there was one (default is 0.0)

  148. 技术分享 double baseAngle = GetStoredRotation(obj);技术分享

  149. 技术分享 if (ent != null)

  150. 技术分享          {

  151. 技术分享 // Get the current UCS, to pass to the Jig

  152. 技术分享            Matrix3d ucs =

  153. 技术分享              ed.CurrentUserCoordinateSystem;

  154. 技术分享 // Create our jig object

  155. 技术分享            RotateJig jig =

  156. 技术分享 new RotateJig(

  157. 技术分享                ent,

  158. 技术分享                rotationPoint,

  159. 技术分享                baseAngle,

  160. 技术分享                ucs

  161. 技术分享 );

  162. 技术分享            PromptResult res = ed.Drag(jig);

  163. 技术分享 if (res.Status == PromptStatus.OK)

  164. 技术分享            {

  165. 技术分享 // Get the overall rotation angle

  166. 技术分享 // and dispose of the temp clone

  167. 技术分享 double newAngle = jig.GetRotation();

  168. 技术分享              jig.GetEntity().Dispose();

  169. 技术分享 // Rotate the original entity

  170. 技术分享              Matrix3d trans =

  171. 技术分享                Matrix3d.Rotation(

  172. 技术分享                  newAngle - baseAngle,

  173. 技术分享                  ucs.CoordinateSystem3d.Zaxis,

  174. 技术分享                  rotationPoint);

  175. 技术分享              ent.UpgradeOpen();

  176. 技术分享              ent.TransformBy(trans);

  177. 技术分享 // Store the new rotation as XData

  178. 技术分享              SetStoredRotation(ent, newAngle);

  179. 技术分享            }

  180. 技术分享          }

  181. 技术分享          tr.Commit();

  182. 技术分享        }

  183. 技术分享      }

  184. 技术分享    }

  185. 技术分享 // Helper function to create a RegApp

  186. 技术分享 static void AddRegAppTableRecord(string regAppName)

  187. 技术分享    {

  188. 技术分享 Document doc =

  189. 技术分享 Application.DocumentManager.MdiActiveDocument;

  190. 技术分享 Editor ed = doc.Editor;

  191. 技术分享 Database db = doc.Database;

  192. 技术分享      Transaction tr =

  193. 技术分享        doc.TransactionManager.StartTransaction();

  194. 技术分享 using (tr)

  195. 技术分享      {

  196. 技术分享        RegAppTable rat =

  197. 技术分享 (RegAppTable)tr.GetObject(

  198. 技术分享            db.RegAppTableId,

  199. 技术分享            OpenMode.ForRead,

  200. 技术分享 false

  201. 技术分享 );

  202. 技术分享 if (!rat.Has(regAppName))

  203. 技术分享        {

  204. 技术分享          rat.UpgradeOpen();

  205. 技术分享          RegAppTableRecord ratr =

  206. 技术分享 new RegAppTableRecord();

  207. 技术分享          ratr.Name = regAppName;

  208. 技术分享          rat.Add(ratr);

  209. 技术分享          tr.AddNewlyCreatedDBObject(ratr, true);

  210. 技术分享        }

  211. 技术分享        tr.Commit();

  212. 技术分享      }

  213. 技术分享    }

  214. 技术分享 // Store our rotation angle as XData

  215. 技术分享 private void SetStoredRotation(

  216. 技术分享      DBObject obj, double rotation)

  217. 技术分享    {

  218. 技术分享      AddRegAppTableRecord(kRegAppName);

  219. 技术分享      ResultBuffer rb = obj.XData;

  220. 技术分享 if (rb == null)

  221. 技术分享      {

  222. 技术分享        rb =

  223. 技术分享 new ResultBuffer(

  224. 技术分享 new TypedValue(kAppCode, kRegAppName),

  225. 技术分享 new TypedValue(kRotCode, rotation)

  226. 技术分享 );

  227. 技术分享      }

  228. 技术分享 else

  229. 技术分享      {

  230. 技术分享 // We can simply add our values - no need

  231. 技术分享 // to remove the previous ones, the new ones

  232. 技术分享 // are the ones that get stored

  233. 技术分享

  234. 技术分享        rb.Add(new TypedValue(kAppCode, kRegAppName));

  235. 技术分享        rb.Add(new TypedValue(kRotCode, rotation));

  236. 技术分享      }

  237. 技术分享      obj.XData = rb;

  238. 技术分享      rb.Dispose();

  239. 技术分享    }

  240. 技术分享

  241. 技术分享 // Retrieve the existing rotation angle from XData

  242. 技术分享

  243. 技术分享 private double GetStoredRotation(DBObject obj)

  244. 技术分享    {

  245. 技术分享 double ret = 0.0;

  246. 技术分享

  247. 技术分享      ResultBuffer rb = obj.XData;

  248. 技术分享 if (rb != null)

  249. 技术分享      {

  250. 技术分享 // If we find our group code, it means that on

  251. 技术分享 // the next iteration, we‘ll get our rotation

  252. 技术分享

  253. 技术分享 bool bReadyForRot = false;

  254. 技术分享 foreach (TypedValue tv in rb)

  255. 技术分享        {

  256. 技术分享 if (bReadyForRot)

  257. 技术分享          {

  258. 技术分享 if (tv.TypeCode == kRotCode)

  259. 技术分享              ret = (double)tv.Value;

  260. 技术分享            bReadyForRot = false;

  261. 技术分享          }

  262. 技术分享 if (tv.TypeCode == kAppCode)

  263. 技术分享            bReadyForRot = true;

  264. 技术分享        }

  265. 技术分享        rb.Dispose();

  266. 技术分享      }

  267. 技术分享 return ret;

  268. 技术分享    }

  269. 技术分享  }

  270. 技术分享}

试用代码前,可用 RECTANG 命令创建一水平方向矩形,然后使用自定义的ROT命令来旋转它
之后再调用 ROT命令运行也会正常,因为图元“记住”了旋转角度。如果用了其它的工具旋转了这个矩形,这种效果就会消失。一种方法是深层的分析矩形来测量“旋转角度”:确定矩形的长边,获得它的角度。另一种毫无意义的方法是执行命令让用户输入角度(选择两个点或直接输入)。

2.keen源码的图形展示:

 

技术分享

 

 

第一篇已有明经通道mccad 翻译,此部分内容直接转载了,接下来的日子里我争取在每周末对翻译的Kean的博客进行更新,也同时上传一些自己开发过程中实现的图形的以及图形的实现思路

Kean专题:内容JIG(拖拽)

标签:

原文地址:http://www.cnblogs.com/sinper/p/4886527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!