themethodman 发表于 2020-11-23 19:20:46

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

对于多段的单折线实体,我希望在每个交叉点创建一个间隙。理想情况下,需要能够指定间隙距离。
简单示例:


更复杂的示例:


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

      
      public static void SelfIntersectPline()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            PromptEntityOptions peo = new PromptEntityOptions(
                "\nSelect Curve: ");
            peo.SetRejectMessage("\nMust be a Curve...");
            PromptEntityResult per = ed.GetEntity(peo);
            if (per.Status != PromptStatus.OK) return;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord ms = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                //get curve and explode into entities, store curves in entities dbobjectcollection
                Curve curve = per.ObjectId.GetObject(OpenMode.ForRead) as Curve;
                DBObjectCollection origDBObjects = new DBObjectCollection();
                curve.Explode(origDBObjects);
                //erase original curve
                var originalCurve = (Entity)tr.GetObject(curve.ObjectId, OpenMode.ForWrite);
                originalCurve.Erase();
                //create temp dbcollection for circle entities
                DBObjectCollection circleDBObjects = new DBObjectCollection();
                //convert exploded curve entities to polylines
                for (int i = origDBObjects.Count - 1; i >= 0; i--)
                {
                  Curve curveObj = origDBObjects as Curve;
                  origDBObjects.Add(ConvertToPolyline(curveObj));
                  origDBObjects.RemoveAt(i);
                }
                //iterate through each polyline within entities collection
                for (int i = 0; i < origDBObjects.Count; ++i)
                {
                  for (int j = i + 1; j < origDBObjects.Count; ++j)
                  {
                        Polyline pl1 = origDBObjects as Polyline;
                        Polyline pl2 = origDBObjects as Polyline;
                        Point3dCollection points = new Point3dCollection();
                        //test for intersection(s)
                        pl1.IntersectWith(pl2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
                        //validation for intersections
                        foreach (Point3d point in points)
                        {
                            // Skip the start/end points since they are connected vertices
                            if (point == pl1.StartPoint ||
                              point == pl1.EndPoint)
                            {
                              if (point == pl2.StartPoint ||
                                    point == pl2.EndPoint)
                              {
                                    // If two consecutive segments, then skip
                                    if (j == i + 1)
                                    {
                                        continue;
                                    }
                              }
                            }
                            //if genuine intersection detected, create temporary circle of specified radius at intersection
                            foreach (Point3d pt3d in points)
                            {
                              Circle c = new Circle();
                              c.Center = pt3d;
                              c.Radius = 0.5;
                              circleDBObjects.Add(c);
                            }
                        }
                  }
                }
**** Hidden Message *****

nobody 发表于 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

themethodman 发表于 2020-11-24 18:05:07

像这样?https://www.theswamp.org/index.php?topic = 43599 . msg 488882 # msg 488882

themethodman 发表于 2020-11-25 00:08:26

相像的希望它能够处理自相交多段线
从我最初的帖子开始,我已经取得了一些进展,如果一切顺利的话,以后可能会有一些代码。

themethodman 发表于 2020-11-25 04:03:00

都整理好了。
最大的障碍是,在将intercept point3dcollection插入GetSplitCurves之前,应该按照距起点的距离顺序对其进行排序。
页: [1]
查看完整版本: 实现与trim类似的功能时出现问题