乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 90|回复: 4

实现与trim类似的功能时出现问题

[复制链接]

6

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 2020-11-23 19:20:46 | 显示全部楼层 |阅读模式
对于多段的单折线实体,我希望在每个交叉点创建一个间隙。理想情况下,需要能够指定间隙距离。
简单示例:


更复杂的示例:


基本代码大纲:
1 .从编辑器中获取折线实体。将多段线分解成单独的多段线。相互测试每条折线的交点(交点必须是“真实的”,例如,不能在两个连续的线段之间)
4。在每个特定半径的交叉点创建临时圆。对于每条折线,“修剪”圆内的内容*(从这一点开始有困难)*,从而删除交点
6。删除临时圆圈。对于每条现有的折线,如果可能的话,可以将它们连接起来,这样做
我面临的最大问题是在圆的交点处修剪每条折线-我只是不确定如何在代码中实现这一点
最终我希望能够将圆弧合并到折线中。
到目前为止我的代码(到第4点为止):

  1.         [CommandMethod("SelfIntersectPline")]
  2.         public static void SelfIntersectPline()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptEntityOptions peo = new PromptEntityOptions(
  8.                 "\nSelect Curve: ");
  9.             peo.SetRejectMessage("\nMust be a Curve...");
  10.             PromptEntityResult per = ed.GetEntity(peo);
  11.             if (per.Status != PromptStatus.OK) return;
  12.             using (Transaction tr = db.TransactionManager.StartTransaction())
  13.             {
  14.                 BlockTableRecord ms = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  15.                 //get curve and explode into entities, store curves in entities dbobjectcollection
  16.                 Curve curve = per.ObjectId.GetObject(OpenMode.ForRead) as Curve;
  17.                 DBObjectCollection origDBObjects = new DBObjectCollection();
  18.                 curve.Explode(origDBObjects);
  19.                 //erase original curve
  20.                 var originalCurve = (Entity)tr.GetObject(curve.ObjectId, OpenMode.ForWrite);
  21.                 originalCurve.Erase();
  22.                 //create temp dbcollection for circle entities
  23.                 DBObjectCollection circleDBObjects = new DBObjectCollection();
  24.                 //convert exploded curve entities to polylines
  25.                 for (int i = origDBObjects.Count - 1; i >= 0; i--)
  26.                 {
  27.                     Curve curveObj = origDBObjects[i] as Curve;
  28.                     origDBObjects.Add(ConvertToPolyline(curveObj));
  29.                     origDBObjects.RemoveAt(i);
  30.                 }
  31.                 //iterate through each polyline within entities collection
  32.                 for (int i = 0; i < origDBObjects.Count; ++i)
  33.                 {
  34.                     for (int j = i + 1; j < origDBObjects.Count; ++j)
  35.                     {
  36.                         Polyline pl1 = origDBObjects[i] as Polyline;
  37.                         Polyline pl2 = origDBObjects[j] as Polyline;
  38.                         Point3dCollection points = new Point3dCollection();
  39.                         //test for intersection(s)
  40.                         pl1.IntersectWith(pl2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
  41.                         //validation for intersections
  42.                         foreach (Point3d point in points)
  43.                         {
  44.                             // Skip the start/end points since they are connected vertices
  45.                             if (point == pl1.StartPoint ||
  46.                                 point == pl1.EndPoint)
  47.                             {
  48.                                 if (point == pl2.StartPoint ||
  49.                                     point == pl2.EndPoint)
  50.                                 {
  51.                                     // If two consecutive segments, then skip
  52.                                     if (j == i + 1)
  53.                                     {
  54.                                         continue;
  55.                                     }
  56.                                 }
  57.                             }
  58.                             //if genuine intersection detected, create temporary circle of specified radius at intersection
  59.                             foreach (Point3d pt3d in points)
  60.                             {
  61.                                 Circle c = new Circle();
  62.                                 c.Center = pt3d;
  63.                                 c.Radius = 0.5;
  64.                                 circleDBObjects.Add(c);
  65.                             }
  66.                         }
  67.                     }
  68.                 }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

129

主题

422

帖子

5

银币

中流砥柱

Rank: 25

铜币
936
发表于 2020-11-24 12:58:12 | 显示全部楼层
也许更直接的方法是使用GETSPLITCURVES使用交叉点来分割它们,然后减少分割曲线末端的长度。
分割曲线示例
https://forums.autodesk.com/t5/net/trim-function/td-p/7770714
更改长度(几乎是本示例中的最后一行)
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html?url=WS1a9193826455f5ff2566ffd511ff6f8c7ca-3e52.htm,topicNumber=d0e25580
回复

使用道具 举报

6

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 2020-11-24 18:05:07 | 显示全部楼层
像这样?https://www.theswamp.org/index.php?topic = 43599 . msg 488882 # msg 488882
回复

使用道具 举报

6

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 2020-11-25 00:08:26 | 显示全部楼层
相像的希望它能够处理自相交多段线
从我最初的帖子开始,我已经取得了一些进展,如果一切顺利的话,以后可能会有一些代码。
回复

使用道具 举报

6

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
38
发表于 2020-11-25 04:03:00 | 显示全部楼层
都整理好了。
最大的障碍是,在将intercept point3dcollection插入GetSplitCurves之前,应该按照距起点的距离顺序对其进行排序。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 00:52 , Processed in 0.141899 second(s), 62 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表