二维异形排版、二维装箱(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} 个零件");
        }
相关推荐
1024奇点5 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch6 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL6 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing037 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
吃一碗粉只付一碗钱7 小时前
16-SqlSugar多库ConfigId与按实体选连接
sqlserver·c#
幸运小猿7 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
by209997 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河7 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮8 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻8 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件