
简介面向激光切割、水切割等制造场景的2D板材排版套料开源项目基于遗传算法求解板材最优排布直击材料利用率低与人工排样效率不高的痛点帮助开发者理解智能优化方法的工程落地。压缩包共88个文件以js源码、svg图形示例、sample样例、css及html页面为主配合字体与配置支撑起完整的SVGnest套料工具整体仅2.53MB目录结构清晰便于按模块检索。已有6224人学习/下载可作为算法研究与二次开发的切入点。借助源码可完整掌握遗传算法的选择、交叉、变异与适应度评估细节学习SVG图形解析与自动化布局生成后续还能针对切割工艺约束或利用率目标定制扩展从容应对不同产线需求。兼具教学与实用价值适合排样算法初学者、工业软件开发者以及需要提升材料利用率的工程技术人员。 我最早接触2D板材排版套料是从车间一台水射流切割机开始的。那时候每次排版都是老师傅拿CAD手动摆一张2米乘1米5的板子少说一个半小时摆完还得手工编号导出切割路径的时候只要挪动其中一个零件后面的标注全部乱套。后来我决定把这件事变成一个自动化流程前后试过商业套料软件也翻过不少GitHub上的开源项目最后发现2D板材排版套料开源代码这条路最适合小团队和程序员。它能把一整天的手工工作压缩到几分钟还能按自己的工艺自由改算法。这篇文章我不讲虚的从算法原理、开源项目选型、实际跑通的代码、以及我在车间踩过的坑四个角度完整拆一遍。1. 先搞清楚套料到底在解决什么问题1.1 一个看似简单实则复杂的排样问题套料问题的本质是二维排样2D Stock Cutting Problem给定一张固定尺寸的板材和一批需要切割的零件要求在不重叠的前提下把所有零件摆进板材内使材料利用率最高。这里有一个常见误区——很多人以为这就是“矩形装箱问题”几个矩形放进一个大矩形里而已。但真正的车间场景远比这个复杂零件可能是任意多边形可能带圆角、有缺口甚至同一板子上要混排不同厚度的刀缝、共边切割的桥接、还要考虑板材纹理方向能不能旋转。从数学性质上说二维排样是一个NP-hard问题。零件一多暴力求解在时间上根本不可行必须靠启发式算法找近似最优解。这也是开源套料代码最值得研究的地方代码的核心不是绘图而是那一套搜索策略和几何碰撞判断。1.2 为什么不用商业套料软件很多工厂用了商业套料软件常见的自动排版模块动辄几十万授权费而且是个黑盒想让它支持异形共边、给特定零件指定割缝补偿、或者把排版结果直接接入自有ERP基本只能找原厂定制工期和报价都很“感人”。开源代码的优势就在这三点第一成本为零最多根据开源协议付咨询费第二算法可改矩形排放不合适就换遗传算法密度上不去就调参数第三易于集成套料作为中间模块接收DXF/SVG吐出排版结果和切割路径前后都可以接自己的系统。当然开源也不是没有成本它的成本在于你要能读懂代码、调好参数。所以接下来我先把算法这块讲透再给具体代码。2. 核心算法与实现原理2.1 矩形排样的基础水平线与启发式策略矩形套料是所有开源套料的起点。最经典的做法是水平线算法Bottom-Left / Skyline把板材底部看成一条地平线每个零件按某种顺序放到底部最左边的可用位置放完后更新轮廓线继续放下一个。这个算法实现简单但对放置顺序极其敏感所以一般会配合启发式排序比如按面积降序、按最长边降序甚至按“剩余面积最大”动态选择下一个零件。在开源代码里你可以看到很多项目沿用了“排序 落位”的框架。我自己习惯在测试时先跑一遍矩形版的排样因为矩形本身没有旋转和碰撞的复杂度能快速验证排序策略和评价函数是否合理。等你把矩形版的利用率跑到85%以上再切换成不规则版本才不会一上来就被NFP计算折腾到怀疑人生。2.2 不规则零件NFP是绕不开的关键异形零件套料开源库里普遍采用NFPNo-Fit Polygon方法。NFP的概念可以这样理解把两个零件A和B放在同一个平面上让B贴着A的外轮廓滑动一圈B上某个参考点划过的轨迹围成的区域就是A和B不能重叠的禁区。只要参考点不在NFP内部两个多边形就保证不重叠。这个思路漂亮但计算量不小尤其两个零件都是凹多边形的时候NFP本身可能带洞。很多开源项目在凹多边形上采用“先凸分解再合NFP”的方式来压缩计算代价是会损失一点最优性。实际排样时开源代码通常不会让零件任意落到任意一个点而是只尝试两个关键位置一是贴着已放零件的NFP边界二是贴着板材边界。这样搜索空间大幅缩小排出来的结果也符合“零件尽量靠拢”的直觉。你如果去看Deepnest这类项目的源码会发现它的核心就是一个“对每个候选位置计算容纳评分再选得分最高位置”的贪心循环。2.3 优化算法值得关注的三个参数很多开源套料代码默认提供遗传算法或模拟退火的开关。结合我的经验改动优先级最高的三个参数是旋转步长、群体大小、迭代次数。旋转步长太粗比如只能转90度会漏掉好解太细比如每1度试一次会让计算量爆炸通常建议在45度或15度的档次上先跑找到趋势后再缩小。群体大小和迭代次数直接决定求解质量但不是越大越好车间里一次排样如果超过十分钟现场工人就宁可手动摆了。我的经验是先用小群体跑快出一版再在解的基础上做局部微调比一上来就跑大种群更快见到效果。3. 开源项目选型与实操3.1 几个值得关注的套料开源项目这里我按使用场景把GitHub上常见的几个方向列一下方便大家照方抓药。项目方向典型仓库关键词适用场景上手难度矩形装箱rectpackPython规则矩形板材、家具开料低不规则嵌套nestingJavaScript激光切割、水刀、SVG图纸中综合套料GUIdeepnest小型加工作坊、异形板件中工艺辅助DXF解析 路径生成需要对接数控系统的团队高rectpack这类纯矩形库我在做规则零件试排版时用得最多接口简单批量跑几千个矩形也很快。nesting则偏几何输入输出都是SVG适合Web界面里调用。Deepnest本身就是个完整软件有图形界面不懂代码的师傅也能用但我更看重它的算法结构可以直接拿来当参考。3.2 环境准备与代码集成我的建议是直接用Python起步生态最省事。先装rectpack、svgwrite再准备一个SVG文件或者直接在代码里构造矩形列表。需要注意的是车间的DXF文件往往有很多多余的图层、样条曲线直接交给套料库前要先做几何清洗把曲线炸开成多段线、过滤掉文字标注、把重复线段合并。这一步不做后面要么排不出结果要么排出来的外形跟实际零件差一条边。开发时我喜欢在VS Code里直接调试把开源代码拉到本地后逐行加断点看核心循环。这不丢人套料算法的调试可比普通业务代码难多了因为很多错误不是报错而是“排出来了但利用率很离谱”必须依赖可视化中间结果去定位。配合VS Code的调试面板和绘图插件能省很多事。3.3 一份可直接运行的矩形套料示例下面这段代码用的是rectpack跑完会打印每个零件在板材上的坐标我建议你先复制它跑通再替换成自己的零件尺寸。from rectpack import newPacker rectangles [ (120, 60, 0), # (宽, 高, 自定义编号) (80, 80, 1), (65, 45, 2), (140, 35, 3), (55, 55, 4), (90, 50, 5), ] bin_w, bin_h 300, 200 packer newPacker(rotationTrue) # 允许90度旋转 for w, h, rid in rectangles: packer.add_rect(w, h, rid) packer.add_bin(bin_w, bin_h) packer.pack() for bindex, x, y, w, h, rid in packer.rect_list(): print(f零件{rid}: 左下角({x}, {y}), 尺寸({w}x{h}))rect_list返回的每一项包括板材索引、左下角x、左下角y、宽、高、零件编号。注意库返回的宽高是经过旋转处理后的实际尺寸不是原始传入尺寸这对后续输出切割文件和成本核算非常关键。如果你要输出SVG可以继续加上svgwrite将每个矩形画成fill:none、stroke:black的path节点再把所有零件轮廓叠到同一张板材视图上就能在浏览器里直观检查是否重叠、是否超出边距。实际项目里我还会把材料利用率直接打印出来利用率 所有零件面积之和 / 板材面积。这块数据是老板唯一关心的数字也是你调参数时最重要的反馈。3.4 不规则零件怎么接Deepnest不规则零件建议直接看Deepnest的思路输入SVG内部会把每个零件轮廓解析成多边形然后根据你设定的间距spacing和旋转选项跑嵌套最后输出一个新的SVG里面是排好的所有零件族。实际使用中要注意Deepnest对SVG的要求比较严格图案、文字、多图层容易导致解析失败所以输入文件尽量用最简单的纯轮廓路径而且建议把每个零件单独做成一个图层命名对应零件编码。我用Deepnest排一批带圆角的支架时最实用的参数是“间距”这个值必须比割缝宽度大否则切出来的零件会轻微熔接在一起。车间常用的割缝是1mm到3mm那间距我一般设到3mm起步宁多勿少因为实际切割时热影响区会让零件边缘轻微变形。4. 常见问题与避坑经验4.1 材料纹路与旋转限制很多板材有方向性比如木纹、拉丝不锈钢、覆膜板并不是所有零件都能任意旋转。旋转限制应该在套料之前就编码进数据而不是排完再人工判断。一个简单的做法是对不能旋转的零件在加入排样前就把旋转角度固定为0对只能90度旋转的零件让套料库只尝试0度和90度两个朝向。我记得有一次排一批带纹理的铝板因为忘了限制旋转程序给出的利用率高达91%但车间根本没法用——三分之一零件的纹理方向是反的最后全部重排。4.2 割缝补偿到底应该在哪个环节加这是新手最容易搞混的地方。割缝是切刀走过的实际路径宽度所以零件实际切割轮廓要在原始形状上向外偏置半个缝宽排版时用的是带补偿后的轮廓而不是图纸上的理论轮廓。如果你把补偿加到排版之后排好的零件间距就可能不够轻则切不透重则伤到相邻零件。开源代码里DXF导入后建议统一做一个offset操作把轮廓整体向外扩尺寸精度要求高的零件再单独标出来不补偿。4.3 性能慢、内存涨怎么办套料程序跑得慢98%的情况不是算法不够先进而是预处理没做干净。比如DXF里有一堆未合并的短线段一个本来只有4个顶点的矩形被拆成了几百段NFP计算复杂度直线上升。我的排查顺序是先统计每个多边形顶点数量如果超过阈值就做顶点抽稀然后确认所有多边形都是闭合的、没有自相交最后再开优化算法。还有一点别把几千个零件一次性丢给遗传算法可以先把零件按面积分组大零件一组先排小零件一组补空效率会高很多。4.4 坐标系方向是个隐形的坑最后补充一个我踩过很多次的坑坐标系方向。SVG的y轴向下DXF的y轴向上数控G代码的坐标系又可能和机床机械原点绑定如果套料输出的坐标直接进切割机很可能会出现上下镜像或者整个图形翻转。解决方法是统一在套料模块的输出边界做一次矩阵变换把坐标从“图形坐标系”转到“机床坐标系”变换矩阵写死在配置里不要每次都手改。这个跟2D标定里的左右手系问题本质是一回事理解了“坐标系是一种约定”就不会被这种问题反复折磨。我在实际使用中养成的一个习惯是每次跑完一趟套料都把零件清单、板材尺寸、间距、利用率存档时间久了就能积累出一张针对自家产品和工艺的“经验参数表”。开源套料代码最大的价值不在于它直接能用而在于你能看懂它的每一步决策然后把自己的工艺经验写进去。后续如果要扩展可以从自动识别板材余料开始把之前切剩下的边角料拍照或用2D视觉测量后直接作为新板材参与排样这块潜力很大但也比较考验工程能力。希望这篇内容能帮你在自己的项目里少踩几个坑。本文还有配套的精品资源点击获取