自定义捕捉对象动态Jig绘制,实现实时更具选择对象变化预览图块

1、自定义靶框对象

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 //CAD开发库
 8 using Autodesk.AutoCAD.EditorInput;
 9 using Autodesk.AutoCAD.ApplicationServices;
10 using Autodesk.AutoCAD.Runtime;
11 using Autodesk.AutoCAD.Windows;
12 using Autodesk.AutoCAD.Geometry;
13 using Autodesk.AutoCAD.DatabaseServices;
14 using Autodesk.AutoCAD.GraphicsInterface;
15 
16 //CAD开发基础库
17 using BaseLibrary.Runtime;
18 using BaseLibrary.ResultData;
19 using BaseLibrary.ExtensionMethod;
20 using BaseLibrary.Filter;
21 
22 namespace TSTJig
23 {
24     public class BaseGlyph : Glyph
25     {
26         public override void SetLocation(Point3d point)
27         {
28 
29         }
30 
31         protected override void SubViewportDraw(ViewportDraw vd)
32         {
33 
34         }
35     }
36 }

2、自定义JIg对象

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 //CAD开发库
  7 using Autodesk.AutoCAD.EditorInput;
  8 using Autodesk.AutoCAD.ApplicationServices;
  9 using Autodesk.AutoCAD.Runtime;
 10 using Autodesk.AutoCAD.Windows;
 11 using Autodesk.AutoCAD.Geometry;
 12 using Autodesk.AutoCAD.DatabaseServices;
 13 
 14 //CAD开发基础库
 15 using BaseLibrary.Runtime;
 16 using BaseLibrary.ResultData;
 17 using BaseLibrary.ExtensionMethod;
 18 using BaseLibrary.Filter;
 19 
 20 namespace TSTJig
 21 {
 22     class SnapEntityJig : EntityJig
 23     {
 24         private Point3d m_Position;
 25         private Vector3d m_Direction;   //块方向
 26         private Curve m_Curve = null;
 27 
 28 
 29         public SnapEntityJig(Entity entity) : base(entity)
 30         {
 31             //((Circle)Entity).Center = m_CenterPt;
 32             //((Circle)Entity).Radius = m_Radius;
 33             
 34 
 35             //创建自定义对象捕捉模式
 36             CustomObjectSnapMode mode = new CustomObjectSnapMode("third", "_third", "三分之一", new BaseGlyph());
 37             //捕捉模式的实体类型为曲线
 38             mode.ApplyToEntityType(RXClass.GetClass(typeof(Curve)), CurveSnap);
 39             //开启自定义对象捕捉模式
 40             CustomObjectSnapMode.Activate("_third");
 41         }
 42 
 43         public void CurveSnap(ObjectSnapContext context, ObjectSnapInfo result)
 44         {
 45             m_Curve = (Curve)context.PickedObject;//当前捕捉到的曲线对象
 46             //Point3dCollection snaps = result.SnapPoints;//获取对象的捕捉点集合
 47             //                                            //Curve3dCollection snapCurves = result.SnapCurves;
 48 
 49             //if (curve.Closed) return;//如果为闭合曲线,则返回
 50             //double startParam = curve.StartParam;//曲线的起点参数
 51             //double endParam = curve.EndParam;//曲线的终点参数
 52 
 53 
 54 
 55 
 56             //if (context.LastPoint != null) {
 57             //    ed.Ex_WriteMessage("LastPoint" + context.LastPoint.ToString());
 58             //    string str = context.LastPoint.ToString();
 59             //}
 60             //if (context.PickPoint != null) {
 61             //    ed.Ex_WriteMessage("PickPoint" + context.PickPoint.ToString());
 62             //    string str = context.LastPoint.ToString();
 63             //}
 64             //ed.Ex_WriteMessage(snaps.Count);
 65 
 66 
 67 
 68             //将与曲线起点的距离为1/3曲线长度的点作为捕捉点
 69             //snaps.Add(curve.GetPointAtParameter(startParam + ((endParam - startParam) / 3)));
 70             //将与曲线起点的距离为2/3曲线长度的点作为捕捉点
 71             //snaps.Add(curve.GetPointAtParameter(startParam + ((endParam - startParam) * 2 / 3)));
 72             //ed.Ex_WriteMessage(context.PickPoint.ToString());
 73         }
 74 
 75         public void StopSnap()
 76         {
 77             //关闭自定义对象捕捉模式
 78             CustomObjectSnapMode.Deactivate("_third");
 79         }
 80 
 81         protected override SamplerStatus Sampler(JigPrompts prompts)
 82         {
 83             JigPromptPointOptions optJig = new JigPromptPointOptions();
 84             // 用AcquirePoint函数得到用户输入的点.
 85             PromptPointResult resJigDis = prompts.AcquirePoint(optJig);
 86             Point3d curPt = resJigDis.Value; //获取满足输入选项的输入值
 87 
 88             if (resJigDis.Status == PromptStatus.Cancel)
 89             {
 90                 return SamplerStatus.Cancel;
 91             }
 92 
 93             if (m_Position != curPt)
 94             {
 95                 if (m_Curve != null) {
 96                     if (m_Curve.Ex_IsCurvePoint(m_Position)) {
 97                         m_Direction = m_Curve.Ex_GetPerpendicularVector(m_Position); //获取垂直向量
 98                     }
 99                 }
100                 // 保存当前点.
101                 m_Position = curPt;
102                 return SamplerStatus.OK;
103             }
104             else
105             {
106                 return SamplerStatus.NoChange;
107             }
108         }
109 
110         protected override bool Update()
111         {
112             ((BlockReference)Entity).Position = m_Position;
113             ((BlockReference)Entity).Rotation = m_Direction.AngleOnPlane(new Plane());
114 
115             return true;
116         }
117     }
118 }

3、测试:创建测试图块TST,执行TSTSnapEntityJig

 1   [CommandMethod("TSTSnapEntityJig")]
 2         public void TSTSnapEntityJig() {
 3             Document doc = Application.DocumentManager.MdiActiveDocument;
 4             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
 5             Database db = HostApplicationServices.WorkingDatabase;
 6             DocumentLock Lock = Application.DocumentManager.GetDocument(db).LockDocument(); //非模态模式,修改文件前进行上锁操作
 7                 using (Transaction trans = doc.TransactionManager.StartTransaction())
 8                 {
 9                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
10                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
11                 string blockName = "TST";
12                 if (bt.Has(blockName))
13                     {
14                         //第一个状态,实现
15                         BlockReference br = new BlockReference(Point3d.Origin, bt[blockName]);
16                     SnapEntityJig blockJig = new SnapEntityJig(br);
17                         PromptResult resJig = ed.Drag(blockJig);
18                         if (resJig.Status == PromptStatus.Cancel)
19                         {
20                             blockJig.StopSnap();
21                             return;
22                         }
23                         if (resJig.Status == PromptStatus.OK)
24                         {
25                             blockJig.StopSnap();
26                         }
27                     }
28                     trans.Commit();
29                 }
30             Lock.Dispose();
31         }

 

posted @ 2022-03-03 09:26  百年一梦  阅读(279)  评论(0编辑  收藏  举报