二维异形排版、二维装箱(NPF碰撞检测)——CAD c#二次开发

二维异形排版效果如下:

CAD二维异形排版,支持凹多边形,采用NFP算法,部分代码如下:

cs 复制代码
  public void 异形排版()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            Editor ed = doc.Editor;
            num = 0;
            // 选择母材和待排版零件
            var basepl = db.SelectEntity<Polyline>("请选择母材:");
            if (basepl == null) return; 
            var partsPLs = db.SelectEntities<Polyline>("请选择待排版零件:");
            if (partsPLs == null || partsPLs.Count == 0) return; 
            var partsPLsorted = partsPLs.OrderByDescending(p => p.Area).ToList();
            var placedParts = new List<Polyline>();  
            var baseM = basepl.Path64_World();  
            var basesm = new Paths64 { baseM };
            // 1. 处理第一个零件 
            var firstPartPL = partsPLsorted[0];
            var firstPartPath64 = firstPartPL.Path64_World();
            var PlaceablePaths = baseM.Nfp内部Paths64(firstPartPath64);

            if (PlaceablePaths == null || PlaceablePaths.Count == 0)
            {
                ed.WriteMessage("\n第一个零件无可用摆放区域");
                return;
            }

            // 摆放第一个零件
            var firstPlacedPL = PlaceSinglePart(firstPartPL, PlaceablePaths, 1);
            placedParts.Add(firstPlacedPL);

            // 2. 处理第二个零件 
            if (partsPLsorted.Count >= 2)
            {
                var secondPartPL = partsPLsorted[1];
                var part2内部 = basepl.Nfp内部(secondPartPL); 
                var part2外部 = firstPlacedPL.Nfp外部(secondPartPL); 
                if (part2内部 == null || part2外部 == null)
                {
                    ed.WriteMessage("\n第二个零件无可用摆放区域");
                }
                else
                { 
                    var part2可摆放 = Clipper.Difference(
                        part2内部.Path64s_World(),
                        part2外部.Path64s_World(),
                        FillRule.NonZero
                    );

                    var templ = part2可摆放.ToPolylines();
                
                    if (part2可摆放 != null && part2可摆放.Count > 0)
                    {
                        var secondPlacedPL = PlaceSinglePart(secondPartPL, part2可摆放, 2);
                        placedParts.Add(secondPlacedPL);
                    }
                    else
                    {
                        ed.WriteMessage("\n第二个零件无可用摆放区域");
                    }
                }
            }

            // 3. 处理第三个及后续零件 
           

            ed.WriteMessage($"\n排版完成!共摆放 {placedParts.Count} 个零件");
        }
相关推荐
神明不懂浪漫2 小时前
【第七章】Java中的常用类
java·开发语言·前端·经验分享·笔记
程序喵大人10 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng10 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
shawxlee11 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
kyriewen11 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
wdfk_prog11 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕12 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫12 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通12 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php