namespace ifoxgse.Commands;
public class DemoCommand
{
/// <summary>
/// jig- 三点绘制矩形
/// </summary>
[CommandMethod(nameof(ThreepointRectangle))]
public void ThreepointRectangle()
{
//第一个点的选择
var r1 = Env.Editor.GetPoint("\n选择第1个点");
if (r1.Status != PromptStatus.OK)
{
return;
}
var pt1 = r1.Value.Ucs2Wcs().Z20();
//先默认绘制一条线(起始点=结束点)
var line1 = new Line(pt1, pt1);
line1.SetDatabaseDefaults();
//实时获取鼠标移动后的点 并实时赋给线条结束点
using var j2 = new JigEx((mpw, _) =>
{
line1.EndPoint = mpw.Z20();
});
//实时绘制到画布上
j2.DatabaseEntityDraw(draw => draw.Geometry.Draw(line1));
//设置基点为第一个坐标点,隐藏虚线 并设置提示绘制第二个点的提示信息
j2.SetOptions(pt1,CursorType.Crosshair, msg: "\n第2个点");
//鼠标确认后,第一条直线绘制完毕
var r2 = Env.Editor.Drag(j2);
if (r2.Status != PromptStatus.OK)
{
return;
}
var pt2 = line1.EndPoint.Point2d();
//最终的矩形
var pl = new Polyline();
pl.SetDatabaseDefaults();
//起始点就是刚开始绘制的直线的起始点
pl.AddVertexAt(0,pt1.Point2d(),0,0,0);
//矩形第二点就是刚才直线的末尾点
pl.AddVertexAt(1,pt2,0,0,0);
//第三点在实时绘制之前和第二点重合
pl.AddVertexAt(2,pt2,0,0,0);
//第四点在实时绘制之前和第一点重合
pl.AddVertexAt(3,pt1.Point2d(),0,0,0);
pl.Closed = true;
var jigPromptPointOptions = new JigPromptPointOptions();
using var j3 = new JigEx((mpw, _) =>
{
//通过投影曲线找到鼠标移动后的点,通过鼠标移动后的点向量平移矩形的第三点
//第四个点就是通过平移后的向量平移到第一个点
var closestPointTo = line1.GetClosestPointTo(mpw.Z20(), true);
//鼠标移动后的向量
var v1 = closestPointTo.GetVectorTo(mpw.Z20())
.Convert2d();
pl.SetPointAt(2,pt2+v1);
pl.SetPointAt(3,pt1.Point2d()+v1);
jigPromptPointOptions.BasePoint = closestPointTo;
});
j3.DatabaseEntityDraw(draw => draw.Geometry.Draw(pl));
jigPromptPointOptions = j3.SetOptions(pt2.Point3d(), msg: "\n选择第3个点");
var r3 = Env.Editor.Drag(j3);
if (r3.Status != PromptStatus.OK)
{
return;
}
using var tr = new DBTrans();
tr.CurrentSpace.AddEntity(pl);
}
}
效果:
注意在绘制第二个点的时候可以实时拖拉