R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+68
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python3
|
||||
"""清点两块板引用了哪些符号,以及位号前缀 / netflag / netport 的分布。"""
|
||||
import json, os, sys, collections
|
||||
ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "eda_src")
|
||||
|
||||
|
||||
def _prefix(d):
|
||||
"""位号前缀 = 开头连续的字母。R9A/Rs6/C106 -> R/Rs/C"""
|
||||
i = 0
|
||||
while i < len(d) and d[i].isalpha():
|
||||
i += 1
|
||||
return d[:i] or d
|
||||
|
||||
|
||||
def pages(board):
|
||||
tree = json.load(open(os.path.join(ROOT, "_tree.json"), encoding="utf-8"))
|
||||
return next(x for x in tree["boards"] if x["board"] == board)["pages"]
|
||||
|
||||
|
||||
def comps(board):
|
||||
for p in pages(board):
|
||||
g = json.load(open(os.path.join(ROOT, board, p["name"] + ".geom.json"), encoding="utf-8"))
|
||||
for c in (g["prims"]["Component"] or []):
|
||||
c["__page"] = p["name"]; c["__board"] = board
|
||||
yield c
|
||||
|
||||
|
||||
def main():
|
||||
sym = {} # uuid -> {name, refs:set, count}
|
||||
flag = collections.Counter() # (symbolName, net)
|
||||
port = collections.Counter()
|
||||
for b in ("Board1", "Board2"):
|
||||
for c in comps(b):
|
||||
t = c["ComponentType"]
|
||||
if t == "part":
|
||||
s = c.get("Symbol") or {}
|
||||
u = s.get("uuid")
|
||||
e = sym.setdefault(u, {"name": s.get("name"), "refs": set(), "n": 0})
|
||||
d = c.get("Designator") or ""
|
||||
e["refs"].add(_prefix(d))
|
||||
e["n"] += 1
|
||||
elif t == "netflag":
|
||||
flag[((c.get("Component") or {}).get("name"), c.get("Net"))] += 1
|
||||
elif t == "netport":
|
||||
port[((c.get("Component") or {}).get("name"),)] += 1
|
||||
print(f"part 引用的不同符号: {len(sym)}")
|
||||
multi = {u: e for u, e in sym.items() if len(e["refs"]) > 1}
|
||||
if multi:
|
||||
print(f" ⚠ 前缀不唯一的符号 {len(multi)}:")
|
||||
for u, e in list(multi.items())[:6]:
|
||||
print(f" {e['name']:28s} {sorted(e['refs'])}")
|
||||
fs = collections.Counter(k[0] for k in flag)
|
||||
print(f"\nnetflag 图形种类 {len(fs)}: {dict(fs)}")
|
||||
nets = sorted({k[1] for k in flag})
|
||||
print(f"netflag 网络 {len(nets)}: {nets}")
|
||||
conflict = collections.defaultdict(set)
|
||||
for (s, n), _ in flag.items():
|
||||
conflict[n].add(s)
|
||||
bad = {n: v for n, v in conflict.items() if len(v) > 1}
|
||||
print(f"同一网络用了多种 netflag 图形: {bad if bad else '无'}")
|
||||
print(f"\nnetport 图形种类: {dict(port)}")
|
||||
json.dump({u: {"name": e["name"], "refs": sorted(e["refs"]), "n": e["n"]} for u, e in sym.items()},
|
||||
open(os.path.join(ROOT, "_symbols_used.json"), "w", encoding="utf-8"),
|
||||
ensure_ascii=False, indent=1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
在新工单中引用
屏蔽一个用户