PCB 单拼版核心能力跃迁:大小拼完整方案 × 尺寸序列驱动 × 阻抗条算法演进
PCB 单拼版核心能力跃迁大小拼完整方案 × 尺寸序列驱动 × 阻抗条算法演进本文记录了 ai-pcbcut 单料号拼版模块在 2026年7月28-29日两天内的密集迭代——共计30 次提交涉及9 个文件、1011 行新增、454 行删除。核心主题包括大小拼方案从「一刀两片」到「多片组合旋转A/B双向编辑完整可视化」的能力跃迁、WPnl 尺寸序列从「被动过滤」到「主动驱动」的算法重构、阻抗条放置经历 5 次位置演化的设计决策、以及方向标记从文本符号到 Canvas 矢量 F 字母的视觉进化。一、两天迭代全景7月28日 7月29日 ════════════════════════════════ ════════════════════════════════ 单拼页面UI重组 留边最大化 方向指示: 三角旗 → F字母 大小拼多片组合排布 F标记放大×2 粘连修复 开料图大小拼 WPNL-B 渲染 阻抗条: 居中 → 工艺边 → 行空隙 WPNL旋转90°(宽高互换多放一片) WPnl尺寸序列: 过滤 → 驱动生成 大小拼引擎合并(代码减半) 模板字段完整映射 工作板范围检查修复 displayGroups 方案条数限制 开料图多行多列渲染(Wpnl不超出) Coupon重命名为阻抗条 启动命令修复 大小拼WPnl-B完整支持两天 30 次提交每一次都是对单拼版功能的纵深打磨。二、大小拼从「一刀两片」到完整方案闭环这是两天迭代中变动量最大、也是业务价值最高的一条主线。2.1 背景回顾单料号拼版中当用户开启「含大小拼」开关后引擎在 SET 上做直切分割产生 WPnl-A大面积和 WPnl-B小面积两种工作板分别排入不同数量的 PCS以提升整体利用率。之前的大小拼实现是一个「概念验证」级别单一直切线一刀切出 A 和 B各占一块固定区域。存在几个明显的短板排布僵化A 只有 1 片、B 只有 1 片无法多片组合方向固定WPnl 不能旋转 90°错失了宽高互换可能带来的额外容量B 不可见开料图上只能看到 AB 是隐形的不可编辑B 板的 PCS 排列只能在概念上计算无法在编辑器中调整2.2 多片组合排布从 11 到 MN核心突破1e8d3a1将一刀两片改为多片组合排布。之前: 一刀切 → A×1 B×1 现在: 枚举 cutColsA × cutColsB → A 放 N 片 B 放 M 片 水平布局: [A][A][B][B][B] ← cutColsA2, cutColsB3 同行(rows一致), 同高排列 垂直布局: A A A ← cutRowsA2, cutRowsB3 B B B B B 同列(cols一致), 同宽排列算法核心——枚举 {cutColsA, cutColsB} / {cutRowsA, cutRowsB} 找到最优填满方案// 水平布局枚举for(intca1;ca*wpnlAWbw*0.85;ca){doubleusedWca*wpnlAW;doubleremainWbw-usedW;intcb(int)((remainWkerf)/(wpnlBWkerf));if(cb0)continue;// 两尺寸均受工作板尺寸范围约束if(wpnlAWminWorkW||wpnlAWmaxWorkW)continue;if(wpnlBWminWorkW||wpnlBWmaxWorkW)continue;inttotalPcsca*rows*unitsPerBoardAcb*rows*unitsPerBoardB;// 取总PCS最大、利用率最高的组合}这极大地释放了大小拼的潜力——不再是固定的一刀两片而是根据板材尺寸自动适配最佳的 A/B 排列组合。2.3 WPnl 旋转 90°宽高互换多放一片关键突破113289b允许大小拼中的 WPnl 旋转 90°。场景Wpnl-A 尺寸 406×457, Wpnl-B 尺寸 304×406 水平布局: 406(A) 304(B) 406(A) 1116 1000(板宽) ❌ 旋转B: 406(A) 406(B宽) 406(A) 1218 1000 ❌ 旋转A: 457(A宽) 304(B) 761 1000 ✓ 还能加一片!算法实现对每种尺寸组合分别尝试正常方向和旋转 90° 方向宽高互换以寻找更紧凑的排列。2.4 引擎合并代码减半重要重构9b07074大小拼引擎中的正常方向和旋转方向原本是两套几乎重复的代码~346 行重构后合并为一个循环// 重构前: 两套独立代码// 水平布局代码块 × 1 (正常方向)// 水平布局代码块 × 1 (旋转方向) ← 完全重复// 重构后: 一个循环搞定boolean[]rotStates{false,true};for(booleanrotated:rotStates){doublestepWrotated?unitL:unitW;doublestepHrotated?unitW:unitL;// 正常旋转共用同一套逻辑}// 346行 → 160行2.5 WPnl-B 完整闭环编辑 / 详情 / 拼版图 / 开料图收尾之作2d12f92让 WPnl-B 在前端各个模块中都有完整呈现模块之前之后拼版图只能看 WPnl-AA/B 切换按钮自由切换视图开料图A 单色渲染B 不可见分组渲染B 用橙色块显示 切割线跨组绘制详情页无 B 信息补传 wpnl-b-* 全套参数编辑器不支持 BA/B 双向编辑 独立撤销栈 旋转按钮组配色统一蓝A蓝, B橙黄 (bColorScheme)开料图分组渲染算法870b37a——这是两天中最复杂的前端变更水平布局时: 每组 colsA 个 WPnl-A bPerGroup 个 WPnl-B 组内水平排列 → 板满后换行 → 下一组 切割线在每组内部正确绘制 垂直布局时: 每组 rowsA 个 WPnl-A bPerGroup 个 WPnl-B 组内垂直排列 → 板满后换列 → 下一组关键 Bug 修复去掉了rows1的单行限制仅凭高度比例判断水平/垂直布局类型使多行多列的大小拼开料图正确渲染不再出现 WPnl 超出大板边界的问题。三、WPnl 尺寸序列从边角校验到核心驱动3.1 需求背景PCB 工厂通常有固定的 WPnl工作板规格表——比如 406×457、“18寸标准板” 等。拼版结果的可制造性取决于 WPnl 尺寸是否在工厂已有的治具/工艺能力范围内。之前的实现是「事后过滤」模式先自由枚举所有可能的 WPnl 尺寸 → 然后过滤出表中存在的尺寸 → 丢弃不匹配的。这意味着大量计算被浪费。3.2 算法重构从事后过滤到主动驱动第一阶段20e492f→176c311建立过滤机制。// 从 templateParams 解析 wpnlSizeTable// compactWP 计算后查表匹配±5mm 容差// 不在表中 → 跳过不产生方案问题发现过滤位置不对。最初放在tryCompactPlace内部只覆盖紧凑排布路径常规方案、大小拼、花式拼、横直料方案的 WPnl 没有被校验。修复——统一后置过滤// singleOptimize 末尾统一过滤// 覆盖所有方案类型: 常规、大小拼、花式拼、横直料// 大小时: A 和 B 都必须在表中if(wpnlSizeSet!null){for(SingleOptimizeVariantv:allVariants){booleanaMatchanyMatch(wpnlSizeSet,v.workBoardW(),v.workBoardH());if(!aMatch)continue;if(v.wpnlBCount()0){if(!anyMatch(wpnlSizeSet,v.wpnlBW(),v.wpnlBH()))continue;}}}第二阶段abf05ec从「过滤」重构为「凑表值驱动生成」。核心思想完全翻转不再自由枚举再过滤而是直接遍历表中尺寸作为目标反算 PCS 排列。privateListSingleOptimizeVariantoptimizeBySizeTable(SingleOptimizeRequestrequest,SetStringsizeSet,doublemarginAutoAdd){for(Stringsz:sizeSet){inttargetW406,targetH457;// 从表中解析// 反算在目标 WPnl 尺寸内能放多少行多少列 PCSintmaxCols(int)((targetWspacing)/(stepWspacing));for(intcols1;colsmaxCols;cols){doublecellWcols*stepW(cols-1)*spacing;doublemr(targetW-cellW)/2;// 留边 表尺寸 - PCS网格if(mr0||mrmrMaxmarginAutoAdd)continue;// 同理计算 rowsintmaxRows(int)((targetHspacing)/(stepHspacing));for(introws1;rowsmaxRows;rows){...}}}}关键创新——“凑表值”而非“过滤表值”对比维度过滤模式旧驱动模式新枚举起点自由枚举 SET 网格直接遍历表中尺寸精度±5mm 容差匹配精确命中目标尺寸留边自由选择反算targetW - cellW覆盖率可能有遗漏100% 覆盖表性能计算过滤丢弃多只算命中零浪费验证结果100×150mm PCS spacing0.8精确命中406×457和304×406两个工厂标准尺寸。3.3 开关联动防止脏数据一个容易被忽略的 Bug39f3249模板参数 含 wpnlSizeTable → 合并到 mergedParams → 传给后端 → 即使开关关闭后端检测到 wpnlSizeSet ! null → 仍然执行过滤修复开关关闭时主动清除// 开关关闭时 delete mergedParams.wpnlSizeTable// 确保后端不会收到任何尺寸表数据四、阻抗条放置算法五次演化阻抗条Impedance Bar是 PCB 制造中用于阻抗测试的工艺条需要在 WPnl 上占一个位置。它的放置看似简单实际经历了 5 次位置调整演化路径: 底部(旧) → 居中(避免SET重叠) → 工艺边(避免SET重叠) → 行空隙(最优) → 间距计算修复第一次尝试放在 WPnl 底部旧逻辑阻抗条放在 WPnl 底部工艺边区域。看似合理但实际上阻抗条会和某些大尺寸 SET 重叠。第二次居中放置b3573ea// 阻抗条居中而非底部effH 不再扣减 impBar// 对 ur 2 的 WPnl:midRowrows/2下半SET下移 impBar → 阻抗条在SET行之间 compactWHimpBar第三次放回工艺边106e40c发现居中方案有细节问题——阻抗条在 SET 行间隙中会破坏 SET 的网格对齐。改为放在顶部工艺边区域。第四次放回行空隙1d1f4a7经过多轮权衡最终确定最优方案阻抗条放在 SET 行空隙中央。这需要前后端协同// 后端: impBar 0 且 ur 2 时以 midRow 为界分裂 SET// 下半部下移 impBar → 中间产生 impBar 宽度的空隙// 前端: 通过 items 的 Y 值找最大空隙// 阻抗条绘制在空隙的精确中央位置第五次间距计算修复03d06bc阻抗条有多条时总高度需要包含 spacing// 修复前totalHwidth*count// 修复后totalHwidth*countspacing*count// 每条阻抗条之间有间距技术启示一个放哪里的问题需要前后端协同 多轮验证才能确定最优方案。工程中没有一蹴而就的答案。五、方向标记从文本符号到矢量 F 字母5.1 进化链▲▼◀▶ UNICODE 文本 → Canvas 三角旗 → F 字母矢量图 文本: 简单但无法表达旋转镜像 三角旗: 旗面旗杆组合, 支持旋转, 但辨识度不够 F字母: 开口方向方向, 旋转旋转, 镜像翻转红色5.2 F 字母方案15aba87这是一个巧妙的设计——F 字母的开口天然指示方向正常状态蓝色: F 开口向上 → UP F 开口向右 → RIGHT F 开口向下 → DOWN F 开口向左 → LEFT 旋转90°/270°: F 整体旋转 ±90°开口方向自动跟随 镜像红色: F 水平翻转 X轴偏移 红色绘制 → 清晰区分F 字母的 Canvas 绘制F 的笔画结构: 竖线 (stem): [(-0.65s, 0.75s)] ← 上下延伸 上横线: [(-0.65s, -0.55s)] 中横线: [(-0.65s, 0.05s)] 竖线 上横线 中横线 F 参数 s 自适应缩放 (基于item尺寸和scale)后续还有三次精细调整上下横线间距增大a7ff30bsyTop-0.55s / syMid0.05s / syBot0.55s横线间距 0.60s 避免粘连F 标记整体放大fd13fbdsize 0.38→0.50再次放大ce2609esize 0.50→0.65(整体30%)竖线-0.60~0.65 → -0.65~0.75六、参数模板与 UI 体系完善6.1 模板字段完整映射48779ffapplyTemplateParams之前只映射了部分参数本次补全了所有缺失字段分类补全字段留边范围processEdgeLRMin/Max, processEdgeTBMin/Max, marginLeftRight 等工作板尺寸wpnlMin/MaxWidth, wpnlMin/MaxLength拼版开关enableStaggered, enableDualWpnl, enableHvMaterialAB 拼enableAbRotate/AbMirror, 单双行交替, AB 间隔开料方向forceDirection allowRotation 联动铜箔开料enableCopperCalc, copperMargin/SpacingPCS 折断边breakaway 四边 autoReverseBreakaway pcsSpacing阻抗条impedanceBars(模板数组) → useImpedanceBars 列表6.2 其他工程完善displayGroups9233a51从模板 JSON 解析displayGroups字段默认 20去重排序后截断方案列表避免前端展示过多候选项阻抗条数据兼容a89c701模板中的阻抗条数据存在coupons字段下quantity属性与页面impedanceBars字段格式不同需要兼容映射Coupon→阻抗条20bbe5c统一命名Coupon页签重命名为阻抗条相关变量名全部同步UI 重组31bcc2f单拼页面 UI 重新布局留边最大化页面整体更紧凑七、技术总结7.1 核心突破模块突破大小拼一刀两片 → 多片组合 → 旋转90° → A/B双向编辑完整可视化尺寸序列被动过滤 → 主动驱动生成凑表值精确命中的零浪费算法阻抗条5 次位置演化最终收敛到「SET 行空隙中央 前后端协同」方向标记文本 → 三角旗 → F 字母矢量图8方向旋转镜像全覆盖模板映射补全 20 字段映射实现模板参数→页面控件的完整闭环7.2 设计哲学两天的迭代体现了三个工程原则从能用走向好用——大小拼从概念验证到完整闭环不是加新功能而是把已有的做深做透算法翻转而非修修补补——尺寸序列从过滤改为驱动不是调参数而是重构搜索起点前后端协同布局——阻抗条的位置、开料图的渲染都是前后端各司其职又互相配合项目ai-pcbcut PCB 拼版系统模块单料号拼版Single Scheme技术栈Java Spring Boot Vue 3 Canvas 2D TypeScript开发模式Claude Code AI 辅助编程本文基于 2026年7月28-29日 ai-pcbcut 项目 master 分支的 30 次提交撰写。

相关新闻

贪心算法实战:从均分纸牌到纪念品分组,掌握核心策略与证明

贪心算法实战:从均分纸牌到纪念品分组,掌握核心策略与证明

1. 从三道经典贪心题说起:算法竞赛中的“直觉”与“证明” 如果你刷过洛谷的题目,或者参加过一些算法竞赛,P1031、P1094、P1125这三个题号大概率不会陌生。它们分别是“均分纸牌”、“纪念品分组”和“苯环”。乍一看,这三道题似乎…

2026/10/10 9:16:29 阅读更多 →
开源免费AI面试助手interview-assistant

开源免费AI面试助手interview-assistant

本文基于 macOS 实测撰写;核心部署步骤在 Windows 上同样适用,每个步骤末尾附有对应的 Windows 操作说明(Windows 音频采集使用 soundcard 库,无需虚拟声卡;RunXun 仅支持 macOS)。 前言 写这篇文章的初衷…

2026/10/10 1:13:26 阅读更多 →
Vite + Vue3 + IDEA:现代化前端工程化实战指南

Vite + Vue3 + IDEA:现代化前端工程化实战指南

1. 项目概述:为什么选择Vite Vue3 IDEA这个组合? 如果你是一个从Vue2时代过来的前端开发者,或者正准备从零开始搭建一个现代化的前端项目,那么“Vite Vue3 IDEA”这个技术栈组合,大概率是你当前或未来的最优解。这…

2026/10/12 11:28:25 阅读更多 →

最新新闻

同步发电机突然三相短路暂态过程Simulink仿真实现与分析

同步发电机突然三相短路暂态过程Simulink仿真实现与分析

同步发电机的突然三相短路,基本上每个学电机和电力系统的人都绕不过去。教材里那一串用暂态电抗、次暂态电抗、时间常数堆出来的公式,推导过程极其劝退,算出来的冲击电流倍数也让人没什么实感。前阵子我刚好用Simulink把同步发电机突然三相短…

2026/10/13 21:32:27 阅读更多 →
CATIA V5基础教程:界面认知与鼠标中键、指南针操作详解

CATIA V5基础教程:界面认知与鼠标中键、指南针操作详解

简介:CATIA基础教程基本操作PPT学习教案是一份面向CATIA V5初学者的入门教学课件,重点解决新手不熟悉界面布局、不掌握基本交互的问题。课件从工作界面认知入手,系统讲解菜单栏的常见菜单分类、公共工具栏(视图、图形属性、测量&a…

2026/10/13 21:32:27 阅读更多 →
同步发电机突然三相短路Simulink仿真与暂态波形解读

同步发电机突然三相短路Simulink仿真与暂态波形解读

同步发电机突然三相短路,是电力系统教科书里反复强调的重头戏,也是每个电气工程专业学生绕不过去的坎。很多人把理论背得滚瓜烂熟,但一问他短路电流里为什么有直流分量、次暂态和暂态到底怎么从波形上看出来,就支支吾吾了。这篇内…

2026/10/13 21:32:27 阅读更多 →
Codex新模型接入指南:解决模型选择与配置不生效问题

Codex新模型接入指南:解决模型选择与配置不生效问题

最近遇到一个特别典型的问题:某个新发布的大模型,在官方网站和聊天界面里用得挺欢,但只要换到 Codex 这种命令行编程工具里,要么报model not found,要么始终在用旧的 Base 模型,新模型的上下文窗口和推理能…

2026/10/13 21:32:27 阅读更多 →
VLC时钟控制原理与毫秒级音视频同步实战

VLC时钟控制原理与毫秒级音视频同步实战

1. 项目概述:这不是调时间,是给视频流装上“精准节拍器”“vlc时钟控制”——这五个字在普通用户眼里可能只是“VLC播放器里那个不起眼的设置项”,但在音视频处理、直播推流、多机同步、教育录播、工业视觉检测等真实场景中,它本质…

2026/10/13 21:32:27 阅读更多 →
Qt MinGW 编译 PCL 全家桶:Boost/Eigen/FLANN/Qhull/VTK 完整指南

Qt MinGW 编译 PCL 全家桶:Boost/Eigen/FLANN/Qhull/VTK 完整指南

简介:本资源面向需要在Windows平台使用Qt与MinGW工具链构建三维点云应用的C开发者,提供PCL点云库及其全套依赖的编译成果。PCL专注三维点云采集、预处理、特征提取与表面重建,Qt负责跨平台图形界面,MinGW提供原生Windows编译工具链…

2026/10/13 21:31:26 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →