CAD(C#)——浅谈JIG之EntityJig&DrawJig
在CAD的二次开发中,有时会使用JIG技术来实现操作的动态性、交互,最常见的比如说是在CAD中定制自己的移动和复制,当然要保持CAD中原有的动态显示效果。
在JIG中我们可以继承EntityJig和DrawJig,对于这两个类,那这两个类有什么区别呢?他们的使用场合又有什么区别呢?
其实,他们之间在操作一些简单的实体的时候是没有多大区别的,硬要说区别的话,那就是在实现一个相同功能时DrawJig比EntityJig的代码简单一些。(注意:是指在操作简单的实体的时候,比如实体的数量就一个)。
EntityJig:一般用于图元实体的拖动,要求先生成实体Entity
protected override bool Update()
{
throw new NotImplementedException();
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
throw new NotImplementedException();
}
DrawJig:一般用于复杂图形的拖动
protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
{
throw new NotImplementedException();
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
throw new NotImplementedException();
}
在拖动一个实体的时候,不管是用EntityJig还是DrawJig效果都一样,但是当我们在处理多个实体的移动,我们要求鼠标可以实时动态显示要拖动的多个实体,这点,EntityJig却无法实现了,但如果是DrawJig却很容易实现。(下图是用DrawJig实现)
而且对于动态生成实体(比如指定一个圆心,动态生成一个圆),用DrawJig中的WorlDraw可以灵活控制实现生成。
相比之下,是不是发现DrawJig优胜于EntityJig(个人理解).
下面贴出上图实现的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 public class DrawJigEnt : DrawJig
3 {
4 //变量
5 Point3d oldPt;//实体移动之前的位置
6 Point3d newPt;//实体移动之后的位置
7 Vector3d v;//实体移动的向量
8
9 List<Entity> ents = new List<Entity>();
10 List<Point3d> oldPts = new List<Point3d>();
11 public DrawJigEnt(List<Entity> ents)
12 {
13 oldPt = Point3d.Origin;
14 newPt = Point3d.Origin;
15 v = new Vector3d();
16 this.ents = ents;
17
18 Autodesk.AutoCAD.DatabaseServices.Entity ent = ents[0];
19 if (ent is BlockReference)
20 {
21 BlockReference br = ent as BlockReference;
22 oldPt = br.Position;
23 }
24
25 for (int i = 1; i < ents.Count; i++)
26 {
27 if (ents[i] is BlockReference)
28 {
29 BlockReference br = ents[i] as BlockReference;
30 oldPts.Add(br.Position);
31 }
32 }
33 }
34
35 //更新
36 protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
37 {
38 Entity ent = ents[0];
39 ent.UpgradeOpen();
40 if (ent is BlockReference)
41 {
42 BlockReference br = ent as BlockReference;
43 br.Position = newPt;
44 draw.Geometry.Draw(br);
45 }
46
47 v = newPt.GetVectorTo(oldPt);
48
49 for(int i =1;i<ents.Count;i++)
50 {
51 Entity entity = ents[i];
52 entity.UpgradeOpen();
53 if (entity is BlockReference)
54 {
55 BlockReference br = entity as BlockReference;
56 br.Position = oldPts[i - 1] + v;
57 draw.Geometry.Draw(entity);
58 }
59 }
60
61 return true;
62 }
63 //取样函数
64 protected override SamplerStatus Sampler(JigPrompts prompts)
65 {
66 JigPromptOptions opt = new JigPromptOptions();
67 opt.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.NoNegativeResponseAccepted | UserInputControls.NullResponseAccepted;
68 opt.UseBasePoint = true;
69 opt.Cursor = CursorType.RubberBand;
70 opt.BasePoint = oldPt;
71 opt.Message = "选择移动到的终点";
72
73 PromptPointResult res = prompts.AcquirePoint(opt);
74 if (PromptStatus.OK == res.Status)
75 {
76 if (res.Value == newPt)
77 {
78 return SamplerStatus.NoChange;
79 }
80 newPt = res.Value;
81 }
82 else
83 {
84 return SamplerStatus.Cancel;
85 }
86 return SamplerStatus.OK;
87 }
88 }
89 #endregion