# -*- coding: utf-8 -*- u"""PhoneRail 的铺铜/平面层模型 —— 事实来源,改铜面改这里再 --push。 /c/Python314/python .claude/pcb_pour.py [--push] [--only L2|L3] ## 叠层(§10.1,layerStatus=1 的正好这四层) | 设计文档 | EasyEDA 层 | id | 这里干什么 | |---|---|---|---| | L1 | Top Layer | 1 | 功率器件 + 信号,**D± 走这层,以 L2 为参考面** | | L2 | Inner1-GND | 15 | **完整地平面,不许割断**(§10.1)| | L3 | Inner2-PWR | 16 | 12V 母线 + 5V + 3V3 + 五路输出,**分割灌铜** | | L4 | Bottom Layer | 2 | 控制信号 + ESP32 | ## 板框 160 × 125 mm,四角 R5(圆心正好落在四个 M3 定位孔的中心 (5,5)/(155,5)/(5,120)/(155,120))。 ⚠️ **API 枚举不到那四段圆弧**:`pcb_PrimitiveArc.getAll()` 和 `getAllPrimitiveId()` 都返回 0,layer 11 上全工程只有 4 条直线(端点恰好是 R5 的切点)。 但渲染上角是实实在在的圆弧、闭合的。所以这里**不去读板框,按几何自己造多边形**。 (打样前记得用 Gerber 预览复核一次板框闭合。) ## 多边形不闭合就建不出来,而且 `create()` 成功了也会抛 ⚠️⚠️ 两个坑叠在一起,实测(2026-09-03): 1. **`TPCB_PolygonSourceArray` 必须显式闭合** —— 末尾要把首点再写一遍。 文档写着「如果首尾不重合将会自动重合」,**对铺铜边框不成立**: 不闭合时 `pcb_PrimitivePour.create()` 直接不建,板上一块铜面都不多。 (`board_poly()` 一直能用,是因为它最后那段圆弧正好回到起点。) 2. **`create()` 抛异常不等于失败。** 闭合的多边形建得出来, 但调用照样抛 `错误:无法创建覆铜边框图元,可能是传入的参数不正确。` —— 所以**返回值和 try/catch 都不能当判据**,只能建完 `getAll()` 按名字核对。 顺带一提:**铺铜名字会被 EasyEDA 转成大写**,比对时要 `toUpperCase()`。 一次分不清这两个的排查过程:不闭合的矩形(PA-OPEN)建完 `getAll()` 数量不变, 闭合的(PB-CLOSE)数量 +1 —— 两者都抛了一模一样的异常。 ## 填充只能点菜单,`rebuildCopperRegion()` 是坏的 ⚠️ `pcb_PrimitivePour.create()` 建出来的只是**铺铜边框**(`nPour` 会 +1), 里头一片铜都没有,`pcb_PrimitivePoured.getAll()` 仍是 0,网络也不算连通。 `IPCB_PrimitivePour.rebuildCopperRegion()`(文档标 BETA)**必然抛** `TypeError: Cannot read properties of undefined (reading 'length')`,约 157 ms。 四种写法都试过、都一样:`getAll()` 拿回来的对象、`toAsync()/done()` 异步式、 `createPolygon` 建的、`createComplexPolygon` 建的。 唯一能用的路子是 GUI:**工具 → 铺铜管理器... → 重建所有 → 确认**。 本文件的 `--push` 已经把这一串用 React 的 `onClick` 打进去了 (菜单项是 React 元素,用 `__reactProps$*.onClick`;`重建所有` 是原生 `