app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← Commit history
Update 4 file(s)
4 files changed
+39−16
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.201+0.9.202
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.201",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.201/adom-bridge-kicad-v0.9.201.zip",- "sha256": "ccd4b1259f274c7c23d843d3477f905317a264ee90173cf6c692a64cefd3873f",- "size": 471341,+ "version": "0.9.202",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.202/adom-bridge-kicad-v0.9.202.zip",+ "sha256": "da428b6cb0ecff185fa43e6918487362371f8b0039d3abaac2af3783755f13fe",+ "size": 471755, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-20T09:55:00Z",+ "released_at": "2026-08-20T11:05:00Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.201",+ "version": "0.9.202", "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", "homepage": "https://wiki.adom.inc/adom/adom-bridge", "author": "Adom Inc.",
handlers/show.py+32−9@@ -142,7 +142,28 @@ def _capture_evidence(win, label: str) -> dict | None: if not hwnd: return None from handlers.kicad_ui import _screenshot_hwnd- shot = _screenshot_hwnd(hwnd, label=label)+ # WAIT FOR THE CANVAS TO PAINT before calling this evidence.+ #+ # 0.9.202. The blank thumbnails were not a GPU problem and not a capture+ # problem - they were a TIMING problem, and mine. A show_* verb confirms+ # the window title and we photographed it immediately, while KiCad was+ # still loading libraries (the status bar literally reads "Loading+ # Footprint Li..."). The GL canvas had not painted yet, so the shot+ # showed correct chrome around an empty rectangle. Proof: the same part,+ # same box, same zoom (Z 30.61) that captured blank photographs fully+ # drawn once KiCad settles.+ #+ # So poll rather than assume. Each attempt is a real capture, and the+ # canvas check tells us whether it is worth keeping.+ shot = None+ for attempt in range(8):+ shot = _screenshot_hwnd(hwnd, label=label)+ if not shot or not shot.get("success"):+ return None+ c = shot.get("canvas") or {}+ if not c.get("checked") or c.get("rendered"):+ break+ time.sleep(1.0) if not shot or not shot.get("success"): return None canvas = shot.get("canvas") or {}@@ -163,16 +184,18 @@ def _capture_evidence(win, label: str) -> dict | None: # speak for the verb. if canvas.get("checked"): ev["canvasRendered"] = bool(canvas.get("rendered"))+ ev["canvasWaitedSec"] = attempt if not canvas.get("rendered"): ev["_canvasHint"] = (- "The window is correct but its drawing canvas came back BLANK "- f"({canvas.get('distinctColors')} distinct colour(s)). This is not a "- "capture fault - KiCad draws the canvas through OpenGL, which "- "produces no picture on a host with no usable GPU or no active "- "console session (a locked or disconnected desktop does it too). "- "Treat this thumbnail as proof of the WINDOW, not of the part. "- "kicad_enable_software_opengl is the last-resort fix on a box "- "that genuinely has no GPU."+ "The window is correct but its drawing canvas is still BLANK "+ f"({canvas.get('distinctColors')} distinct colour(s)) after waiting "+ f"{attempt}s for it to paint. Usually this just means KiCad is still "+ "loading libraries - check the status bar in the image. If it never "+ "paints, the canvas is an OpenGL surface and yields no picture on a "+ "host with no usable GPU or no active console session; "+ "kicad_enable_software_opengl is the last-resort fix there. "+ "Either way, treat this thumbnail as proof of the WINDOW, not of "+ "the part." ) return ev except Exception: