← Commit history

2.46.2 (docs only): README section for 2.43.0-2.46.1 (captions + hairline outline, orderable identity with the Adom wiki link, SchLib description, heatsink vias, plated Multi-Layer pads) and a CHANGELOG

John Lauer ·8c28b5aeba ·29d ago ·parent f78d83d
8 files changed +79−12
CHANGELOG.mdadded+26
@@ -0,0 +1,26 @@+# Changelog++## 2.46.1 (2026-09-20)+- Drilled pads in the native PcbLib are written as plated Multi-Layer pads: the pad record carries layer 74 plus the two bytes Altium sets when it plates a pad (114 = 15, 116 = 3, diffed against a library Altium saved after `altium_plate_vias`). Before this the heatsink vias loaded on the Top Layer with a hole. `altium_plate_vias {libraryPath}` (altium-bridge 0.2.20) repairs an older library in place.++## 2.46.0 (2026-09-19)+- Heatsink vias ride inside the footprint on every lane. Plated `thru_hole` pads numbered like the exposed pad (adom-footprint create `heatsinkVias` writes them) are kept without any flag: `import-kicad` reads the drill, the Altium PcbLib gets pads with holes, `generate` writes EAGLE `<pad drill=...>` with the same name so Fusion joins them to the exposed pad's net.+- New heatsink HINT from `import-kicad`: names the vias found on the exposed pad, or says that the largest SMD pad has none and how to add them (0.3 mm drill, 0.8 mm pitch, 0.15 mm ring, tented).++## 2.45.1 (2026-09-19)+- The SchLib header's `ComponentDescription` (Properties > General > Description and the SCH Library panel list) is filled from the symbol's Description property. It is a different field from the Description parameter.++## 2.45.0 (2026-09-19)+- Orderable identity on every lane. `import-kicad` keeps the KiCad symbol's MPN / Manufacturer / Datasheet / Description / Mouser / DigiKey / LCSC / "Adom Wiki" properties as Altium parameters, adds `Supplier N` / `Supplier Part Number N` pairs (Mouser, Digi-Key, LCSC) and `Manufacturer Part Number`, and fills the hub's `manufacturer`.+- `generate --part-metadata page.json` writes the EAGLE attributes MPN, MANUFACTURER, DATASHEET, ADOM_WIKI (from `component.wiki_url`, else `https://wiki.adom.inc/<owner>/<slug>`), MOUSER_PN, DIGIKEY_PN, LCSC_PN. Distributor numbers are read from `distributor_links.<dist>` as a string or an object with `pn` / `part_number` / `part` / `sku`.+- New sourcing HINT from `import-kicad`: names every identity property the symbol is missing and points at `adom-parts-search search <MPN>`.++## 2.44.0 (2026-09-19)+- `generate` carries each KiCad polyline's stroke width into the Fusion `.lbr`: a stroke at or under 0.2 mm becomes a 0.0254 mm hairline wire, wider strokes keep their width. Before this every symbol wire was a flat 0.1524 mm and the chip outline read as a fat stroke in Fusion.+- Altium SchLib line widths at or under 8 mil become Smallest (hairline); 10 mil stays Small.++## 2.43.0 (2026-09-19)+- Altium symbols look like the KiCad and Fusion ones. `import-kicad` keeps the symbol's text labels (adom-symbol's bold group captions, with justification) and the SchLib writer draws them; the chip-thumbnailer outline is fitted into the lane between the pin-name columns; the designator is centred above the body and the part number is the Comment centred below it.+- Multi-part libraries: `assemble-altium --no-dedupe` keeps one footprint per part even when land patterns match, so each part carries its own STEP body and its symbol links its own footprint name.++Earlier history is in the wiki repo commit log.
Cargo.lock+1−1
@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"  [[package]] name = "adom-lbr"-version = "2.42.0"+version = "2.46.2" dependencies = [  "altium-codec",  "anyhow",
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-lbr"-version = "2.46.1"+version = "2.46.2" edition = "2021" description = "adom-lbr generator / EDA translator: the canonical adom-lbr JSON is the hub, with native converters to Altium (.SchLib/.PcbLib/.IntLib), EAGLE/Fusion (.lbr), and KiCad. Altium output is written natively — no Altium needed at conversion time." 
README.md+39
@@ -106,6 +106,45 @@ This is the whole point. Fusion will silently show "No Components" or refuse to  Every source feature a target lane cannot represent is reported instead of silently lost. Today that is the EAGLE/Fusion lane's lack of per-pad solder-mask/paste margins (Fusion applies its library DRC stop/cream rules instead) and the Altium lane's lack of a paste **ratio** (mm expansions ride the pad record since 2.41.0). The policy is **warn and ship**: the file is written, stderr carries `WARN: [lost-pad-margins] pads 1,2,3 carry ...`, and stdout carries one machine-readable line per loss, `LOST: {"code":"lost-pad-margins","part":...,"feature":...,"pads":[...],"effect":...}`, which the wiki's export workers surface on the library receipt. Pass `--strict` to refuse instead: a single-part export writes nothing and exits 2 with `ERROR: [LOST_FEATURES] ...`; `assemble-altium` skips the refused parts into `refused[]`, still assembles the rest, reports `status: "partial"` and exits 2 with valid files on disk. The KiCad lane loses nothing, so `--strict` never refuses it. +## The same part in every tool (2.43.0 to 2.46.1)++A part converted by adom-lbr should read the same in KiCad, Altium and Fusion: the same chip drawing, the same ordering data, the same thermal vias. These releases closed the gaps.++### Altium symbols carry the group captions and the chip outline (from 2.43.0)++`import-kicad` keeps the KiCad symbol's text items (adom-symbol's bold pin-group captions such as I2C / Power / Ground / Control, with their justification) and the native SchLib writer draws them. The chip-thumbnailer outline (every polyline of the symbol) is fitted into the free lane between the pin-name columns, so it never overlaps a pin name. The designator is centred above the body and the part number is the Comment centred below it; Value stays a hidden parameter. For multi-part libraries, `assemble-altium --no-dedupe` keeps one footprint per part even when the land patterns match, so each part keeps its own STEP body and its symbol links its own footprint name.++### Stroke widths: thin art stays thin (from 2.44.0)++- **Fusion/EAGLE.** `generate` carries each `.kicad_sym` polyline's stroke width into the `.lbr`. A stroke at or under 0.2 mm (the chip-thumbnailer outline is 0.167 mm) becomes a 0.0254 mm (1 mil) hairline wire, which Fusion draws one pixel wide at any zoom. Wider strokes keep their width, and a polyline with no width gets the old 0.1524 mm. Before 2.44.0 every symbol wire was a flat 0.1524 mm.+- **Altium.** SchLib line widths map from the source stroke in mils: at or under 8 mil becomes Smallest (Altium's one-pixel hairline), up to 15 mil Small, up to 25 mil Medium, wider Large. KiCad's 10 mil default stays Small, and the body rectangle is always Small.++### Orderable identity on every lane (from 2.45.0)++The BOM and CPL that go to the fab with the gerbers are built from the part's identity fields, so every lane now carries them.++- **Altium.** A KiCad symbol made by adom-symbol 1.2.4+ carries MPN / Manufacturer / Datasheet / Description / Mouser / DigiKey / LCSC / "Adom Wiki" as properties. `import-kicad` keeps each as an Altium parameter, adds numbered `Supplier N` / `Supplier Part Number N` pairs (Mouser, Digi-Key, LCSC, numbered in that order for the ones present) for ActiveBOM, adds `Manufacturer Part Number` from MPN, and fills the hub JSON's `manufacturer`.+- **Fusion/EAGLE.** `generate --part-metadata page.json` reads the wiki component page and writes the attributes `MPN`, `MANUFACTURER`, `DATASHEET`, `ADOM_WIKI`, `MOUSER_PN`, `DIGIKEY_PN`, `LCSC_PN`. `ADOM_WIKI` comes from `component.wiki_url` (or the page's `url`), else `https://wiki.adom.inc/<owner>/<slug>` from the page slug. Distributor numbers are read from `component.<dist>_pn`, or from `component.distributor_links.<dist>` as a string or an object with `pn` / `part_number` / `part` / `sku`. Without the flag, a `page.json` beside the symbol is picked up automatically. `generate` prints a HINT listing the attributes it wrote, or that there are none and the BOM cannot order the part.+- **The sourcing hint.** `import-kicad` prints `HINT: identity complete (...)` when all eight properties are present, otherwise a HINT naming each missing one, why it matters, and the one lookup that fills the numbers: `adom-parts-search search <MPN>`. LCSC may honestly be absent; say so on the page.++```bash+adom-lbr generate --sym CH340G.kicad_sym --fp CH340G.kicad_mod --part-metadata page.json -o CH340G.lbr+```++### SchLib Description filled (from 2.45.1)++The SchLib component header's `ComponentDescription` (what Altium shows in Properties > General > Description and in the SCH Library panel list) is filled from the symbol's Description property. It is a different field from the Description parameter, and an empty one reads as an unfinished part.++### Heatsink vias ride inside the footprint (from 2.46.0)++Thermal vias are part of the footprint, not something redrawn per tool. In the KiCad footprint they are plated `thru_hole` pads that carry the exposed pad's own number (adom-footprint `create` writes them from `heatsinkVias`; the wiki's standard rule is 0.3 mm drill, 0.8 mm pitch, 0.15 mm ring, tented). adom-lbr keeps them on every lane with no extra flag: `import-kicad` reads the drill, the Altium PcbLib gets pads with holes, and `generate` writes EAGLE `<pad drill=...>` with the same name, so Fusion joins them to the exposed pad's net.++**The heatsink hint.** `import-kicad` looks for the largest SMD pad (at least 1 mm² and at least three times the median pad area). If `thru_hole` pads share its number it prints a HINT with the via count; if none do, it prints a HINT that the exposed pad has NO heatsink vias and how to add them once in the KiCad footprint.++### Drilled PcbLib pads are plated Multi-Layer pads (from 2.46.1)++A drilled pad in the native PcbLib is now written as a real plated through-hole: the pad record sits on Multi-Layer (layer 74) and carries the two bytes Altium itself sets when it plates a pad (found by diffing against a library Altium saved). Before 2.46.1 the heatsink vias loaded on the Top Layer with a hole. For a library generated earlier, `altium_plate_vias {libraryPath}` (altium-bridge 0.2.20) repairs it in place.+ ## Generate from the command line  ![Generating an .lbr from KiCad sources](docs/generate.png)
VERSION+1−1
@@ -1 +1 @@-2.46.1+2.46.2
bin/adom-lbr
⋯ 1 unchanged line ⋯
package.json+2−1
@@ -1,6 +1,6 @@ {   "slug": "adom-lbr",-  "version": "2.46.1",+  "version": "2.46.2",   "type": "app",   "description": "adom-lbr \u2014 the EDA library translator. Bring a component in from any supported EDA tool and convert it to any other (KiCad \u21c4 Altium \u21c4 EAGLE/Fusion) through one canonical adom-lbr JSON \u2014 symbol + footprint + 3D + pin\u2194pad map. Altium is written natively (no Altium needed). Includes the adom-lbr Manager: browse wiki components and view symbol/footprint/3D + the per-EDA layer stackup.",   "dependencies": {},@@ -34,6 +34,7 @@     "SKILL.md",     "skills/**",     "README.md",+    "CHANGELOG.md",     "install.sh",     "uninstall.sh",     "screenshots/**",
page.json+9−8
@@ -1,8 +1,8 @@ {   "slug": "adom-lbr",-  "version": "2.46.1",+  "version": "2.46.2",   "type": "app",-  "description": "adom-lbr — the EDA library translator. Bring a component in from any supported EDA tool and convert it to any other (KiCad ⇄ Altium ⇄ EAGLE/Fusion) through one canonical adom-lbr JSON — symbol + footprint + 3D + pin↔pad map. Altium is written natively (no Altium needed). Includes the adom-lbr Manager: browse wiki components and view symbol/footprint/3D + the per-EDA layer stackup.",+  "description": "adom-lbr \u2014 the EDA library translator. Bring a component in from any supported EDA tool and convert it to any other (KiCad \u21c4 Altium \u21c4 EAGLE/Fusion) through one canonical adom-lbr JSON \u2014 symbol + footprint + 3D + pin\u2194pad map. Altium is written natively (no Altium needed). Includes the adom-lbr Manager: browse wiki components and view symbol/footprint/3D + the per-EDA layer stackup.",   "dependencies": {},   "tags": [     "eda",@@ -56,20 +56,21 @@     "SKILL.md",     "skills/**",     "README.md",+    "CHANGELOG.md",     "install.sh",     "uninstall.sh",     "screenshots/**",     "dockbar.json"   ],-  "discovery_pitch": "Convert electronic-component symbols + footprints between any two EDA tools — KiCad, Altium (written natively, no Altium needed), and EAGLE/Fusion — through one canonical adom-lbr JSON, silk/courtyard/fab layers preserved. Plus a Manager to browse and inspect any wiki part.",+  "discovery_pitch": "Convert electronic-component symbols + footprints between any two EDA tools \u2014 KiCad, Altium (written natively, no Altium needed), and EAGLE/Fusion \u2014 through one canonical adom-lbr JSON, silk/courtyard/fab layers preserved. Plus a Manager to browse and inspect any wiki part.",   "sample_prompts": [     {       "prompt": "Convert this KiCad symbol and footprint to an Altium SchLib and PcbLib",-      "label": "KiCad → Altium"+      "label": "KiCad \u2192 Altium"     },     {       "prompt": "Import this Altium footprint into the adom-lbr JSON",-      "label": "Altium → JSON"+      "label": "Altium \u2192 JSON"     },     {       "prompt": "Bundle this part into a single Altium IntLib",@@ -77,15 +78,15 @@     },     {       "prompt": "Convert this Altium SchLib and PcbLib to a KiCad symbol and footprint",-      "label": "Altium → KiCad"+      "label": "Altium \u2192 KiCad"     },     {       "prompt": "Export this adom-lbr JSON to a KiCad .kicad_sym and .kicad_mod",-      "label": "JSON → KiCad"+      "label": "JSON \u2192 KiCad"     },     {       "prompt": "Open the adom-lbr Manager to browse wiki components and view the layer stackup",       "label": "Browse parts"     }   ]-}\ No newline at end of file+}