找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1236|回复: 0

[分享] 动态旋转实体

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-1 23:24:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
http://www.eabim.net/thread-169564-1-1.html
  1.         const string kRegAppName = "TTIF_ROT";
  2.         const int kAppCode = 1001;
  3.         const int kRotCode = 1040;

  4.         class RotateJig : EntityJig
  5.         {

  6.             double m_baseAngle, m_deltaAngle;
  7.             Point3d m_rotationPoint;
  8.             Matrix3d m_ucs;

  9.             public RotateJig(
  10.               Entity ent,
  11.               Point3d rotationPoint,
  12.               double baseAngle,
  13.               Matrix3d ucs)
  14.                 : base(ent.Clone() as Entity)
  15.             {
  16.                 m_rotationPoint = rotationPoint;
  17.                 m_baseAngle = baseAngle;
  18.                 m_ucs = ucs;
  19.             }

  20.             protected override SamplerStatus Sampler(
  21.               JigPrompts jp
  22.             )
  23.             {
  24.                 // We acquire a single angular value

  25.                 JigPromptAngleOptions jo =
  26.                   new JigPromptAngleOptions(
  27.                     "\nAngle of rotation: "
  28.                   );
  29.                 jo.BasePoint = m_rotationPoint;
  30.                 jo.UseBasePoint = true;

  31.                 PromptDoubleResult pdr =
  32.                   jp.AcquireAngle(jo);

  33.                 if (pdr.Status == PromptStatus.OK)
  34.                 {
  35.                     // Check if it has changed or not
  36.                     // (reduces flicker)

  37.                     if (m_deltaAngle == pdr.Value)
  38.                     {
  39.                         return SamplerStatus.NoChange;
  40.                     }
  41.                     else
  42.                     {
  43.                         // Set the change in angle to
  44.                         // the new value

  45.                         m_deltaAngle = pdr.Value;
  46.                         return SamplerStatus.OK;
  47.                     }
  48.                 }
  49.                 return SamplerStatus.Cancel;
  50.             }

  51.             protected override bool Update()
  52.             {
  53.                 // We rotate the polyline by the change
  54.                 // minus the base angle

  55.                 Matrix3d trans =
  56.                   Matrix3d.Rotation(
  57.                     m_deltaAngle - m_baseAngle,
  58.                     m_ucs.CoordinateSystem3d.Zaxis,
  59.                     m_rotationPoint);
  60.                 Entity.TransformBy(trans);

  61.                 // The base becomes the previous delta
  62.                 // and the delta gets set to zero

  63.                 m_baseAngle = m_deltaAngle;
  64.                 m_deltaAngle = 0.0;

  65.                 return true;
  66.             }

  67.             public Entity GetEntity()
  68.             {
  69.                 return Entity;
  70.             }

  71.             public double GetRotation()
  72.             {
  73.                 // The overall rotation is the
  74.                 // base plus the delta

  75.                 return m_baseAngle + m_deltaAngle;
  76.             }
  77.        }
  78.         [CommandMethod("ROT")]
  79.         public void RotateEntity()
  80.         {
  81.             Document doc =
  82.               Application.DocumentManager.MdiActiveDocument;
  83.             Editor ed = doc.Editor;
  84.             Database db = doc.Database;

  85.             // First we prompt for the entity to rotate

  86.            PromptEntityOptions peo =
  87.               new PromptEntityOptions(
  88.                 "\nSelect entity to rotate: "
  89.               );
  90.             PromptEntityResult per =
  91.               ed.GetEntity(peo);

  92.             if (per.Status == PromptStatus.OK)
  93.             {
  94.                 Transaction tr =
  95.                   db.TransactionManager.StartTransaction();
  96.                 using (tr)
  97.                 {
  98.                     DBObject obj =
  99.                       tr.GetObject(per.ObjectId, OpenMode.ForRead);
  100.                     Entity ent = obj as Entity;

  101.                     // Use the origin as the default center

  102.                     Point3d rotationPoint = Point3d.Origin;

  103.                     // If the entity is a polyline,
  104.                     // assume it is rectangular and then
  105.                     // set the rotation point as its center

  106.                     Polyline pl = obj as Polyline;
  107.                     if (pl != null)
  108.                     {
  109.                         LineSegment3d ps0 =
  110.                           pl.GetLineSegmentAt(0);
  111.                         LineSegment3d ps1 =
  112.                           pl.GetLineSegmentAt(1);
  113.                         Vector3d vec =
  114.                           ((ps0.EndPoint - ps0.StartPoint) / 2.0) +
  115.                           ((ps1.EndPoint - ps1.StartPoint) / 2.0);
  116.                         rotationPoint = pl.StartPoint + vec;
  117.                     }

  118.                     // Get the base rotation angle stored with the
  119.                     // entity, if there was one (default is 0.0)

  120.                     double baseAngle = GetStoredRotation(obj);

  121.                     if (ent != null)
  122.                     {
  123.                         // Get the current UCS, to pass to the Jig

  124.                         Matrix3d ucs =
  125.                           ed.CurrentUserCoordinateSystem;

  126.                         // Create our jig object

  127.                         RotateJig jig =
  128.                           new RotateJig(
  129.                             ent,
  130.                             rotationPoint,
  131.                             baseAngle,
  132.                             ucs
  133.                           );

  134.                         PromptResult res = ed.Drag(jig);
  135.                         if (res.Status == PromptStatus.OK)
  136.                         {
  137.                             // Get the overall rotation angle
  138.                             // and dispose of the temp clone

  139.                             double newAngle = jig.GetRotation();
  140.                             jig.GetEntity().Dispose();

  141.                             // Rotate the original entity

  142.                             Matrix3d trans =
  143.                               Matrix3d.Rotation(
  144.                                 newAngle - baseAngle,
  145.                                 ucs.CoordinateSystem3d.Zaxis,
  146.                                 rotationPoint);

  147.                             ent.UpgradeOpen();
  148.                             ent.TransformBy(trans);

  149.                             // Store the new rotation as XData

  150.                             SetStoredRotation(ent, newAngle);
  151.                         }
  152.                     }
  153.                     tr.Commit();
  154.                 }
  155.             }
  156.         }

  157.         // Helper function to create a RegApp

  158.         static void AddRegAppTableRecord(string regAppName)
  159.         {
  160.             Document doc =
  161.               Application.DocumentManager.MdiActiveDocument;
  162.             Editor ed = doc.Editor;
  163.             Database db = doc.Database;

  164.             Transaction tr =
  165.               doc.TransactionManager.StartTransaction();
  166.             using (tr)
  167.             {
  168.                 RegAppTable rat =
  169.                   (RegAppTable)tr.GetObject(
  170.                     db.RegAppTableId,
  171.                     OpenMode.ForRead,
  172.                     false
  173.                   );
  174.                 if (!rat.Has(regAppName))
  175.                 {
  176.                     rat.UpgradeOpen();
  177.                     RegAppTableRecord ratr =
  178.                       new RegAppTableRecord();
  179.                     ratr.Name = regAppName;
  180.                     rat.Add(ratr);
  181.                     tr.AddNewlyCreatedDBObject(ratr, true);
  182.                 }
  183.                 tr.Commit();
  184.             }
  185.         }

  186.         // Store our rotation angle as XData

  187.         private void SetStoredRotation(
  188.           DBObject obj, double rotation)
  189.         {
  190.             AddRegAppTableRecord(kRegAppName);
  191.             ResultBuffer rb = obj.XData;
  192.             if (rb == null)
  193.             {
  194.                 rb =
  195.                   new ResultBuffer(
  196.                     new TypedValue(kAppCode, kRegAppName),
  197.                     new TypedValue(kRotCode, rotation)
  198.                   );
  199.             }
  200.             else
  201.             {
  202.                 // We can simply add our values - no need
  203.                 // to remove the previous ones, the new ones
  204.                 // are the ones that get stored

  205.                 rb.Add(new TypedValue(kAppCode, kRegAppName));
  206.                 rb.Add(new TypedValue(kRotCode, rotation));
  207.             }
  208.             obj.XData = rb;
  209.             rb.Dispose();
  210.         }

  211.         // Retrieve the existing rotation angle from XData

  212.         private double GetStoredRotation(DBObject obj)
  213.         {
  214.             double ret = 0.0;

  215.             ResultBuffer rb = obj.XData;
  216.             if (rb != null)
  217.             {
  218.                 // If we find our group code, it means that on
  219.                 // the next iteration, we'll get our rotation

  220.                 bool bReadyForRot = false;
  221.                 foreach (TypedValue tv in rb)
  222.                 {
  223.                     if (bReadyForRot)
  224.                     {
  225.                         if (tv.TypeCode == kRotCode)
  226.                             ret = (double)tv.Value;
  227.                         bReadyForRot = false;
  228.                     }
  229.                     if (tv.TypeCode == kAppCode)
  230.                         bReadyForRot = true;
  231.                 }
  232.                 rb.Dispose();
  233.             }
  234.             return ret;
  235.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:56 , Processed in 0.381132 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表