二维异形排版、二维装箱(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} 个零件");
        }
相关推荐
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹1 天前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
霍霍的袁1 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
孙启超1 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust