本文涉及知识点
前言
运行环境:AutoCad2013及更高版本,暂不支持中文Cad和BricsCad。
帮助视频:https://edu.csdn.net/course/detail/41448 如果在审核中,请点击:https://www.bilibili.com/video/BV1X4Hm61EWz/
下载地址:https://download.csdn.net/download/he_zhidan/93660109
排样套料工具箱。初版支持AutoCad2013+,基于libnest2d0.4,clipper, nplot,boost。不支持凹多边形,凹多边形被填充凸多边形。不支持孔洞。只支持多义线,非闭合多义性将自动闭合,多义线的弧将用线段模拟。并根据箱子的框高,绘制新箱子,将选择的多义线,移动到箱子中,保留多义性的颜色等属性。
排样是NP-Hard问题,无法在有限时间找到最优解,许多时候明显的最优解都没找到。
排样套料工具箱
一、产品定位
排样套料工具箱是一款面向 AutoCAD 绘图员的自动化排样插件,帮助您把多个零件快速、紧凑地摆放到一张板材上,减少余料浪费,提升材料利用率。初版支持 AutoCAD 2013 及以上版本。
二、核心能力
| 能力 | 说明 |
|---|---|
| 一键排样 | 选择多个多义线,自动计算最优摆放位置 |
| 自动建箱 | 根据设定的箱宽箱高,自动绘制新的板材框 |
| 搬移零件 | 把选中的多义线自动移动到箱子中 |
| 保留属性 | 零件的颜色、图层等属性完整保留 |
| 多策略可选 | 提供 DJD 启发式、首次适应两种排样策略 |
| 技术内核 | 基于 libnest2d 0.4、Clipper、nplot、Boost 等成熟开源库构建,算法稳定可靠。 |
三、使用流程(三步完成)
选零件 ------ 在图纸上框选要排样的多义线
设参数 ------ 填写板材尺寸、间距、旋转角度等
点排样 ------ 插件自动计算并生成排样图
整个过程无需手动摆放,几秒钟即可完成过去几十分钟的工作。
四、当前版本的能力边界
为了让您对工具的适用范围有清晰预期,以下限制请务必了解:
✅ 支持的图形
| 类型 | 说明 |
|---|---|
| 多义线(Polyline) | 唯一支持的输入类型 |
| 闭合多义线 | 直接处理 |
| 非闭合多义线 | 自动闭合后再处理 |
| 带弧的多义线 | 弧段用线段模拟(精度可调) |
⚠️ 不支持或受限的情况
| 情况 | 处理方式 |
|---|---|
| 凹多边形 | 自动填充为凸多边形后再排样 |
| 带孔洞的零件 | 不支持,孔洞会被忽略 |
| 圆、椭圆、样条曲线等 | 不支持,请先转换为多义线 |
说明:凹多边形填充为凸多边形后,排样结果会比实际零件"胖"一些,可能导致板材利用率略低于理论值。如果您的零件有明显的凹形特征,请在排样后人工微调。
五、关于"排样是不是一定能找到最优解"
排样属于 NP-Hard 问题------这是数学上已被证明的结论。
通俗地说:零件数量一多,可能的摆放组合就呈爆炸式增长,任何算法都无法在有限时间内穷举所有方案。 因此:
本工具不保证找到最优解;
许多时候,连肉眼可见的最优解也未必能找到;
但相比人工摆放,工具能在几秒内给出一个明显更好的方案,这已经能带来可观的效率提升。
我们的建议:把工具当作"高效的初稿生成器",排样结果可在此基础上人工微调,兼顾效率与质量。
六、典型收益
| 对比项 | 人工摆放 | 使用本工具 |
|---|---|---|
| 单张板材排样耗时 | 20~60 分钟 | 几秒 ~ 几十秒 |
| 材料利用率 | 依赖经验,波动大 | 稳定提升 5%~15% |
| 一致性 | 因人而异 | 标准化输出 |
| 可重复性 | 难复现 | 参数保存,一键复现 |
七、适用场景
钣金下料:激光切割、等离子切割、火焰切割
木工开料:板材裁切、家具部件排布
石材/玻璃:异形件排版
广告标识:亚克力、PVC 板排样
操作步骤
一,点击选项卡(或菜单)上的套料按钮。
二,选中需要套料的多义线,非闭合多义线会当成闭合多以线。带圆弧的多义线或通过直线段拟合。弦高 ≤ max ( 0.1 , 物品间隙 / 20 ) \le \max(0.1,物品间隙/20) ≤max(0.1,物品间隙/20)。
三,自动生成红色箱体,并将能装箱的物品旋转移动到对应箱体。
原图
紫色:有圆弧的多义线。
绿色:较长的多义线。
青色:凹多边形。
黄色:非简单多边形。

排样后:


基础配置

| 参数名 | 含义 | 对绘图的影响 | 建议值 |
| DecimalPlaces | 保留小数位数 | 排样结果中坐标值保留几位小数 位数越多越精确,但图纸尺寸标注会显得冗长;位数太少可能造成零件间出现微小重叠 | 3(毫米精度到千分之一,够用) |
| MinSpacing | 最小间距 两个零件之间必须留出的最小空隙 | 设太小 → 零件挨太紧,切割时可能碰伤;设太大 → 浪费材料 | |
| SelectorType | 选择器类型 | 排样时决定"下一个放哪个零件"的策略 影响排样速度与材料利用率,通常用默认即可 | 0(DJD 启发式)或 1(首次适应) |
| BinWidth | 箱子宽 排样区域的宽度(通常是板材的宽) | 必须与实际板材尺寸一致,否则排样结果无法使用 | 按实际板材填写,如 1220、1500 |
| BinHeight | 箱子高 | 排样区域的高度(通常是板材的长) 同上,决定排样范围 | 按实际板材填写,如 2440、3000 |
| TimeoutSeconds | 超时秒数 | 算法最多运行多少秒,超过就停止 设太短 → 排样质量差;设太长 → 等太久 | 一般 30 秒;零件多时可设 60~120 |
提示:BinWidth 和 BinHeight 就像"一张纸的大小",排样算法要在这张纸上把零件摆下。填错的话,排出来的图在实际板材上放不下。
临界多边形配置

NFP(临界多边形)是排样算法中判断"两个零件能不能靠在一起"的核心工具。这组参数控制 NFP 的计算精度与摆放方式。
| 参数名 | 含义 | 对绘图的影响 | 建议值 |
|---|---|---|---|
| accuracy | 精度 | NFP 计算时轮廓的近似精度(0~1) 值越大 → 轮廓越精确,但计算越慢;值太小 → 可能造成零件间微小重叠 | 0.65(默认,够用) |
| alignment | 对齐方式 | 零件靠拢时按什么方式对齐 影响零件的摆放姿态, | 通常用默认 0(默认) |
| starting_point | 起始点 | NFP 计算的起始顶点索引 | 一般不用改,算法会自动选 0(默认) |
| rotation_angles | 可旋转角度 | 零件允许旋转的角度列表 这是绘图员最需要关注的参数! 列表里的角度就是零件可以尝试的方向 | 按工艺定:{0, 90, 180, 270} 或加 45、30 等 |
rotation_angles 的通俗解释:假设你有一块零件,{0, 90} 表示"只能正着放或转 90 度放";{0, 45, 90, 135, ...} 表示"每 45 度都能试一次"。角度越多,排样越灵活,材料利用率越高,但计算时间也越长。
启发性配置

这组参数控制"怎么尝试不同的摆放组合",影响排样质量与速度。
| 参数名 | 含义 | 对绘图的影响 | 建议值 |
|---|---|---|---|
| try_reverse_order | 尝试反序 | 是否也尝试"从后往前"排一遍 开启后可能找到更好的方案,但耗时增加 | true(默认) |
| try_pairs | 尝试2个一组 | 是否把两个零件组合起来一起排 开启后对成对零件(如左右件)效果更好 | true(默认) |
| try_triplets | 尝试3个一组 | 是否把三个零件组合起来一起排 开启后可能提升利用率,但速度明显变慢 | false(零件少时可开) |
| initial_fill_proportion | 初始填充率 开始时按多大比例"铺满"板材 值越大 → 初始方案越满,但可能错过更优解;值越小 → 探索空间更大 | 1/3(默认,平衡) | |
| waste_increment | 浪费增长 | 每次迭代允许的浪费增量 值越大 → 算法越"敢"尝试新方案;值越小 → 越保守 | 0.1(默认) |
通俗理解:DJD 就像一个"试衣间",try_pairs 是"试试两件一起穿",initial_fill_proportion 是"一开始先穿几件",waste_increment 是"每次允许多浪费多少空间"。参数越激进,试的次数越多,找到好方案的概率越大,但时间也越长。
扩展阅读
| 计算几何为骨,排样优化为魂 |
|---|
| 作品一:亲士套料工具箱 作品二: 亲士CAD工具箱 |
| 经典文章推荐:二维排样 |
| 万物皆数学 |
| 查阅鄙人的博文,请点击博文下载学院导航 |
| 活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。 |
| 子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。
