明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1110|回复: 3

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

[复制链接]
发表于 2024-8-30 12:12:52 | 显示全部楼层 |阅读模式
本帖最后由 wang2006zhi 于 2025-2-14 12:16 编辑
  1. public void Tt21()
  2. {
  3.     using var tr = new DBTrans();
  4.     if (!Env.Editor.SelEnt(out Polyline plSel, out Point3d ptSel))
  5.         return;
  6.     var plTemp = plSel.CloneEx();
  7.     plTemp.ColorIndex = 1;

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

  14.     void MovePolyline(Polyline pl, Point3d ptTemp)
  15.     {
  16.         var ptStar = plSel.GetClosestPointTo(ptSel, false);
  17.         var parmStar = plSel.GetParameterAtPoint(ptStar);
  18.         var parmS = Math.Floor(parmStar);
  19.         var parmE = Math.Ceiling(parmStar);
  20.         var indexS = Convert.ToInt32(parmS);
  21.         var indexE = Convert.ToInt32(parmE);
  22.         var part = parmStar - parmS;
  23.         
  24.         var ptS = plSel.GetPointAtParameter(parmS);
  25.         var ptE = plSel.GetPointAtParameter(parmE);
  26.         
  27.         var vecN = (ptE - ptS).GetNormal();
  28.         var vec = ptTemp - ptStar;
  29.         if (vec.Length<50)
  30.             return;
  31.         if (parmS.Equals(pl.StartParam))
  32.         {
  33.             pl.SetPointAt(indexS,(ptS + vec.DotProduct(vecN) * vecN).Point2d());
  34.         }
  35.         else if (parmE.Equals(pl.EndParam))
  36.         {
  37.             pl.SetPointAt(indexE,(ptE + vec.DotProduct(vecN) * vecN).Point2d());
  38.         }
  39.         else
  40.         {
  41.             if (part < 0.3)
  42.             {
  43.                 var vecN1 = (ptE - ptS).GetNormal();
  44.                 for (var i = 0; i <= parmS; i++)
  45.                 {
  46.                     var item = Convert.ToInt32(i);
  47.                     var ptTem = plSel.GetPointAtParameter(item);
  48.                     pl.SetPointAt(item, (ptTem + vec.DotProduct(vecN) * vecN1).Point2d());
  49.                 }
  50.             }
  51.             else if (part > 0.7)
  52.             {
  53.                 var vecN1 = (ptE - ptS).GetNormal();
  54.                 for (var i = parmE; i < pl.NumberOfVertices; i++)
  55.                 {
  56.                     var item = Convert.ToInt32(i);
  57.                     var ptTem = plSel.GetPointAtParameter(item);
  58.                     pl.SetPointAt(item,(ptTem + vec.DotProduct(vecN) * vecN1).Point2d());
  59.                 }
  60.             }
  61.             else
  62.             {
  63.                 var pt00 = plSel.GetPointAtParameter(parmS - 1);
  64.                 var pt11 = plSel.GetPointAtParameter(parmE + 1);
  65.                 var vecN1 = (pt00 - ptS).GetNormal();
  66.                 var vecN2 = (pt11 - ptE).GetNormal();
  67.                 pl.SetPointAt(indexS, (ptS + vec.DotProduct(vecN1) * vecN1).Point2d());
  68.                 pl.SetPointAt(indexE, (ptE + vec.DotProduct(vecN2) * vecN2).Point2d());
  69.                 // pl.Move(pl.StartPoint-ptTemp);
  70. }
  71.         }
  72.     }
  73. }

本帖子中包含更多资源

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

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, 2025-2-22 02:22 , Processed in 0.182681 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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