二维异形排版、二维装箱(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} 个零件");
        }
相关推荐
SuperEugene1 小时前
后台权限与菜单渲染:基于路由和后端返回的几种实现方式
前端·javascript·vue.js
csdn飘逸飘逸2 小时前
Autojs基础-全局函数与变量(globals)
javascript
KKKK2 小时前
手写Promise,从测试用例的角度理解
javascript
青青家的小灰灰2 小时前
迈向全栈新时代:SSR/SSG 原理、Next.js 架构与 React Server Components (RSC) 实战
前端·javascript·react.js
SuperEugene2 小时前
弹窗与抽屉组件封装:如何做一个全局可控的 Dialog 服务
前端·javascript·vue.js
青青家的小灰灰2 小时前
透视 React 内核:Diff 算法、合成事件与并发特性的深度解析
前端·javascript·react.js
SuperEugene2 小时前
组合式函数 、 Hooks(Vue2 mixin 、 Vue3 composables)的实战封装
前端·javascript·vue.js
wuhen_n2 小时前
模板编译三阶段:parse-transform-generate
前端·javascript·vue.js
滕青山2 小时前
正则表达式测试 在线工具核心JS实现
前端·javascript·vue.js
不可能的是2 小时前
前端图片懒加载方案全解析
前端·javascript