明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 624|回复: 3

[【IFoxCAD】] 仿写拉伊随心PL线功能-JIG应用

[复制链接]
发表于 2024-8-30 12:12:52 | 显示全部楼层 |阅读模式
本帖最后由 wang2006zhi 于 2024-8-30 12:14 编辑

public void Tt21()
{
    using var tr = new DBTrans();
    if (!Env.Editor.SelEnt(out Polyline plSel, out Point3d ptSel))
        return;
    var plTemp = plSel.CloneEx();
    plTemp.ColorIndex = 1;

    using var jig = new JigEx((mpt, _) => {MovePolyline(plTemp, mpt); });
    jig.DatabaseEntityDraw(wd => wd.RawGeometry.Draw(plTemp));
    var jppo = jig.SetOptions("指定放入点:");
    var r1 = jig.Drag();
    if (r1.Status != PromptStatus.OK)
        return;

    void MovePolyline(Polyline pl, Point3d ptTemp)
    {
        var ptStar = plSel.GetClosestPointTo(ptSel, false);
        var parmStar = plSel.GetParameterAtPoint(ptStar);
        var parmS = Math.Floor(parmStar);
        var parmE = Math.Ceiling(parmStar);
        var indexS = Convert.ToInt32(parmS);
        var indexE = Convert.ToInt32(parmE);
        var part = parmStar - parmS;
        
        var ptS = plSel.GetPointAtParameter(parmS);
        var ptE = plSel.GetPointAtParameter(parmE);
        
        var vecN = (ptE - ptS).GetNormal();
        var vec = ptTemp - ptStar;
        if (vec.Length<50)
            return;
        if (parmS.Equals(pl.StartParam))
        {
            pl.SetPointAt(indexS,(ptS + vec.DotProduct(vecN) * vecN).Point2d());
        }
        else if (parmE.Equals(pl.EndParam))
        {
            pl.SetPointAt(indexE,(ptE + vec.DotProduct(vecN) * vecN).Point2d());
        }
        else
        {
            if (part < 0.3)
            {
                var vecN1 = (ptE - ptS).GetNormal();
                for (var i = 0; i <= parmS; i++)
                {
                    var item = Convert.ToInt32(i);
                    var ptTem = plSel.GetPointAtParameter(item);
                    pl.SetPointAt(item, (ptTem + vec.DotProduct(vecN) * vecN1).Point2d());
                }
            }
            else if (part > 0.7)
            {
                var vecN1 = (ptE - ptS).GetNormal();
                for (var i = parmE; i < pl.NumberOfVertices; i++)
                {
                    var item = Convert.ToInt32(i);
                    var ptTem = plSel.GetPointAtParameter(item);
                    pl.SetPointAt(item,(ptTem + vec.DotProduct(vecN) * vecN1).Point2d());
                }
            }
            else
            {
                var pt00 = plSel.GetPointAtParameter(parmS - 1);
                var pt11 = plSel.GetPointAtParameter(parmE + 1);
                var vecN1 = (pt00 - ptS).GetNormal();
                var vecN2 = (pt11 - ptE).GetNormal();
                pl.SetPointAt(indexS, (ptS + vec.DotProduct(vecN1) * vecN1).Point2d());
                pl.SetPointAt(indexE, (ptE + vec.DotProduct(vecN2) * vecN2).Point2d());
                // pl.Move(pl.StartPoint-ptTemp);
}
        }
    }
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-8-30 16:54:34 | 显示全部楼层
这种功能pline拉伸夹点不是也能实现吗
发表于 2024-8-30 17:45:06 | 显示全部楼层
怎么左边绿绿的侧边栏那么丑
 楼主| 发表于 2024-8-31 00:07:23 来自手机 | 显示全部楼层
天命 发表于 2024-8-30 16:54
这种功能pline拉伸夹点不是也能实现吗

不一样,有角度约束的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 00:32 , Processed in 0.184948 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表