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

    }
}

插件联系↓↓↓

相关推荐
DogDaoDao7 小时前
Windows 开发提效工具全景指南:60+ 工具的工程化分层配置
windows·git·程序员·开发工具·powershell·everything·msys2
leonkay8 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
CSDN_RTKLIB9 小时前
数据库七大符号表
c#
leonkay10 小时前
C# 特性(Attribute)——【2】工业设备参数框架设计
经验分享·面试·架构·c#·学习方法·设计
2501_9065651210 小时前
小创 · 智能助手
开发语言·c#
水饺编程12 小时前
第5章,[Win32 章节] :Polygon 函数和多边形填充模式
c语言·c++·windows·visual studio
百事牛科技12 小时前
文档不想再加密了?Word打开密码移除的两种方法
windows·word
软件资深者14 小时前
千千静听典藏修复版 使用教程:经典本地音乐播放器回归,歌词同步、皮肤皮肤自由换,音乐播放器怀旧新手 5 分钟上手(2026)
windows
captain37615 小时前
文件与IO(2)
java·开发语言·windows·java-ee
星栖与芯16 小时前
# STM32MP157+LiteOS-M GCC极简工程:启动源码适配+Windows Make终极避坑
windows·stm32·单片机