tools/epro2/kicad: fix two --all crashes found running the other 4 Pro projects
Running the new --all on the remaining 4 Pro projects (X86 motherboard, 220V power supply, Taishan Pi, Liangshan Pi) surfaced two crash modes not covered by ESP-VoCat: 1. Odd inner-layer count → KiCad rejects the file at load with "3 is not a valid layer count". The 220V power boards have one used inner SIGNAL layer (3 copper total: F.Cu / In1.Cu / B.Cu), but KiCad requires an even copper count. Fixed pcb_writer to pad with one empty inner layer when the inner count is odd, so the total stays even (2, 4, 6, ...). 2. Two BOARDs sharing the same META.title — twin "显示板" boards in the 220V power project — landed in the same project directory and the second silently overwrote the first's .kicad_sch / .kicad_pcb / .kicad_pro. Fixed --all to detect title collisions and suffix every colliding basename with the BOARD uuid prefix (so both '显示板' boards become '显示板_52e8cc76' and '显示板_55d32906' rather than one quietly winning). 71 → 73 unit tests pass (test_odd_inner_signal_count_padded_to_even_total + test_duplicate_board_titles_get_distinct_basenames). Tangentially noted while running this: Taishan Pi and Liangshan Pi are Pro 2.x JSON, not EPRO2 streams — our replay layer reads the files but doesn't decode docType, so SCH/PCB grouping returns nothing. Pro 2.x needs a separate writer; out of scope for this commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -221,10 +221,26 @@ def _convert_all_projects(
|
||||
|
||||
page_groups = _group_pages_by_sch(proj) # SCH-uuid → [page-uuid, ...]
|
||||
|
||||
# Resolve basename collisions: two distinct BOARDs with the same title
|
||||
# (seen on the 220V power project — twin "显示板" boards) would otherwise
|
||||
# share a directory and overwrite each other's files. When the same
|
||||
# basename appears multiple times, suffix EVERY occurrence with the
|
||||
# board uuid prefix so each project dir stays unambiguous (instead of
|
||||
# quietly handing one of them the unsuffixed name).
|
||||
base_counts: dict[str, int] = {}
|
||||
for board_id, slot in boards.items():
|
||||
title = slot["title"] or board_id[:12]
|
||||
base_counts[_project_basename(title)] = base_counts.get(_project_basename(title), 0) + 1
|
||||
basenames: dict[str, str] = {}
|
||||
for board_id, slot in boards.items():
|
||||
title = slot["title"] or board_id[:12]
|
||||
base = _project_basename(title)
|
||||
basenames[board_id] = base if base_counts[base] == 1 else f"{base}_{board_id[:8]}"
|
||||
|
||||
n = 0
|
||||
for board_id, slot in boards.items():
|
||||
title = slot["title"] or board_id[:12]
|
||||
basename = _project_basename(title)
|
||||
basename = basenames[board_id]
|
||||
proj_dir = out_dir / basename
|
||||
proj_dir.mkdir(parents=True, exist_ok=True)
|
||||
sch_doc = slot["sch"]
|
||||
|
||||
Reference in New Issue
Block a user