找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2957|回复: 5

[分享] 通用jig类,用到委托

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-3 11:28:49 | 显示全部楼层 |阅读模式

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

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

×
http://www.cnblogs.com/houlinbo/archive/2010/02/10/1667174.html

  1. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->
  2. /// 通用jig类,用到委托,by houlinbo QQ420021327
  3. using System;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.GraphicsInterface;
  9. using Autodesk.AutoCAD.Runtime;
  10. using System.Collections.Generic;
  11. namespace ArxHlb
  12. {

  13.     //委托类
  14.     public delegate void DelegateJig(Entity ent, Point3d ptBase, Point3d ptTo);


  15.     //jig的入口类
  16.     public class CADJigDelegate
  17.     {
  18.         /// <summary>
  19.         ///  入口函数
  20.         /// </summary>
  21.         /// <param name="ed">ed</param>
  22.         /// <param name="lstEnt">实体列表</param>
  23.         /// <param name="promp">提示</param>
  24.         /// <returns></returns>
  25.         public static bool Jig(Editor ed, List<Entity> lstEnt, string promp, DelegateJig op)
  26.         {
  27.             JigDelegate jig = new JigDelegate();
  28.             jig.lstEnt = lstEnt;
  29.             jig.promp = promp;
  30.             jig.op = op;
  31.             PromptResult prJig = ed.Drag(jig);
  32.             if (prJig.Status != PromptStatus.OK)
  33.             {
  34.                 return false;
  35.             }
  36.             else
  37.             {
  38.                 return true;
  39.             }
  40.         }
  41.     }




  42.     //本类是Jig,单独的实体或实体列表均可调用
  43.     public class JigDelegate : DrawJig
  44.     {
  45.         private List<Entity> _lstEnt; //移动的实体
  46.         private string _promp;   //提示
  47.         private DelegateJig _op;//委拖

  48.         private Point3d ptBase = new Point3d();//基点
  49.         private Point3d ptTo;   //插入点


  50.         /// <summary>
  51.         /// 移动的实体
  52.         /// </summary>
  53.         public List<Entity> lstEnt
  54.         {
  55.             set { _lstEnt = value; }
  56.         }

  57.         /// <summary>
  58.         /// /提示
  59.         /// </summary>
  60.         public string promp
  61.         {
  62.             set { _promp = value; }
  63.         }

  64.         /// <summary>
  65.         /// /委托
  66.         /// </summary>
  67.         public DelegateJig op
  68.         {
  69.             set { _op = value; }
  70.             get { return _op; }
  71.         }



  72.         protected override SamplerStatus Sampler(JigPrompts prompts)
  73.         {
  74.             JigPromptPointOptions optJigPoint = new JigPromptPointOptions(_promp);

  75.             optJigPoint.UserInputControls =
  76.                    UserInputControls.Accept3dCoordinates |
  77.                    UserInputControls.NoZeroResponseAccepted |
  78.                    UserInputControls.NoNegativeResponseAccepted |
  79.                    UserInputControls.NullResponseAccepted;

  80.             optJigPoint.Keywords.Add("Undo", "Undo", "放弃(U)");


  81.             PromptPointResult resJigPoint = prompts.AcquirePoint(optJigPoint);
  82.             Point3d curPt = resJigPoint.Value;
  83.             ptBase = ptTo;
  84.             if (ptTo != curPt)
  85.             {
  86.                 ptTo = curPt;
  87.                 return SamplerStatus.OK;
  88.             }
  89.             else
  90.             {
  91.                 return SamplerStatus.NoChange;
  92.             }
  93.         }


  94.         protected override bool WorldDraw(WorldDraw draw)
  95.         {
  96.             try
  97.             {
  98.                 foreach (Entity ent in _lstEnt)
  99.                 {
  100.                     op(ent, ptBase, ptTo); //委托函数,返回去调用具体对每个实体所执行的操作

  101.                     ent.RecordGraphicsModified(true);
  102.                     draw.Geometry.Draw(ent);
  103.                 }
  104.             }
  105.             catch (System.Exception)
  106.             {
  107.                 return false;
  108.             }
  109.             return true;
  110.         }

  111.     }
  112. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-9-4 17:23:41 | 显示全部楼层
如果简单的拖动 这样也行更好

  1.         /// <summary>
  2.         /// 单行文字分解
  3.         /// </summary>
  4.         [CommandMethod("t4")]
  5.         public static void Test4()
  6.         {

  7.             var ed = SystemManager.Editor;
  8.             var opts = new PromptEntityOptions("\n请选择文本:");
  9.             opts.SetRejectMessage("你选择的不是文本,请重新选择!");
  10.             opts.AddAllowedClass(typeof(DBText), false);
  11.             var res = ed.GetEntity(opts);
  12.             if (res.Status != PromptStatus.OK) return;

  13.             using (var tr = new DBTransaction())
  14.             {

  15.                 var btr =tr.OpenCurrentSpace(OpenMode.ForWrite);

  16.                 var txt = tr.GetObject<DBText>(res.ObjectId).Copy();
  17.                 var ext = txt.GeometricExtents;
  18.                 var pt = ext.MinPoint;
  19.                 var txts = new List<DBText>();

  20.                 int color = 1;
  21.                 foreach(char c in txt.TextString)
  22.                 {
  23.                     var s = c.ToString();
  24.                     var txtx =
  25.                         new DBText
  26.                         {
  27.                             TextString = s,
  28.                             TextStyleId = txt.TextStyleId,
  29.                             Height = txt.Height,
  30.                             Position = pt,
  31.                             ColorIndex = color ++
  32.                         };
  33.                     txtx.SetDatabaseDefaults();
  34.                     txts.Add(txtx);
  35.                     var width = Utils.GetTextExtents(txt.TextStyleId, s, txt.Height).X;
  36.                     pt += new Vector3d(width, 0, 0);
  37.                 }

  38.                 tr.AddEntity(btr, txts);

  39.                 //简单的拖动方式
  40.                 var ss = SelectionSet.FromObjectIds(txts.Select(t => t.ObjectId).ToArray());
  41.                 var ptBase = ext.MinPoint;
  42.                 var resDrag =
  43.                     ed.Drag(
  44.                         ss,
  45.                         "\n输入插入点",
  46.                         (Point3d p, ref Matrix3d m) =>
  47.                         {
  48.                             m = Matrix3d.Displacement(p - ptBase);
  49.                             return SamplerStatus.OK;
  50.                         });
  51.                 if (resDrag.Status == PromptStatus.OK)
  52.                 {
  53.                     var mat = Matrix3d.Displacement(resDrag.Value - ptBase);
  54.                     txts.ForEach(c => c.TransformBy(mat));
  55.                 }
  56.                 else
  57.                 {
  58.                     tr.Erase(txts);
  59.                 }

  60.             }
  61.         }

点评

好好看看,看着 Jig 就麻烦,一直也没有学,这个简单  详情 回复 发表于 2014-9-4 17:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-9-4 17:57:33 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-4 17:23
如果简单的拖动 这样也行更好

好好看看,看着 Jig 就麻烦,一直也没有学,这个简单
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-3-20 11:22:45 | 显示全部楼层
学习一下,net 2.0 不知道能用不
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 50个

财富等级: 招财进宝

发表于 2016-10-10 07:08:04 | 显示全部楼层
确实是难得好帖啊,顶先
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

发表于 2017-12-17 20:31:36 | 显示全部楼层
感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-17 20:23 , Processed in 0.254317 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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