← Commit history
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?"     }   ]-}+}\ No newline at end of file