乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 57|回复: 3

Jig学习---通用Jig

[复制链接]

23

主题

85

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
176
发表于 2020-10-18 23:55:00 | 显示全部楼层 |阅读模式
  1. using Autodesk..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 _entities = new List();
  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 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. }

回复

使用道具 举报

7

主题

46

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
73
发表于 2020-10-19 08:45:00 | 显示全部楼层
学习一下各位的思路
回复

使用道具 举报

52

主题

380

帖子

11

银币

中流砥柱

Rank: 25

铜币
588
发表于 2020-10-26 23:03:00 | 显示全部楼层
看了很多代码,还是没有搞懂,楼主的代码需要再花很多时间消化。关于.net一直没有找到很完整的学习手册。才鸟的书,关于jig的内容也只是蜻蜓点水。
比如:RecordGraphicsModified 这是干嘛的??
半路出家,一头雾水。
回复

使用道具 举报

1

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 2021-3-31 09:27:00 | 显示全部楼层

楼主你好,这个通用JIG怎样调用呢?比如我自己写的程序,插入一个块,就像实现和CAD一样,可以动态看到块,现在没用JIG,啥也看不到,只有插入后才看见。看到你using ZgxCommomLib;这个,这是自己的库嘛
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 00:45 , Processed in 0.148914 second(s), 60 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表