CAD二次开发IFoxCAD框架系列(22)- 利用Jig技术实现三点绘制矩形

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);
    }
}

效果:
在这里插入图片描述
注意在绘制第二个点的时候可以实时拖拉
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术闲聊DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值