明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1814|回复: 4

[JIG] Jig学习---通用Jig

[复制链接]
发表于 2020-10-18 23:55:21 | 显示全部楼层 |阅读模式
  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;
  8. using System.Collections.Generic;
  9. using ZgxCommomLib;

  10. [assembly: CommandClass(typeof(test.ClassCommand))]
  11. namespace test
  12. {
  13.     //委托类
  14.     public delegate void DelChangeEntity(Entity ent, Point3d frompt, Point3d movetopt);
  15.     public delegate Matrix3d DelSetMat(Point3d frompt, Point3d topt, double angle);
  16.     public class ClassCommand
  17.     {
  18.         [CommandMethod("lplp")]
  19.         public void test()
  20.         {
  21.             Document doc = Application.DocumentManager.MdiActiveDocument;
  22.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  23.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

  24.             PromptSelectionResult psr = ed.GetSelection();
  25.             SelectionSet ss = psr.Value;
  26.             PromptPointResult ppr = ed.GetPoint("\n 选择点");
  27.             Point3d ptBase = ppr.Value;
  28.             ptBase = ptBase.TransformBy(ed.CurrentUserCoordinateSystem);

  29.             //实体变换委托
  30.             void del1(Entity ent, Point3d pt, Point3d moveform)
  31.             {
  32.                 using (OpenCloseTransaction tr = db.TransactionManager.StartOpenCloseTransaction())
  33.                 {
  34.                     tr.GetObject(ent.ObjectId, OpenMode.ForWrite, false);
  35.                     if (ent is DBText)
  36.                         ((DBText)ent).TextString = pt.ToString();
  37.                     else if (ent is MText)
  38.                         ((MText)ent).Contents = pt.ToString();
  39.                     tr.Commit();
  40.                 }
  41.             }

  42.             //变换矩阵委托
  43.             Matrix3d mat(Point3d ptFrom, Point3d ptTo, double angle)
  44.             {
  45.                 //angle = 100.02;
  46.                 return Matrix3d.Displacement(ptFrom.GetVectorTo(ptTo));
  47.             }

  48.             DelSetMat setMat = new DelSetMat(mat);
  49.             DelChangeEntity changeEntity = new DelChangeEntity(del1);

  50.             //通过类实例化jig
  51.             DelDrawJig delJig = DrawJigEntrance.EnterJig(changeEntity, setMat, true, true);

  52.             int iControlFlag = (int)(UserInputControls.Accept3dCoordinates |
  53.                    UserInputControls.NoZeroResponseAccepted |
  54.                    UserInputControls.NoNegativeResponseAccepted |
  55.                    UserInputControls.NullResponseAccepted);

  56.             delJig.AddEntity(ss);
  57.             delJig.BasePnt = ptBase;
  58.             delJig.Movefrom = ptBase;
  59.             delJig.MoveEndPnt = ptBase;
  60.             delJig.PrmpStr = "\n移动到";
  61.             delJig.KeyString = "A_A旋转;S_S左右镜像;D_D重新选点;F_F图取标高值<退出>";
  62.             delJig.CursorType = (int)CursorType.Crosshair;
  63.             delJig.ControlFlag = iControlFlag;

  64.             using (delJig)
  65.             {
  66.                 try
  67.                 {

  68.                     //事务管理器
  69.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  70.                     {
  71.                         // Draw Jig 交互
  72.                         PromptResult pr;
  73.                         pr = ed.Drag(delJig);
  74.                         // 结果
  75.                         if (pr.Status == PromptStatus.OK)
  76.                         {
  77.                             delJig.TransFormEntities();
  78.                             trans.Commit();
  79.                             ed.WriteMessage("\n 拖拽结束");
  80.                             return;
  81.                         }
  82.                         else
  83.                             trans.Abort();
  84.                     }// end of using tr1

  85.                 }//end of try
  86.                 catch (System.Exception ex)
  87.                 {
  88.                     ed.WriteMessage("\nJig出错了");
  89.                     ed.WriteMessage("\ncatch" + ex.Message);
  90.                     //Application.SetSystemVariable("orthomode", orthomode);
  91.                     return;
  92.                 }
  93.             }// end of using Jig
  94.         }

  95.     }
  96.     public class DrawJigEntrance
  97.     {
  98.         public static DelDrawJig EnterJig(DelChangeEntity changeEntity, DelSetMat acquireMat)
  99.         {
  100.             return new DelDrawJig(changeEntity, acquireMat);
  101.         }

  102.         public static DelDrawJig EnterJig(DelChangeEntity changeEntity, DelSetMat setMat, bool useMat)
  103.         {
  104.             DelDrawJig del = new DelDrawJig(changeEntity, setMat);
  105.             del.Usepushmat = useMat;
  106.             return del;
  107.         }

  108.         public static DelDrawJig EnterJig(DelChangeEntity changeEntity, DelSetMat setMat, bool useMat, bool useBasePoint)
  109.         {
  110.             DelDrawJig del = new DelDrawJig(changeEntity, setMat);
  111.             del.Usepushmat = useMat;
  112.             del.Userbasept = useBasePoint;
  113.             return del;
  114.         }
  115.     }

  116.     public class DelDrawJig : DrawJig, IDisposable
  117.     {
  118.         #region 字段

  119.         private Document doc = Application.DocumentManager.MdiActiveDocument;
  120.         private Database db = Application.DocumentManager.MdiActiveDocument.Database;
  121.         private Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

  122.         private Matrix3d _mat;//变换矩阵
  123.         private List<Entity> _entities = new List<Entity>();
  124.         private string _Callback;//回调函数名称
  125.                                  //private ResultBuffer _RbInvoke;//回调函数resultbuffer
  126.         private ResultBuffer _lsprtn;//回调lisp返回值

  127.         private string _PrmpStr;//提示字符串
  128.                                 //关键字格式:
  129.                                 //"A_A旋转;S_S左右镜像;D_D重新选点;F_F图取标高值<退出>"
  130.         private string _KeyString;//允许关键字
  131.         private int _CursorType;//光标类型
  132.         private int _ControlFlag;//采样允许输入类型
  133.         private string _RtnKeyString;//返回关键字,

  134.         private Point3d _BasePnt;//基点
  135.         private Point3d _movefrom;//出发点
  136.         private Point3d _moveto;//目标点

  137.         private bool _UseBasePt = true;//是否使用基点
  138.         private bool _UsePushMat = true;//是否使用矩阵

  139.         private DelChangeEntity _changentity;//委托方法1   
  140.         private DelSetMat _acquireMat;//委托方法2

  141.         #endregion 字段

  142.         #region 属性
  143.         //lisp回调函数名称
  144.         public string CallBack
  145.         {
  146.             get { return _Callback; }
  147.             set { _Callback = value; }
  148.         }
  149.         //移动点
  150.         public Point3d MoveEndPnt
  151.         {
  152.             get { return _moveto; }
  153.             set { _moveto = value; }
  154.         }
  155.         public Point3d BasePnt
  156.         {
  157.             get { return _BasePnt; }
  158.             set { _BasePnt = value; }
  159.         }
  160.         public string PrmpStr
  161.         {
  162.             get { return _PrmpStr; }
  163.             set { _PrmpStr = value; }
  164.         }
  165.         public string KeyString
  166.         {
  167.             get { return _KeyString; }
  168.             set { _KeyString = value; }
  169.         }
  170.         public int CursorType
  171.         {
  172.             get { return _CursorType; }
  173.             set { _CursorType = value; }
  174.         }
  175.         public int ControlFlag
  176.         {
  177.             get { return _ControlFlag; }
  178.             set { _ControlFlag = value; }
  179.         }

  180.         public List<Entity> Entities { get => _entities; set => _entities = value; }
  181.         public ResultBuffer Lsprtn { get => _lsprtn; set => _lsprtn = value; }
  182.         public Matrix3d Mat { get => _mat; set => _mat = value; }
  183.         public bool Userbasept { get => _UseBasePt; set => _UseBasePt = value; }
  184.         public bool Usepushmat { get => _UsePushMat; set => _UsePushMat = value; }
  185.         public string RtnKeyString { get => _RtnKeyString; set => _RtnKeyString = value; }
  186.         public Point3d Movefrom { get => _movefrom; set => _movefrom = value; }
  187.         public DelChangeEntity Changentity
  188.         {
  189.             get { return _changentity; }
  190.             set { _changentity = value; }
  191.         }
  192.         public DelSetMat AcquireMat
  193.         {
  194.             get { return _acquireMat; }
  195.             set { _acquireMat = value; }
  196.         }

  197.         #endregion 属性

  198.         #region 方法

  199.         public DelDrawJig()
  200.         {
  201.         }
  202.         public DelDrawJig(DelChangeEntity delChangeEntity, DelSetMat acquireMat)
  203.         {
  204.             _changentity = delChangeEntity;//委托方法1   
  205.             _acquireMat = acquireMat;//委托方法2
  206.         }
  207.         public DelDrawJig(ResultBuffer rb)
  208.         {
  209.             using (rb)
  210.             {
  211.                 if (rb == null)
  212.                     return;
  213.                 //初始化数值
  214.                 TypedValue[] tb = rb.AsArray();
  215.                 _Callback = (string)tb[0].Value;//回调函数            
  216.                 _PrmpStr = (string)tb[1].Value;//提示符
  217.                 _KeyString = (string)tb[2].Value;//关键字
  218.                 _ControlFlag = Convert.ToInt32(tb[3].Value);//光标控制
  219.                 _CursorType = Convert.ToInt32(tb[4].Value);//光标
  220.                 _BasePnt = (Point3d)tb[5].Value; //基点
  221.                                                  //_ob = rb;
  222.             }
  223.         }

  224.         public void DyndrawRedefine(ResultBuffer rb)
  225.         {
  226.             using (rb)
  227.             {
  228.                 if (rb == null)
  229.                     return;
  230.                 //初始化数值
  231.                 TypedValue[] tb = rb.AsArray();
  232.                 _Callback = (string)tb[0].Value;//回调函数            
  233.                 _PrmpStr = (string)tb[1].Value;//提示符
  234.                 _KeyString = (string)tb[2].Value;//关键字
  235.                 _ControlFlag = Convert.ToInt32(tb[3].Value);//光标控制
  236.                 _CursorType = Convert.ToInt32(tb[4].Value);//光标
  237.                 _BasePnt = (Point3d)tb[5].Value; //基点   
  238.             }
  239.         }

  240.         public void AddEntity(Entity ent)
  241.         {

  242.             Entities.Add(ent);
  243.         }
  244.         public void AddEntity(ObjectId[] ids)
  245.         {
  246.             OpenCloseTransaction trans = db.TransactionManager.StartOpenCloseTransaction();
  247.             using (trans)
  248.             {
  249.                 foreach (ObjectId id in ids)
  250.                 {
  251.                     Entity ent = trans.GetObject(id, OpenMode.ForRead) as Entity;
  252.                     AddEntity(ent);
  253.                 }
  254.                 trans.Commit();
  255.             }
  256.         }
  257.         public void AddEntity(SelectionSet ss)
  258.         {
  259.             ObjectId[] ids = ss.GetObjectIds();
  260.             AddEntity(ids);
  261.         }

  262.         public void TransFormEntities()
  263.         {
  264.             OpenCloseTransaction trans = db.TransactionManager.StartOpenCloseTransaction();
  265.             using (trans)
  266.             {
  267.                 foreach (Entity ent in Entities)
  268.                 {
  269.                     trans.GetObject(ent.ObjectId, OpenMode.ForWrite, false);// as Entity;
  270.                     ent.TransformBy(_mat);
  271.                     trans.Commit();
  272.                 }
  273.             }
  274.         }
  275.         #endregion 方法


  276.         protected override SamplerStatus Sampler(JigPrompts prompts)
  277.         {

  278.             JigPromptPointOptions prOptions1 = new JigPromptPointOptions(_PrmpStr);
  279.             prOptions1.PpoFromString(_KeyString);
  280.             prOptions1.UserInputControls = (UserInputControls)_ControlFlag;
  281.             prOptions1.BasePoint = _BasePnt;
  282.             prOptions1.UseBasePoint = _UseBasePt;
  283.             prOptions1.Cursor = (CursorType)_CursorType;
  284.             PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
  285.             _movefrom = _moveto;
  286.             //_BasePnt = _moveto;
  287.             if (prResult1.Status == PromptStatus.Keyword)
  288.             {
  289.                 _RtnKeyString = prResult1.StringResult;
  290.                 return SamplerStatus.OK;
  291.             }
  292.             if (prResult1.Status != PromptStatus.OK)
  293.                 return SamplerStatus.Cancel;

  294.             if (prResult1.Value.Equals(_moveto))
  295.             {
  296.                 return SamplerStatus.NoChange;
  297.             }
  298.             else
  299.             {

  300.                 _moveto = prResult1.Value;//;.TransformBy(ed.CurrentUserCoordinateSystem);
  301.                 return SamplerStatus.OK;
  302.             }
  303.         }

  304.         protected override bool WorldDraw(WorldDraw draw)
  305.         {
  306.             WorldGeometry geo = draw.Geometry;
  307.             if (geo != null)
  308.             {
  309.                 try
  310.                 {
  311.                     if (_UsePushMat == true)
  312.                     {
  313.                         _mat = _acquireMat(_BasePnt, _moveto, 30.0);//委托2
  314.                         geo.PushModelTransform(_mat);
  315.                         foreach (Entity ent in _entities)
  316.                         {
  317.                             if (_changentity != null)
  318.                                 _changentity(ent, _movefrom, _moveto);//委托1
  319.                             ent.RecordGraphicsModified(true);
  320.                             geo.Draw(ent);


  321.                         }
  322.                         geo.PopModelTransform();
  323.                     }
  324.                     else
  325.                     {
  326.                         //_mat = _acquireMat(_BasePnt, _moveto, 30.0);//委托2
  327.                         //geo.PushModelTransform(_mat);
  328.                         foreach (Entity ent in _entities)
  329.                         {
  330.                             if (_changentity != null)
  331.                                 _changentity(ent, _movefrom, _moveto);//委托1
  332.                             ent.RecordGraphicsModified(true);
  333.                             geo.Draw(ent);


  334.                         }
  335.                         //geo.PopModelTransform();
  336.                     }
  337.                 }
  338.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  339.                 {
  340.                     ed.WriteMessage(ex.ToString());
  341.                 }
  342.             }// if geo
  343.             return false;
  344.         }// end of override bool WorldDraw
  345.         #region IDisposable Support
  346.         private bool disposedValue = false; // 要检测冗余调用

  347.         protected virtual void Dispose(bool disposing)
  348.         {
  349.             if (!disposedValue)
  350.             {
  351.                 if (disposing)
  352.                 {
  353.                     //foreach (FieldInfo info in typeof(DynDraw).GetFields())
  354.                     //{
  355.                     //    Doc.Editor.WriteMessage("\n正在显示:" + info.ToString());

  356.                     //}
  357.                     Entities = null;
  358.                     //_RbInvoke.Dispose();
  359.                     Lsprtn = null;
  360.                     _KeyString = null;
  361.                     doc = null;
  362.                     db = null;

  363.                     //_Drawent = null;

  364.                     // TODO: 释放托管状态(托管对象)。
  365.                 }

  366.                 // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
  367.                 // TODO: 将大型字段设置为 null。

  368.                 disposedValue = true;
  369.             }
  370.         }

  371.         // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
  372.         // ~DynDraw() {
  373.         //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  374.         //   Dispose(false);
  375.         // }

  376.         // 添加此代码以正确实现可处置模式。
  377.         public void Dispose()
  378.         {
  379.             // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
  380.             Dispose(true);
  381.             // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
  382.             // GC.SuppressFinalize(this);
  383.         }
  384.         #endregion
  385.     }
  386. }

发表于 2020-10-19 08:45:23 | 显示全部楼层
学习一下各位的思路
发表于 2020-10-26 23:03:46 | 显示全部楼层
看了很多代码,还是没有搞懂,楼主的代码需要再花很多时间消化。关于.net一直没有找到很完整的学习手册。才鸟的书,关于jig的内容也只是蜻蜓点水。
比如:RecordGraphicsModified 这是干嘛的??
半路出家,一头雾水。
发表于 2021-3-31 09:27:37 | 显示全部楼层
本帖最后由 666SHUN 于 2021-3-31 09:29 编辑

楼主你好,这个通用JIG怎样调用呢?比如我自己写的程序,插入一个块,就像实现和CAD一样,可以动态看到块,现在没用JIG,啥也看不到,只有插入后才看见。看到你using ZgxCommomLib;这个,这是自己的库嘛
发表于 2023-2-10 11:21:39 | 显示全部楼层
666SHUN 发表于 2021-3-31 09:27
楼主你好,这个通用JIG怎样调用呢?比如我自己写的程序,插入一个块,就像实现和CAD一样,可以动态看到块, ...

可以尝试使用ifox
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:03 , Processed in 0.182661 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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