一键打断线(根据相交点打断)——CAD c# 二次开发

多条相交线根据交点一键打断,如下图:

部分代码如下:

finally

cs 复制代码
namespace IFoxDemo;
public class Class1
{
    [CommandMethod("ddx")]
    public static void Demo()
    {
       //"ifox可以了".Print();
        Database db = HostApplicationServices.WorkingDatabase;
        Editor ed = Env.Editor;
        try
        {

            if (!db.GetEntities(out List<Curve> curve, "请选择需要打断的线:")) return;
           // List<Curve> lines = new List<Curve>();
            List<Curve> lines1 = new List<Curve>();
            foreach (var item in curve)//多段线炸开成线段
            {
                if (item is Polyline pl)
                {
                    List<Curve> cus = ed.ExplodePolyLine(pl);
                    foreach (var cu in cus)
                    {
                        if (cu is Curve) lines1.Add(cu as Curve);
                    }
                }
                else if (item is Curve)
                {
                    if (item is Ellipse) return;
                    lines1.Add(item as Curve);
                }
            }
            //lines1.ForEach(line => line.ColorIndex = 1);
            //foreach (var item in lines1)
            //{
            //    db.AddEntityToModeSpace(item);
            //}

            return;
            Dictionary<Curve, List<Point3d>> pointsOnLine = new Dictionary<Curve, List<Point3d>>();
            foreach (var item in lines1)//创建线和对应点组成的字典
            {
                pointsOnLine.Add(item, new List<Point3d>());
            }
            for (int i = 0; i < lines1.Count -1; i++)
            {
                for (int j = i + 1; j < lines1.Count; j++)
                {
                    Point3dCollection pos = new Point3dCollection();//创建点集合
                    lines1[i].IntersectWith(lines1[j], Intersect.OnBothOperands, pos, IntPtr.Zero, IntPtr.Zero);
                    if (pos.Count > 0)
                    {
                        foreach (Point3d item in pos)
                        {
                            pointsOnLine[lines1[i]].Add(item);
                            pointsOnLine[lines1[j]].Add(item);//获取线段交点的坐标存入字典
                        }
                    }
                }
            }
            lines1.Clear();
            foreach (var item in pointsOnLine)//清理线
            {
                Curve line = item.Key;
                List<Point3d> points = item.Value;
                if (points.Count == 0)
                {
                    lines1.Add(line);
                }
                else
                {
                    if (points.Count > 0)
                    {
                        points = points.OrderBy(x => line.GetParameterAtPoint(x)).ToList();//点排序
                        Point3dCollection pos = new Point3dCollection();
                        points.ForEach(x => pos.Add(x));//点集合加点
                        DBObjectCollection dbs = line.GetSplitCurves(pos);//线上有多个点,按顺序打断线
                        foreach (var dbobject in dbs)
                        {
                            if (dbobject is Curve) lines1.Add(dbobject as Curve);//一个line被他上面的点打成多个line后加入列表
                        }
                    }
                }
            }
            db.AddEntityToModeSpace(lines1.ToArray());

            db.Erase(curve);
        }
        catch (Exception ex)
        {
        }
     

    }
}

插件联系↓↓↓

相关推荐
百***86464 小时前
新版 WSL2 2.0 设置 Windows 和 WSL 镜像网络教程
windows
qq_479875435 小时前
X-Macros(1)
linux·服务器·windows
王 富贵7 小时前
Conda常用命令大全
windows·conda
weixin_457760007 小时前
Python 数据结构
数据结构·windows·python
Eiceblue7 小时前
通过 C# 将 HTML 转换为 RTF 富文本格式
开发语言·c#·html
IUGEI7 小时前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#
q***13617 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
czhc114007566310 小时前
C# 1124 接收
开发语言·c#
只想安静的写会代码10 小时前
网卡信息查询、配置、常见故障排查
linux·服务器·windows
时光追逐者11 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 62 期(2025年11.17-11.23)
c#·.net·.netcore