CAD二次开发的项目中需要用户选取一个矩形范围然后在这个范围内进行计算,最初是一个点一个点的拾取然后连起来绘制成四边形的。考虑到用户体验,应该完善成用户直接能拉一个矩形框出来。所以这个任务需求就是像CAD界面操作的绘制矩形一样,然后获取四个角点坐标。
(写到这里我突然想到CAD有矩形绘制啊,我做个插件为什么要写一个已有的功能呢。。。。。。陷入深思。。。。。难道是怕客户绘个矩形再去拾取角点嫌麻烦吗????)
事已至此,既然花费了很多时间去查询资料,还是把这个及记录下来吧~~
要实现随着鼠标的移动能显示即将绘制的矩形,即动态绘制。一番搜寻之下终于让我找到了一个关键词:EntityJig。随之,DrawJig浮出水面。
在CAD的二次开发中,有时会使用JIG技术来实现操作的动态性、交互,主要是绘制某些定制实体的时候,有拖动效果,所见即所得,方便控制。
Jig循环总体上分为四步,直译如下:
1)用户拖动鼠标。
2)根据鼠标动作得到几何参数值。
3)根据参数值更新实体数据。
4)用WorldDraw()函数重画实体。
在JIG中我们可以继承EntityJig(单实体绘制)和DrawJig(多实体绘制)
继承EntityJig类,重写Sampler()获取键盘或鼠标输入的参数;重写Update() 在鼠标移动时执行自定义绘制。
继承DrawJig类,重写Sampler()获取键盘或鼠标输入的参数;重写WorldDraw() 在鼠标移动时执行自定义绘制。
EntityJig只能绘制一个实体,而DrawJig能一次绘制多个实体,且DrawJig类的使用比EntityJig更为方便。
代码如下:
public class RectJig : DrawJig
{
public Line line_1;
public Line line_2;
public Line line_3;
public Line line_4;
public Point3d BasePnt;
public Point3d AcquirePnt;
public RectJig(Point3d _basePnt)
{
line_1 = new Line();
line_2 = new Line();
line_3 = new Line();
line_4 = new Line();
BasePnt= _basePnt;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
JigPromptPointOptions JPPO = new JigPromptPointOptions();
JPPO .Message = "输入矩形另一个对角点:";
JPPO .UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted | UserInputControls.AnyBlankTerminatesInput);
PromptPointResult PR = prompts.AcquirePoint(JPPO );
if (PR.Status != PromptStatus.OK)
return SamplerStatus.Cancel;
if (PR.Value == AcquirePnt)
return SamplerStatus.NoChange;
AcquirePnt= PR.Value;
return SamplerStatus.OK;
}
protected override bool WorldDraw(WorldDraw draw)
{
Point3d point_1 = new Point3d(BasePnt.X, BasePnt.Y, 0);
Point3d point_2 = new Point3d(AcquirePnt.X, BasePnt.Y, 0);
line_1.StartPoint = point_1;
line_1.EndPoint = point_2;
point_1 = new Point3d(BasePnt.X, BasePnt.Y, 0);
point_2 = new Point3d(BasePnt.X, AcquirePnt.Y, 0);
line_2.StartPoint = point_1;
line_2.EndPoint = point_2;
point_1 = new Point3d(BasePnt.X, AcquirePnt.Y, 0);
point_2 = new Point3d(AcquirePnt.X, AcquirePnt.Y, 0);
line_3.StartPoint = point_1;
line_3.EndPoint = point_2;
point_1 = new Point3d(AcquirePnt.X, BasePnt.Y, 0);
point_2 = new Point3d(AcquirePnt.X, AcquirePnt.Y, 0);
line_4.StartPoint = point_1;
line_4.EndPoint = point_2;
draw.Geometry.Draw(line_1);
draw.Geometry.Draw(line_2);
draw.Geometry.Draw(line_3);
draw.Geometry.Draw(line_4);
return true;
}
}
public void DrawRect()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
PromptPointResult pPtRes;
PromptPointOptions pPtOpts = new PromptPointOptions("");
pPtOpts.Message = "选取矩形起点: ";
pPtRes = acDoc.Editor.GetPoint(pPtOpts);
Point3d ptStart = pPtRes.Value;
if (pPtRes.Status == PromptStatus.OK)
{
RectJig rectJig = new RectJig(ptStart);
PromptResult PR = acDoc.Editor.Drag(rectJig );
if (PR.Status == PromptStatus.OK)
{
CADDraw.AddEntity(acCurDb, rectJig .line_1);
CADDraw.AddEntity(acCurDb, rectJig .line_2);
CADDraw.AddEntity(acCurDb, rectJig .line_3);
CADDraw.AddEntity(acCurDb, rectJig .line_4);
}
}
}
总的来说,CAD中继承jig类就可以定制自己的实体(包括文字)进行绘制或是移动、缩放等
可参考:
https://blog.csdn.net/hisinwang/article/details/78823671?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242
Jig详细介绍可参考:
https://blog.csdn.net/net_bat/article/details/104672671?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160864246916780288219693%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160864246916780288219693&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-7-104672671.first_rank_v2_pc_rank_v29&utm_term=drawjig