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

    }
}

插件联系↓↓↓

相关推荐
昏睡红猹34 分钟前
C#脚本化(Roslyn):如何在运行时引入nuget包
c#
张人玉1 小时前
C# 常量与变量
java·算法·c#
就是有点傻2 小时前
在C#中,可以不实例化一个类而直接调用其静态字段
c#
软件黑马王子2 小时前
C#系统学习第八章——字符串
开发语言·学习·c#
阿蒙Amon2 小时前
C#读写文件:多种方式详解
开发语言·数据库·c#
Paper_Love2 小时前
x86-64_windows交叉编译arm_linux程序
arm开发·windows
就是有点傻3 小时前
C#如何实现中英文快速切换
数据库·c#
前端若水3 小时前
通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现
windows·智能手机
一名用户7 小时前
unity实现梦日记式传送组件
后端·c#·unity3d
阿蒙Amon8 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#