找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1655|回复: 0

[分享] TransientManager CustomMove

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-3-7 12:57:13 | 显示全部楼层 |阅读模式

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

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

×
Autodesk.AutoCAD.GraphicsInterface Class

  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.GraphicsInterface;
  6. using Autodesk.AutoCAD.Runtime;
  7. using System.Collections.Generic;
  8. using System;
  9. using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;

  10. namespace CustomMove
  11. {
  12.     public class Commands
  13.     {
  14.         [CommandMethod("MYMOVE", CommandFlags.UsePickSet)]
  15.         public static void CustomMoveCmd()
  16.         {
  17.             Document doc = Application.DocumentManager.MdiActiveDocument;
  18.             Editor ed = doc.Editor;

  19.             // Start by getting the objects to move
  20.             // (will use the pickfirst set, if defined)

  21.             PromptSelectionResult psr = ed.GetSelection();
  22.             if (psr.Status != PromptStatus.OK || psr.Value.Count == 0)
  23.                 return;

  24.             // Create a collection of the selected objects' IDs

  25.             var ids = new ObjectIdCollection(psr.Value.GetObjectIds());

  26.             // Ask the user to select a base point for the move
  27.             var ppr = ed.GetPoint("\nSpecify base point: ");
  28.             if (ppr.Status != PromptStatus.OK)
  29.                 return;

  30.             var basePt = ppr.Value;
  31.             var curPt = basePt;

  32.             // A local delegate for our event handler so
  33.             // we can remove it at the end

  34.             PointMonitorEventHandler handler = null;

  35.             // Our transaction
  36.             var tr = doc.Database.TransactionManager.StartTransaction();
  37.             using (tr)
  38.             {
  39.                 // Create our transient drawables, with associated
  40.                 // graphics, from the selected objects

  41.                 List<Drawable> drawables = CreateTransGraphics(tr, ids);
  42.                 try
  43.                 {

  44.                     // Add our point monitor
  45.                     // (as a delegate we have access to basePt and curPt,
  46.                     //  which avoids having to access global/member state)

  47.                     handler = delegate(object sender, PointMonitorEventArgs e)
  48.                       {
  49.                           // Get the point, with "ortho" applied, if needed
  50.                           Point3d pt = e.Context.RawPoint;
  51.                           if (IsOrthModeOn())
  52.                               pt = GetOrthoPoint(basePt, pt);

  53.                           // Update our graphics and the current point
  54.                           UpdateTransGraphics(drawables, curPt, pt);
  55.                           curPt = pt;
  56.                       };

  57.                     ed.PointMonitor += handler;

  58.                     // Ask for the destination, during which the point
  59.                     // monitor will be updating the transient graphics

  60.                     var opt = new PromptPointOptions("\nSpecify second point: ");
  61.                     opt.UseBasePoint = true;
  62.                     opt.BasePoint = basePt;
  63.                     ppr = ed.GetPoint(opt);

  64.                     // If the point was selected successfully...

  65.                     if (ppr.Status == PromptStatus.OK)
  66.                     {
  67.                         // ... move the entities to their destination
  68.                         MoveEntities(
  69.                           tr, basePt,
  70.                           IsOrthModeOn() ?
  71.                             GetOrthoPoint(basePt, ppr.Value) :
  72.                             ppr.Value,
  73.                           ids
  74.                         );

  75.                         // And inform the user

  76.                         ed.WriteMessage("\n{0} object{1} moved", ids.Count, ids.Count == 1 ? "" : "s");
  77.                     }
  78.                 }
  79.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  80.                 {
  81.                     ed.WriteMessage("\nException: {0}", ex.Message);
  82.                 }
  83.                 finally
  84.                 {
  85.                     // Clear any transient graphics
  86.                     ClearTransGraphics(drawables);
  87.                     // Remove the event handler
  88.                     if (handler != null)
  89.                         ed.PointMonitor -= handler;
  90.                     tr.Commit();
  91.                     tr.Dispose();
  92.                 }
  93.             }
  94.         }

  95.         private static bool IsOrthModeOn()
  96.         {
  97.             // Check the value of the ORTHOMODE sysvar
  98.             object orth = Application.GetSystemVariable("ORTHOMODE");
  99.             return Convert.ToInt32(orth) > 0;
  100.         }

  101.         private static Point3d GetOrthoPoint(Point3d basePt, Point3d pt)
  102.         {
  103.             // Apply a crude orthographic mode
  104.             double x = pt.X;
  105.             double y = pt.Y;
  106.             Vector3d vec = basePt.GetVectorTo(pt);
  107.             if (Math.Abs(vec.X) >= Math.Abs(vec.Y))
  108.                 y = basePt.Y;
  109.             else
  110.                 x = basePt.X;
  111.             return new Point3d(x, y, 0.0);
  112.         }

  113.         private static void MoveEntities(Transaction tr, Point3d basePt, Point3d moveTo, ObjectIdCollection ids)
  114.         {
  115.             // Transform a set of entities to a new location
  116.             Matrix3d mat = Matrix3d.Displacement(basePt.GetVectorTo(moveTo));
  117.             foreach (ObjectId id in ids)
  118.             {
  119.                 var ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
  120.                 ent.TransformBy(mat);
  121.             }
  122.         }

  123.         private static List<Drawable> CreateTransGraphics(Transaction tr, ObjectIdCollection ids)
  124.         {
  125.             // Create our list of drawables to return
  126.             var drawables = new List<Drawable>();
  127.             foreach (ObjectId id in ids)
  128.             {
  129.                 // Read each entity
  130.                 var ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
  131.                 // Clone it, make it red & add the clone to the list
  132.                 var drawable = ent.Clone() as Entity;
  133.                 drawable.ColorIndex = 1;
  134.                 drawables.Add(drawable);
  135.             }
  136.             // Draw each one initially

  137.             foreach (Drawable d in drawables)
  138.             {
  139.                 TransientManager.CurrentTransientManager.AddTransient(
  140.                   d, TransientDrawingMode.DirectShortTerm,
  141.                   128, new IntegerCollection()
  142.                 );
  143.             }
  144.             return drawables;
  145.         }

  146.         private static void UpdateTransGraphics(List<Drawable> drawables, Point3d curPt, Point3d moveToPt)
  147.         {
  148.             // Displace each of our drawables
  149.             Matrix3d mat = Matrix3d.Displacement(curPt.GetVectorTo(moveToPt));
  150.             // Update their graphics
  151.             foreach (Drawable d in drawables)
  152.             {
  153.                 var e = d as Entity;
  154.                 e.TransformBy(mat);
  155.                 TransientManager.CurrentTransientManager.UpdateTransient(
  156.                   d, new IntegerCollection()
  157.                 );
  158.             }
  159.         }
  160.         private static void ClearTransGraphics(List<Drawable> drawables)
  161.         {
  162.             // Clear the transient graphics for our drawables
  163.             TransientManager.CurrentTransientManager.EraseTransients(
  164.               TransientDrawingMode.DirectShortTerm,
  165.               128, new IntegerCollection()
  166.             );
  167.             // Dispose of them and clear the list
  168.             foreach (Drawable d in drawables)
  169.             {
  170.                 d.Dispose();
  171.             }
  172.             drawables.Clear();
  173.         }
  174.     }
  175. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-18 22:51 , Processed in 0.380093 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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