import sys, time sys.path.insert(0,'.') from gerb import * import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import matplotlib.patheffects as pe base="../in/03-Architecture-Hardware/kicad/production" CU="#C8A05A"; CU2="#B8894A"; SILK="#F4F4F4"; BOARD="#1E3A2E"; EDGE="#333333" INDIGO="#2C3C5B"; CYAN="#51F3DA"; TEAL="#17A08C" def board_fig(b, prod, title, blocks, out, dpi=200): t0=time.time() cu,mac=parse(f"{base}/{prod}/hbox-watchdog-{b}-F_Cu.gtl") silk,mac2=parse(f"{base}/{prod}/hbox-watchdog-{b}-F_Silkscreen.gto") mask,mac3=parse(f"{base}/{prod}/hbox-watchdog-{b}-F_Mask.gts") g_cu=geoms_of(cu,mac); g_silk=geoms_of(silk,mac2) fig,ax=plt.subplots(figsize=(14,10.2)) ax.add_patch(Rectangle((60.19,40.32),140,100,facecolor=BOARD,edgecolor=EDGE,lw=1.5,zorder=0)) draw_geoms(ax,g_cu,CU,alpha=0.95,bg=BOARD,zorder=1) draw_geoms(ax,g_silk,SILK,alpha=0.9,bg=BOARD,zorder=2) for blk in blocks: x0,y0,x1,y1,label,col=blk[:6]; pos=blk[6] if len(blk)>6 else "top" ax.add_patch(FancyBboxPatch((x0,y0),x1-x0,y1-y0,boxstyle="round,pad=0.3,rounding_size=1.2",fill=False,edgecolor=col,lw=2.2,zorder=5)) if pos=="top": tx,ty,va=x0+0.8,y0+0.9,"top" else: tx,ty,va=x0+0.8,y1-0.9,"bottom" t=ax.text(tx,ty,label,color="white",fontsize=9.5,fontweight="bold",va=va,ha="left",zorder=6, bbox=dict(boxstyle="round,pad=0.25",facecolor=col,edgecolor="none",alpha=0.92)) ax.set_xlim(58,202); ax.set_ylim(142,38.5) # y down like KiCad ax.set_aspect("equal"); ax.axis("off") ax.set_title(title,color=INDIGO,fontsize=15,fontweight="bold",loc="left") fig.tight_layout(); fig.savefig(out,dpi=dpi,facecolor="white"); plt.close(fig) print(out, f"{time.time()-t0:.1f}s") common=[ (147,104,167,122,"U6 LTC4040 · L6 · RS1 · Q7 — respaldo y carga","#E9533A"), (131,104,147,122,"U7 AP64350 · L7 — riel 3.3 V del módem","#F2A93B","bottom"), (170,76,200,92,"J7/J8 zócalo XBee — 4G NTRIP Master","#9B59B6"), (112,52,134,74,"U16 STM32F411 · Y3/Y4","#2EA3F2"), (62,46,104,66,"U11 W5500 · J10 RJ45 — Ethernet","#3BB273"), (150,62,163,108,"U10 SC16IS752 · U14 RS-485 · U15 RS-232 · U13","#3BB273"), (131,124,158,136,"P15 RS-485 · P16 RS-232","#3BB273"), (62,88,138,135,"MOD1 simpleRTK2B Pro (cara inferior)","#BBBBBB"), (150,50,166,64,"K1 Modo B","#F2A93B"), (172,128,194,139,"P1 GX16 (24 V · GND · IGN)","#E9533A"), (86,41,100,50,"U26 SC7A20","#2EA3F2"), ] v56=common+[(182,52,198,74,"U2 · L2 buck del ventilador (24 V)","#E9533A"),(176,114,200,127,"D10 · Q10 · C10 — entrada 24 V","#E9533A"),(101,41,122,50,"P2 5 V (SD-15B) · P10","#E9533A")] v57=common+[(176,45,199,74,"U25 TPS54360B · L22 · D34 · C149/C150 — fuente 9–32 V","#E9533A"),(173,114,200,127,"F2 · D10 · Q10 · C10 — entrada 9–32 V","#E9533A")] board_fig("v5","HBOX_v5_Rev6_PROD","EinarBoard V5.6 — cara superior (Gerber HBOX_v5_Rev6_PROD, 22-oct-2026)",v56,"fig/fig-v56-top.png") board_fig("v57","HBOX_v5_Rev7_PROD","EinarBoard V5.7 — cara superior (Gerber HBOX_v5_Rev7_PROD, 22-oct-2026)",v57,"fig/fig-v57-top.png")