R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -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)")
|
||||
在新工单中引用
屏蔽一个用户