V3.2.186: sys_Tool.netlistComparison 使用 PCB document UUID 时全部网络解析为空,File↔File 却 0 diff,导致 DRC Netlist Error 假阳性
- Dominant language
- TypeScript
- Stars
- 64
- Forks
- 26
- PR merge metrics
- No merged PRs in 30d
Description
## 环境
- EasyEDA Pro `3.2.186`(macOS,Electron 36.3.2 / Chrome 136)
- 扩展内直接调用官方 `eda.*` API
- 自动化调用层:easyeda-agent `1.4.8`(CLI / daemon / connector 全部同版,仅作为 API 调用与结果记录 harness)
- 2 层 PCB,10 个器件、60 个 schematic pin / PCB pad、6 个有名网络
## 现象
原生 PCB DRC 持续报告:
```text
Netlist Error
PCB and schematic netlist does not match.
Rule: Import Changes
```
进一步用官方 `eda.sys_Tool.netlistComparison()` 做 A/B 对照后发现,问题不是实际 SCH/PCB 网表不一致,而是 **PCB document UUID 作为比较输入时,PCB 侧所有网络成员都会被解析成空数组**。
同一块 PCB:
- `eda.pcb_Net.getNetlist()` 能读取完整网表;
- `eda.pcb_ManufactureData.getNetlistFile()` 导出的 `.enet` 完整;
- 60 个 SCH pin ↔ 60 个 PCB pad 的 `pinNumber/padNumber + net` 逐项一致;
- SCH `.enet` ↔ PCB `.enet` 用 `netlistComparison(File, File)` 比较为 **0 diff**;
- 但只要 PCB 一侧改为 **PCB document UUID**,同一个 `netlistComparison` 就返回全部 6 个网络不一致,且 PCB 一侧都是 `[]`。
## 最小复现 / A-B 对照
工程中有一个 Board,正确绑定一个 schematic 和一个 PCB;先分别获取两边制造网表文件:
```ts
// 在对应文档前台时分别获取
const schFile = await eda.sch_ManufactureData.getNetlistFile('sch.enet');
const pcbFile = await eda.pcb_ManufactureData.getNetlistFile('pcb.enet');
```
已知:
```text
schematicUuid = 9512daf99412dc4e
pcbUuid = 6143c28f343de7bf
```
### 1. File ↔ File:正确
```ts
await eda.sys_Tool.netlistComparison(schFile, pcbFile)
```
结果:
```json
[]
```
即 `count = 0`。
### 2. schematic UUID ↔ SCH File:正确
```ts
await eda.sys_Tool.netlistComparison(schematicUuid, schFile)
```
结果同样为:
```json
[]
```
### 3. PCB UUID ↔ PCB File:错误
```ts
await eda.sys_Tool.netlistComparison(pcbUuid, pcbFile)
```
结果为 6 条 NET 差异;**UUID 一侧全部为空**。例如:
```json
{
"net1": [],
"net2": ["C1.2", "C2.2", "J1.21", "R1.1", "SW1.2"],
"object": "'5V_SW'",
"type": "NET"
}
```
其余网络同样如此:
```text
5V_SW UUID side = []
PWR_LED_A UUID side = []
VIN_5V UUID side = []
VIN_FUSED UUID side = []
VIN_PROTECTED UUID side = []
GND UUID side = []
```
### 4. schematic UUID ↔ PCB UUID:复现 DRC 的假差异
```ts
await eda.sys_Tool.netlistComparison(schematicUuid, pcbUuid)
```
返回 6 条差异,例如:
```json
{
"net1": ["C1.2", "C2.2", "J1.21", "R1.1", "SW1.2"],
"net2": [],
"object": "'5V_SW'",
"type": "NET"
}
```
与原生 PCB DRC 的 `Import Changes / Netlist Error` 行为一致。
## 反证:PCB 网表数据本身并不为空
当前 PCB 上:
```text
components = 10
pads = 60
nets = 6
tracks = 17
```
`eda.pcb_Net.getNetlist()` 可读到完整的 JLCEDA 2.0.0 网表(10 个 components),`eda.pcb_ManufactureData.getNetlistFile()` 也导出完整 `.enet`。
将 SCH/PCB `.enet` 直接传给同一个 `eda.sys_Tool.netlistComparison(File, File)` 时为 0 diff,因此并不是:
- pin number ↔ pad number 不匹配;
- pad net 丢失;
- Board 绑定错 schematic;
- PCB 制造网表为空。
## 已排除的状态/缓存因素
已经做过以下测试,问题仍稳定复现:
1. `importChanges()` 再同步;
2. 保存 + reload schematic / PCB;
3. Board 重新绑定到同一正确 schematic UUID + PCB UUID;
4. 完整退出 EasyEDA Pro 后重新启动;
5. 重启后重新确认只有一个新窗口,重新运行上述 UUID/File A-B 对照;
6. `eda.pcb_Net.getNetlist()` 读出的 PCB 网表仍完整,但 `netlistComparison(pcbUuid, pcbFile)` 的 UUID 一侧仍为空。
因此看起来不是旧窗口或临时缓存,而是 **`SYS_Tool.netlistComparison` 在解析 PCB document UUID 输入时使用的 document-level netlist view 与 `pcb_Net` / `pcb_ManufactureData` 状态发生了分叉**。
## 期望
对于同一个 PCB 文档:
```ts
netlistComparison(pcbUuid, pcbFile)
```
应返回 0 diff;至少应与:
```ts
netlistComparison(pcbFile, pcbFile)
```
以及 `pcb_Net.getNetlist()` / `pcb_ManufactureData.getNetlistFile()` 所描述的 PCB 网络一致。
原生 DRC 的 `Import Changes / Netlist Error` 也不应因为 PCB UUID resolver 返回空网络而产生假阳性。
## 建议排查点
建议检查 `SYS_Tool.netlistComparison()` 对 **PCB document UUID** 的内部解析路径:它似乎没有读取当前 PCB pad/net 或当前 PCB netlist,而 schematic UUID 路径是正常的。
如果该比较器和原生 DRC `Import Changes` 共用同一 document-netlist resolver,这也可以解释为什么 DRC 与 UUID comparison 同时出现完全相同的假差异。
## 相关 Issue
- #33 已讨论“DRC `Netlist Error` 缺少结构化差异导致 headless 流程难以定位”;本 Issue 是进一步定位出的独立问题:**官方 `netlistComparison` 已经能给结构化差异,但 PCB UUID 输入本身解析错误,与 File 输入结果矛盾。**
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.