R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-10-04 19:24:45 +08:00
共同撰写人 Claude Opus 5.5
父节点 cd01640c40
当前提交 cf7cc9cf90
共修改 759 个文件,包含 76962 行新增和 5299 行删除
+52
查看文件
@@ -0,0 +1,52 @@
#!/usr/bin/env python3
"""从页面源码 DSL 里取出每个元件的**位号 / 值标签的实际坐标**。
为什么需要:API 的 sch_PrimitiveAttribute.getAll() 返回空(属性挂在元件上,不是独立图元),
几何提取里拿不到标签位置。按固定偏移摆会在密集区叠成一团 —— 2026-09-07 第一版就是这样,
P1B-5V 上 C731/C733 的位号糊在一起。
DSL 记录形如 {"type":"ATTR","ticket":N,"id":"..."}||{...,"parentId":"<元件 PrimitiveId>",
"key":"Designator","x":575,"y":-620,...}|
注意 **DSL 的 Y = −API 的 Y**(实测:元件 API (600,600) 在 DSL 里是 (600,-600))。
parentId 与 API 的 PrimitiveId 同值,可以直接对上。
"""
import json, os
ROOT = os.path.dirname(os.path.abspath(__file__))
SRC = os.path.join(ROOT, "eda_src")
def page_labels(board, page):
"""-> {componentPrimitiveId: {'Designator': (x, y, visible), 'Name': (x, y, visible)}}
坐标已转成 API 口径(Y 向上)。"""
path = os.path.join(SRC, board, page + ".esrc")
out = {}
for line in open(path, encoding="utf-8"):
line = line.strip()
if not line.startswith('{"type":"ATTR"'):
continue
_, _, rest = line.partition("||")
try:
b = json.loads(rest.rstrip("|"))
except Exception:
continue
k = b.get("key")
if k not in ("Designator", "Name") or b.get("x") is None:
continue
pid = b.get("parentId")
if not pid:
continue
out.setdefault(pid, {})[k] = (b["x"], -b["y"], bool(b.get("valueVisible")))
return out
if __name__ == "__main__":
tree = json.load(open(os.path.join(SRC, "_tree.json"), encoding="utf-8"))
tot = 0
for b in tree["boards"]:
for p in b["pages"]:
d = page_labels(b["board"], p["name"])
n = sum(1 for v in d.values() if "Designator" in v)
tot += n
print(f" {b['board']}/{p['name']:12s} 带位号标签的元件 {n}")
print(f"合计 {tot}(应为 508)")