wang2006zhi 发表于 2024-8-30 12:12:52

仿写拉移随心PL线功能-JIG应用

本帖最后由 wang2006zhi 于 2025-2-14 12:16 编辑

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

天命 发表于 2024-8-30 16:54:34

这种功能pline拉伸夹点不是也能实现吗

你有种再说一遍 发表于 2024-8-30 17:45:06

怎么左边绿绿的侧边栏那么丑

wang2006zhi 发表于 2024-8-31 00:07:23

天命 发表于 2024-8-30 16:54
这种功能pline拉伸夹点不是也能实现吗

不一样,有角度约束的。
页: [1]
查看完整版本: 仿写拉移随心PL线功能-JIG应用