app
adom-desktop-altium-bridge
Public Unreviewedby barrett-land
Adom Desktop bridge for Altium Designer — build and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob, by driving Altium via DelphiScript.
← Commit history
Publish 0.0.45
11 files changed
+119−24
README.md+2−2@@ -11,7 +11,7 @@ verbs. ```bash adom-wiki pkg install barrett-land/adom-desktop-altium-bridge # the skill, in the container-adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.44/altium-bridge-manifest.json"}'+adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.45/altium-bridge-manifest.json"}' adom-desktop --ai-thread "<your thread>" altium_ping '{}' ``` @@ -23,7 +23,7 @@ adom-desktop --ai-thread "<your thread>" altium_ping '{}' | Inspect | `altium_addin_ping` `altium_list_docs` `altium_list_symbols` `altium_read_symbol` `altium_read_params` | | Author | `altium_build_symbol` `altium_build_footprint` `altium_add_body` `altium_create_resistor` `altium_create_and_attach` `altium_install_library` | | Clone / copy | `altium_clone_symbol` `altium_copy_sch_component` `altium_copy_footprint` `altium_import_part` |-| Edit | `altium_add_component` `altium_set_visibility` `altium_rename_component` `altium_rename_footprint` `altium_remove_component` |+| Edit | `altium_add_component` `altium_set_visibility` `altium_set_text_style` `altium_rename_component` `altium_rename_footprint` `altium_remove_component` | | Package | `altium_compile_intlib` `altium_extract_intlib` `altium_cleanup_libs` `altium_close_doc` | | Batch output | `altium_export_step` `altium_run_outjob` | | Extension | `altium_install_extension` (installs the in-process .NET server) |
SKILL.md+23−2@@ -12,7 +12,7 @@ forwards work into the running GUI as DelphiScript via `X2.EXE`. ## Install ```bash-adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.44/altium-bridge-manifest.json"}'+adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.45/altium-bridge-manifest.json"}' adom-desktop --ai-thread "<your thread>" altium_ping '{}' # -> {"altiumInstalled": true, "version": "..."} ``` @@ -47,7 +47,28 @@ commands** — see `altium_import_part`, which does a whole part import in a sin `altium_import_part` (batched, one round-trip) **Edit:** `altium_add_component` (LCSC + identity params) · `altium_set_visibility` ·-`altium_rename_component` · `altium_rename_footprint` · `altium_remove_component`+`altium_set_text_style` · `altium_rename_component` · `altium_rename_footprint` ·+`altium_remove_component`++### `altium_set_text_style`++Normalises font and colour across a component's designator, comment and every parameter.++```bash+adom-desktop --ai-thread "<thread>" altium_set_text_style '{+ "schlib": "...\\Resistors.SchLib", "component": "R_10k_0402"+}'+```++Defaults to Altium's own: `fontid=1` (Times New Roman 10) and `color=8388608`. Altium stores+colour as **BGR**, so that is `$800000` = navy RGB(0,0,128). `"component": "*"` restyles the whole+library; the operation is idempotent.++Mainly this repairs KiCad imports: the importer appends its *own* font to the library table+(measured: Yu Gothic UI Light 8) and keeps KiCad's field colour `8650884`, so imported parts render+unlike every hand-made part beside them. `fontid=1` holds because Altium seeds a new library's font+table with its default face at index 1 — verify with the `FontName<n>`/`Size<n>` keys in the+`FileHeader` stream before relying on it elsewhere. **Package:** `altium_compile_intlib` · `altium_extract_intlib` · `altium_cleanup_libs` · `altium_close_doc`
altium-bridge-manifest.json+3−3@@ -1,3 +1,3 @@-{ "manifest_version": 1, "name": "altium", "version": "0.0.44",- "url": "https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.44/altium-bridge-v0.0.44.zip",- "sha256": "2ac7ee28448152cb582db2aaaab7f5855cefb58a090c402329d7a61e64c111dc", "size": 40398, "released_at": "2026-08-12T16:39:56Z" }+{ "manifest_version": 1, "name": "altium", "version": "0.0.45",+ "url": "https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.45/altium-bridge-v0.0.45.zip",+ "sha256": "cfe5e5afae1b6bbdbf87900a70ee63f3442fb2959d08dd04bb5db6eaba179f1e", "size": 41254, "released_at": "2026-08-12T17:17:09Z" }
altium-bridge-v0.0.45.zipadded⋯ 1 unchanged line ⋯
bridge-src/BRIDGE_VERSION+1−1@@ -1 +1 @@-0.0.44+0.0.45
bridge-src/__pycache__/server.cpython-312.pyc⋯ 1 unchanged line ⋯
bridge-src/addin/AdomAltium/AdomAltium.pas+76−6@@ -1341,14 +1341,15 @@ end; is placed on a schematic. ---- } procedure CmdSetVisibility; var- SchPath, CompRef, Vis, SavedStr : String;+ SchPath, CompRef, Vis, SavedStr, PinHide, PinShow : String; Lib : ISch_Lib; Cmp : ISch_Component; It : ISch_Iterator; P : ISch_Parameter;- visList : TStringList;+ Pin : ISch_Pin;+ visList, hideList, showList : TStringList; SavedOK : Boolean;- shown, hidden : Integer;+ shown, hidden, pinsHidden, pinsShown : Integer; begin SchPath := Req.Values['schlib']; CompRef := Req.Values['component'];@@ -1363,7 +1364,7 @@ begin visList := TStringList.Create; visList.CommaText := Vis; { case-insensitive IndexOf by default }- shown := 0; hidden := 0;+ shown := 0; hidden := 0; pinsHidden := 0; pinsShown := 0; try GStage := 'set parameter visibility'; It := Cmp.SchIterator_Create;@@ -1385,6 +1386,45 @@ begin GStage := 'comment visibility'; if visList.IndexOf('Comment') < 0 then Cmp.Comment.IsHidden := True else Cmp.Comment.IsHidden := False;++ { Optional: hide pins by DESIGNATOR (pin number), comma list in 'hidepins'.+ This exists for KiCad imports. KiCad stacks the repeated power pins of an IC+ at one location and hides all but one -- three VSS pins on an STM32, say --+ but Altium's importer does not understand (hide yes) on a pin, logging only+ "Unknown child hide of pin". Every stacked pin therefore arrives VISIBLE and+ their numbers render on top of each other. Hiding the same ones KiCad hid+ restores the intended drawing; the pins stay electrically present either way.+ 'showpins' forces pins back on. }+ PinHide := Req.Values['hidepins'];+ PinShow := Req.Values['showpins'];+ if (PinHide <> '') or (PinShow <> '') then+ begin+ GStage := 'pin visibility';+ hideList := TStringList.Create;+ showList := TStringList.Create;+ try+ hideList.CommaText := PinHide;+ showList.CommaText := PinShow;+ It := Cmp.SchIterator_Create;+ It.AddFilter_ObjectSet(MkSet(ePin));+ try+ Pin := It.FirstSchObject;+ while Pin <> nil do+ begin+ if hideList.IndexOf(Pin.Designator) >= 0 then+ begin Pin.IsHidden := True; Inc(pinsHidden); end+ else if showList.IndexOf(Pin.Designator) >= 0 then+ begin Pin.IsHidden := False; Inc(pinsShown); end;+ Pin := It.NextSchObject;+ end;+ finally+ Cmp.SchIterator_Destroy(It);+ end;+ finally+ hideList.Free;+ showList.Free;+ end;+ end; finally visList.Free; end;@@ -1396,6 +1436,8 @@ begin if SavedOK then SavedStr := 'true' else SavedStr := 'false'; RespOk(', "component": ' + JStr(Cmp.LibReference) + ', "visible": ' + JStr(Vis) + ', "shown": ' + IntToStr(shown) + ', "hidden": ' + IntToStr(hidden) ++ ', "pinsHidden": ' + IntToStr(pinsHidden) ++ ', "pinsShown": ' + IntToStr(pinsShown) + ', "saved": ' + SavedStr); end; @@ -1416,11 +1458,12 @@ end; procedure CmdSetTextStyle; var SchPath, CompRef, SavedStr : String;- FontId, Colr, nTxt, nCmp : Integer;+ FontId, Colr, nTxt, nCmp, nPin : Integer; Lib : ISch_Lib; Cmp : ISch_Component; It : ISch_Iterator; P : ISch_Parameter;+ Pin : ISch_Pin; names : TStringList; i : Integer; SavedOK : Boolean;@@ -1435,7 +1478,7 @@ begin Lib := OpenSchLibDoc(SchPath); if Lib = nil then begin RespErr('could not open: ' + SchPath); Exit; end; - nTxt := 0; nCmp := 0;+ nTxt := 0; nCmp := 0; nPin := 0; names := TStringList.Create; try GStage := 'collect components';@@ -1486,6 +1529,32 @@ begin finally Cmp.SchIterator_Destroy(It); end;++ { Pin name and pin number are NOT parameters -- they are properties of+ the pin, each with its own font mode. The KiCad importer sets them to+ Custom pointing at the font it added, so pin text keeps the imported+ face even after every parameter is fixed. Mode 0 is+ ePinItemMode_Default: inherit the document default, which is what a+ hand-made Altium pin uses. CustomFontID/CustomColor are ignored while+ the mode is Default, but are set so the pin is still right if anyone+ later flips it to Custom. }+ GStage := 'restyle pin text';+ It := Cmp.SchIterator_Create;+ It.AddFilter_ObjectSet(MkSet(ePin));+ try+ Pin := It.FirstSchObject;+ while Pin <> nil do+ begin+ Pin.Name_FontMode := 0;+ Pin.Designator_FontMode := 0;+ Pin.Name_CustomFontID := FontId;+ Pin.Designator_CustomFontID := FontId;+ Inc(nPin);+ Pin := It.NextSchObject;+ end;+ finally+ Cmp.SchIterator_Destroy(It);+ end; end; end; finally@@ -1498,6 +1567,7 @@ begin if LastServerDoc <> nil then SavedOK := LastServerDoc.DoFileSave(''); if SavedOK then SavedStr := 'true' else SavedStr := 'false'; RespOk(', "components": ' + IntToStr(nCmp) + ', "textObjects": ' + IntToStr(nTxt) ++ ', "pins": ' + IntToStr(nPin) + ', "fontId": ' + IntToStr(FontId) + ', "color": ' + IntToStr(Colr) + ', "saved": ' + SavedStr); end;
bridge-src/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "altium", "displayName": "Altium Bridge",- "version": "0.0.44",+ "version": "0.0.45", "description": "Drives Altium Designer from a container: build, clone and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob. Pairs with the container-side altium-jlc orchestrator (adom-jlcpcb + chip-fetcher).", "homepage": "https://wiki.adom.inc/adom/adom-desktop-altium-bridge", "author": "Adom Inc.",
bridge-src/server.py+1−1@@ -172,7 +172,7 @@ def handle_rename_footprint(args: dict) -> dict: def handle_set_visibility(args: dict) -> dict: """Set which parameters are visible on a component (others hidden); controls what shows when the symbol is placed on a schematic."""- keys = ("schlib", "component", "visible")+ keys = ("schlib", "component", "visible", "hidepins", "showpins") return addin_call("set_visibility", {k: args.get(k) for k in keys}, timeout=args.get("timeout", 90))
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-desktop-altium-bridge",- "version": "0.0.44",+ "version": "0.0.45", "type": "app", "description": "Adom Desktop bridge for Altium Designer: file-based symbol/footprint/IntLib authoring with LCSC/JLCPCB part numbers, Gerber/BOM/CPL batch output, and an in-process .NET extension adding parameterized headless verbs - STEP export with hole and copper options, and KiCad import with no wizard.", "tags": [
page.json+11−7@@ -1,8 +1,8 @@ { "slug": "adom-desktop-altium-bridge",- "version": "0.0.44",+ "version": "0.0.45", "type": "app",- "description": "Adom Desktop bridge for Altium Designer \u2014 build and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob, by driving Altium via DelphiScript.",+ "description": "Adom Desktop bridge for Altium Designer: file-based symbol/footprint/IntLib authoring with LCSC/JLCPCB part numbers, Gerber/BOM/CPL batch output, and an in-process .NET extension adding parameterized headless verbs - STEP export with hole and copper options, and KiCad import with no wizard.", "tags": [ "app", "adom-desktop",@@ -18,6 +18,7 @@ }, "needs_sudo": false, "hero": {+ "type": "image", "path": "docs/hero.png" }, "author": {@@ -25,13 +26,16 @@ "email": "[email protected]" }, "discovery_triggers": [- "add a part to my altium library", "drive altium from claude", "altium bridge",- "export step from altium",+ "export step from altium headless",+ "add a part to my altium library",+ "altium extension",+ "install altium extension",+ "altium step export", "run an altium outjob",- "build an altium footprint",- "altium symbol library"+ "import kicad into altium",+ "altium kicad importer" ], "discovery_pitch": "Use when the user wants Claude to author or edit Altium libraries, or to generate STEP/PDF/Gerber/BOM/CPL from an Altium board on their Windows machine.", "sample_prompts": [@@ -48,4 +52,4 @@ "prompt": "Is the Altium bridge connected and what version is it?" } ]-}+}