☰
2D板材排版套料开源代码实战:从算法原理到车间落地
2026/10/21 0:52:22 网站建设 项目流程

简介:面向激光切割、水切割等制造场景的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是绕不开的关键

异形零件套料,开源库里普遍采用NFP(No-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上常见的几个方向列一下,方便大家照方抓药。

项目方向典型仓库关键词适用场景上手难度
矩形装箱rectpack(Python)规则矩形板材、家具开料低
不规则嵌套nesting(JavaScript)激光切割、水刀、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(rotation=True) # 允许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视觉测量后,直接作为新板材参与排样,这块潜力很大,但也比较考验工程能力。希望这篇内容能帮你在自己的项目里少踩几个坑。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询