一键打断线(根据相交点打断)——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)
        {
        }
     

    }
}

插件联系↓↓↓

相关推荐
我是苏苏1 小时前
C#高级:程序查询写法性能优化提升策略(附带Gzip算法示例)
开发语言·算法·c#
sali-tec2 小时前
C# 基于halcon的视觉工作流-章56-彩图转云图
人工智能·算法·计算机视觉·c#
张人玉7 小时前
c#串口读写威盟士五插针
开发语言·c#·通讯
睡前要喝豆奶粉8 小时前
在.NET Core Web Api中使用redis
redis·c#·.netcore
科技峰行者8 小时前
微软与OpenAI联合研发“Orion“超大规模AI模型:100万亿参数开启“科学家AI“新纪元
大数据·人工智能·microsoft
晟盾科技8 小时前
报表类系统后端API设计思路
开发语言·windows·php
偶尔的鼠标人9 小时前
SqlSugar查询字符串转成Int的问题
c#·sqlsugar
我不是程序猿儿9 小时前
【C#】WinForms 控件句柄与 UI 刷新时机
开发语言·ui·c#
聪明努力的积极向上12 小时前
【C#】HTTP中URL编码方式解析
开发语言·http·c#
关关长语15 小时前
(四) Dotnet中MCP客户端与服务端交互通知日志信息
ai·c#·mcp