easyeda / easyeda/pro-api-sdk

V3.2.186: sys_Tool.netlistComparison 使用 PCB document UUID 时全部网络解析为空,File↔File 却 0 diff,导致 DRC Netlist Error 假阳性

Open
#39 1 comment 0 reactions 0 assignees View on GitHub
bug seems like AI
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.