# -*- coding: utf-8 -*- u"""L1 `+12V` 主块的**逐 y 水平断面**核算(§6.4 要 ≥ 8.0 mm)。 /c/Python314/python .claude/r2/l1_section.py # 核 pcb_base.PD_L1 现状 /c/Python314/python .claude/r2/l1_section.py --cfg # 核 _base_window.json 里的 pd_l1_extra 主块 x 0.5~27.8(宽 27.30),电流南北流 ⇒ 断面是水平线,线上被走廊占掉的 x 跨度要扣掉。 横带(沿 x 长)很贵、竖带(沿 y 长)几乎免费 —— 旧注释「一根 0.15 的线占约 0.5」说的就是竖线。 槽指头在 x ≥ 27.5,走廊 x 一律 ≤ 27.5 ⇒ 天然不碰任何一槽的供电路径。 """ import io import json import os import sys sys.stdout.reconfigure(encoding='utf-8') HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.dirname(HERE)) sys.path.insert(0, HERE) import pcb_base as B # noqa: E402 MIN_SECTION = 8.0 MAIN = B.l1_12v_rects()[0] WIDTH = MAIN[2] - MAIN[0] def check(corridors, step=0.05): worst = (1e9, None) y = MAIN[1] while y <= MAIN[3]: iv = [] for _n, r in corridors: if r[1] - 1e-9 <= y <= r[3] + 1e-9: iv.append((max(r[0], MAIN[0]), min(r[2], MAIN[2]))) iv.sort() used, spans = 0.0, [] for a, b in iv: if b <= a: continue if spans and a <= spans[-1][1]: spans[-1] = (spans[-1][0], max(spans[-1][1], b)) else: spans.append((a, b)) for a, b in spans: used += b - a left = WIDTH - used if left < worst[0]: worst = (left, y) y += step return worst def main(): cor = [(n, r) for n, r in B.PD_L1 if n.startswith('FAN')] if '--cfg' in sys.argv: cfg = json.load(io.open(os.path.join(HERE, '_base_window.json'), encoding='utf-8')) cor = [(n, tuple(r)) for n, r in (cfg.get('pd_l1_extra') or [])] print(u'主块 x %.2f~%.2f(宽 %.2f);走廊 %d 条' % (MAIN[0], MAIN[2], WIDTH, len(cor))) for n, r in cor: kind = u'横带' if (r[2] - r[0]) >= (r[3] - r[1]) else u'竖带' print(u' %-14s (%6.2f, %6.2f, %6.2f, %6.2f) %5.2f×%5.2f %s' % (n, r[0], r[1], r[2], r[3], r[2] - r[0], r[3] - r[1], kind)) left, y = check(cor) ok = left >= MIN_SECTION print(u'%s 逐 y 最窄断面 %.2f mm(y=%.2f),判据 ≥ %.1f' % (u'[OK]' if ok else u'[X]', left, y, MIN_SECTION)) return 0 if ok else 1 if __name__ == '__main__': sys.exit(main())