R2 刀片:金手指两侧开台阶(插不进插槽)+ 铺铜补齐并跟着台阶重画

⛔ 根因:禁布区 ≠ 板材。ZONES['finger'] 早写着「槽体 ~9mm 要让开」,但那只是
   「别放件」,板框从来没开台阶 —— outline_pts() 第一段就是 (r,0)→(BW-r,0),
   90 mm 宽的板材一直到 y=0。插槽塑料体只有 39 mm 且两端封闭 ⇒ 插不到底。

板框(用户拍板):舌头 36.0 mm(x 27~63)/ 台阶高 12.0 / 内凹角 R1.0,切掉 648 mm²(10.6%)。
放行核算:被切区里铜 0 / 孔 0 / 焊盘 0 / 器件 0(板上读回与缓存两种口径一致);
7 个定位孔最南 y=14.46 全在板材上;铣穿槽 y 56.86 不受影响。
代价:主板投影底边在舌头两侧悬空 1.0 mm,靠 7 个 M1.6 尼龙立柱压住,无害。

铺铜:抓板发现板上只有 11 块(L1/L4 的 GND 底填整层缺失,而记录写的是 25/25)。
补齐后按台阶重画成 31 块(L2 11 + L1 9 + L4 9 + L3 两岛),填充 31/31,DRC 间距 0 条。
+12V 岛改成阶梯形单环:舌头段仍下探 y=9.0 接 12V 三指 launch 孔,东段抬到 12.5,
断面 11.0 → 7.5 mm(1 oz 内层约 5.1 A,需求 1.5 A 峰值)。

两条判据上的坑:
- 阶梯形多边形不能按包围盒判越界(+12V 岛会误报)⇒ 改成逐边 0.25 mm 采样。
- pcb_pour.inner_poly()/outer_poly() 是死函数,plan() 只用 gnd_tiles()。

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0168Bu6SEx3cXXCJLkdnE6zB
这个提交包含在:
zhou yang
2026-09-12 12:36:36 +08:00
共同撰写人 Claude Opus 5
父节点 312089326e
当前提交 dc4f9b9d1c
共修改 4 个文件,包含 304 行新增和 53 行删除
+64
查看文件
@@ -3325,3 +3325,67 @@ FAN_PWM_L (10.30, 83.90, 22.50, 87.30) 盖住 J27.4 与 Q6.3
工具:**`silk_base.py`**(`--push` 走 `pcb_PrimitiveAttribute.modify(id, {x, y, rotation})`,
下发后读回逐个核对),快照 `_base_silk.json`、方案 `_base_silk_plan.json`。
## 40. 刀片金手指两侧开台阶(2026-09-12 用户指出「插不进插槽」)+ 铺铜补齐
用户:「解决刀片板与插槽干涉的问题,完善刀片板铺铜」→「金手指两侧没有开槽,应该会插不进插槽」。
### 40.1 ⛔ 根因:刀片底边是一条直线,而 PCI-E 卡在这一段必须是「凸」字形
`outline_pts()` 原来第一段就是 `(r, 0) → (BW-r, 0)` —— 整块 90 mm 宽的板材一直到 y=0。
而插槽塑料体只有 **39 mm 长且两端封闭**(`PCIE-64P11L`,焊盘外框 42.0 × 9.2),
高度约 9 mm。卡插下去时,x < 29.5 / x > 68.5 的板材会压在塑料体两端壁上,**插不到底**。
⚠ 这一条 §3.1 的分区图里其实写着「金手指区 11 mm(**槽体高度 ~9 mm 要让开**)」,
但那只写进了 `ZONES['finger']`(禁布区),**板框没有跟着开台阶** —— 禁布区管的是"别放件",
不等于"这里没有板材"。两者是两回事,这次才暴露。
### 40.2 定稿尺寸(用户拍板)
| 项 | 值 | 说明 |
|---|---|---|
| 舌头宽 | **36.0 mm**(x 27.00~63.00)| 金手指本身跨 33.70(x 28.15~61.85),两侧各余 1.15 |
| 台阶高 | **12.0 mm** | 槽体 ~9,余 3 |
| 内凹角 | **R1.0** | 外形铣刀下不去直角(嘉立创外形最小 R0.5) |
| 切掉 | **648 mm²**(占 10.6%)| 左 27.0×12.0 + 右 27.0×12.0 |
常量在 `pcb_blade.TONGUE_X0/TONGUE_X1/STEP_H/STEP_R`;`outline_pts()` 改成凸字形,
**第一段仍是舌头底边**(`segments()` 与 `outline_polygon()` 都按这个前提把防呆缺口插进去)。
### 40.3 放行前逐项核过(两种口径交叉验证)
被切区(x<27 或 x>63 且 y<12)里:**铜 0 段 / 过孔 0 / 焊盘 0 / 器件本体框 0**
(板上读回 + `_blade_pads.json` 缓存两种口径一致)。
7 个定位孔最南 `H5` 在 y=14.46,全在板材上;两条铣穿槽在 y 56.86 起,都不受影响。
⚠ **唯一代价:手机主板投影底边在舌头两侧悬空 1.0 mm**
(`PHONE_ORG.y = 11.0` < 台阶 12.0;左 x 1.50~27.00、右 x 63.00~68.59,合计 31.09 mm²)。
主板是 7 个 **M1.6 尼龙立柱**压住的(§3.2 中框式焊盘,螺柱间隙 1.0),不靠边缘托 ⇒ 无害。
`selfcheck` 里改成判「悬空量 ≤ 1.5」+「定位孔不许落进台阶区」,不再用原来那条
`phone.y0 >= finger.y1`(台阶之后 finger 区只剩舌头,那条断言已经没有意义)。
### 40.4 铺铜跟着台阶改
- 新常量 `pcb_pour.STEP_POUR_Y = STEP_H + INSET = 12.5`:**舌头两侧的铜下沿**。
舌头那一段仍按 `TOP_POUR_Y`(外层 11.5) / `INSET`(内层 0.5) 走。
- `gnd_tiles()` 的竖条切分点加入舌头两端,舌头外的条 `y_lo` 抬到 12.5
⇒ 外层 L1/L4 每层 7 → **9 块**,内层 L2 由 9 → **11 块**(内层下沿是 0.5,被舌头切得更细)。
板上铺铜合计 **25 → 31 块**(L2 11 + L1 9 + L4 9 + L3 两岛)。
- **`+12V` 岛(L3)改成阶梯形单环**:舌头段仍下探到 y=9.0 去接 12V 三指的 launch 孔
(x 28.5~30.5 / y 11.75,全在舌头内;下沿 9.0 是为了避开地母线的孔 y 7.0/8.2),
舌头以东抬到 12.5。断面由 11.0 收到 **7.5 mm**(1 oz 内层 ≈ 5.1 A,需求 1.5 A 峰值)。
⚠ **`inner_poly()` / `outer_poly()` 是死函数** —— `plan()` 只用 `gnd_tiles()`。改铺铜边界时
别去改那两个(改了不生效,看着像"改了没用")。
### 40.5 一条判据上的坑:阶梯形多边形不能按包围盒判
给 `selfcheck` 加「铜不许伸进台阶切掉的区域」时,第一版按**整个环的包围盒**判:
`+12V` 岛 min(y)=9.0 且 max(x)=84 ⇒ 直接误报,而它 y=9.0 的那一段其实只在舌头内。
⇒ 改成**逐边采样**(0.25 mm 步长)判每个点。阶梯形/L 形铜面都要这么判。
### 40.6 顺带补齐:刀片外层铺铜原本整层缺失
抓板发现刀片上只有 **11 块铺铜**(L2 九块 GND + L3 两个岛),而 `plan()` 计划 25 块 ——
**L1 七块 + L4 七块 GND 底填全都不在板上**(交接记录写的"铺铜 25/25"与板上不符)。
已重建。台阶改动后每层 GND 由 7 → 9 块。