二维异形排版、二维装箱(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} 个零件");
        }
相关推荐
灵感__idea3 小时前
Hello 算法:贪心的世界
前端·javascript·算法
小成202303202653 小时前
Linux高级02
linux·开发语言
知行合一。。。4 小时前
Python--04--数据容器(总结)
开发语言·python
咸鱼2.04 小时前
【java入门到放弃】需要背诵
java·开发语言
ZK_H4 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
A.A呐4 小时前
【C++第二十九章】IO流
开发语言·c++
椰猫子4 小时前
Java:异常(exception)
java·开发语言
lifewange4 小时前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest
cmpxr_4 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
2401_827499995 小时前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python