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
+40−11
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.212+0.9.213
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.212",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.212/adom-bridge-kicad-v0.9.212.zip",- "sha256": "5f73136782c85ddbbf12e5bab254b6c345f663d9b40b2d1733efc282baaf1b16",- "size": 481679,+ "version": "0.9.213",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.213/adom-bridge-kicad-v0.9.213.zip",+ "sha256": "ae143664eab5074d0eef9c509936f08f0283f1de88f8e445a7a280897befb10b",+ "size": 482152, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-20T15:45:00Z",+ "released_at": "2026-08-20T15:55: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.212",+ "version": "0.9.213", "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.",
plugin_payload/adom_bridge.py+33−4@@ -2825,10 +2825,39 @@ def _ui_probe_footprint(library: str, footprint: str) -> dict: import pcbnew # available only inside a KiCad process out = {"library": library, "footprint": footprint}- try:- tbl = pcbnew.GetGlobalFootprintTable()- except Exception as e:- out["error"] = f"no footprint table: {type(e).__name__}: {e}"++ # KiCad moves this API between versions, and guessing one name gave a dead+ # end on 10.0 ("module 'pcbnew' has no attribute 'GetGlobalFootprintTable'").+ # Try the known spellings in order, record which one answered, and if none+ # do, report the candidate attribute names this build actually exposes so+ # the next attempt is informed rather than another guess.+ tbl, via, errs = None, None, []+ for name, getter in (+ ("GetGlobalFootprintTable", lambda: pcbnew.GetGlobalFootprintTable()),+ ("FP_LIB_TABLE.GetGlobalLibTable", lambda: pcbnew.FP_LIB_TABLE.GetGlobalLibTable()),+ ("GetFootprintLibraryTable", lambda: pcbnew.GetFootprintLibraryTable()),+ ("Frame.Prj.PcbFootprintLibs", lambda: pcbnew.GetBoard().GetProject().PcbFootprintLibs()),+ ):+ try:+ tbl = getter()+ if tbl is not None:+ via = name+ break+ except Exception as e:+ errs.append(f"{name}: {type(e).__name__}: {e}")+ out["apiVia"] = via+ if tbl is None:+ out["apiTried"] = errs+ try:+ out["apiCandidates"] = sorted(+ n for n in dir(pcbnew)+ if ("footprintlib" in n.lower() or "fp_lib" in n.lower()+ or "footprinttable" in n.lower()))[:20]+ except Exception:+ pass+ out["error"] = "could not reach KiCad's footprint library table on this build"+ out["verdict"] = ("PROBE UNAVAILABLE on this KiCad build - see apiTried/apiCandidates. "+ "This says nothing about the footprint itself.") return out try: