← Commit history
LICENSEadded+27
@@ -0,0 +1,27 @@+150060VS75000 component page (adom/150060vs75000)++Files authored by Adom for this page are licensed under the Creative Commons+Attribution 4.0 International License (CC-BY-4.0):+https://creativecommons.org/licenses/by/4.0/++This covers the footprint (150060VS75000.kicad_mod), the 3D models (*.step,+*.glb, states/, lod/), the hero GLB, the Fusion/EAGLE and Altium libraries+except for the symbol graphics noted below, the tools in provenance/tools/,+the JSON records (page.json, states.json, models.json, verification.json,+lod/manifest.json, provenance/*.json), README.md and the renders in docs/+other than the datasheet pages.++Exceptions, which keep their own terms:++- docs/150060VS75000-datasheet.pdf and docs/figures/150060VS75000-ds-p*.png+  (and the datasheet half of docs/figures/150060VS75000-overlay-p1.png) are+  Wurth Elektronik eiSos GmbH & Co. KG documents, reproduced unmodified for+  reference under Wurth's terms. They are not covered by CC-BY-4.0.+- The schematic symbol graphics (150060VS75000.kicad_sym and the symbol in+  the .lbr, .SchLib and adom-lbr JSON derived from it) come from KiCad's+  Device:LED symbol, licensed CC-BY-SA-4.0 with the KiCad library exception+  (https://www.kicad.org/libraries/license/).++"Wurth Elektronik", "WE" and "WL-SMCW" are names of Wurth Elektronik eiSos+GmbH & Co. KG. This page is not published by or affiliated with Wurth+Elektronik.
README.md+172−2
@@ -1,3 +1,173 @@-# 150060VS75000 - Wurth WL-SMCW 0603 Bright Green Chip LED+# 150060VS75000: Wurth Elektronik WL-SMCW 0603 Bright Green Chip LED -Wurth Elektronik 150060VS75000: WL-SMCW 0603 SMD chip LED, bright green (570 nm), water-clear lens, 2.0 V typ at 20 mA, 30 mA max.+**Wurth Elektronik 150060VS75000** is a 0603 (1608 metric) top-view SMD chip LED from the WL-SMCW series: an AlInGaP bright green emitter (570 nm dominant) under a water-clear lens, 2.0 V typical forward voltage at 20 mA and 30 mA maximum continuous current. It is a general-purpose status and indicator LED. This page carries a datasheet-checked KiCad symbol and footprint, a 3D model with separate off and on states, Fusion 360 / EAGLE and Altium libraries, and the provenance behind every number.++::adom-verified{src="/adom/150060vs75000/render/verification.json"}++## Key specs++| Spec | Value | Datasheet |+|---|---|---|+| Package | 0603 chip LED, 1.6 x 0.8 mm, 0.7 mm tall (0.3 mm substrate + 0.4 mm lens), castellated wrap-around terminals | p.1 |+| Chip technology / colour | AlInGaP, bright green, water-clear lens | p.1 |+| Dominant / peak wavelength | 570 nm / 572 nm at 20 mA | p.2 |+| Spectral bandwidth | 15 nm | p.2 |+| Luminous intensity | 40 mcd typ, 12 mcd min at 20 mA | p.2 |+| Forward voltage | 2.0 V typ, 2.4 V max at 20 mA | p.2 |+| Viewing angle (2θ50%) | 140 degrees | p.2 |+| Continuous forward current | 30 mA max | p.1 |+| Peak forward current | 100 mA (1/10 duty at 1 kHz) | p.1 |+| Reverse voltage | 5 V max; reverse current 10 µA max at 5 V | p.1, p.2 |+| Power dissipation | 72 mW max | p.1 |+| ESD (HBM) | 2000 V | p.1 |+| Junction temperature | 95 °C max | p.1 |+| Operating temperature | -40 to +85 °C | p.1 |+| Moisture sensitivity | MSL 3 | p.1 |+| Reflow | J-STD-020E profile, 260 °C peak for this package, 2 cycles max | p.6 |+| Packaging | 8 mm tape on a 178 mm reel, 4000 pcs | p.5 |++Page numbers refer to the Wurth datasheet [150060VS75000, revision 002.009 of 2019-02-26](docs/150060VS75000-datasheet.pdf) (8 pages).++## States++An LED looks different off and lit, so this page carries one 3D model for each state (adom/component-states@1). Off is the water-clear lens as built, `150060VS75000-off.step`. On is the lens in the 570 nm emitted colour with its glow, `150060VS75000.step`. The two models differ only in the lens material, so viewers and probing simulations can find the glowing part by that difference.++::adom-states{src="/adom/150060vs75000/render/states.json"}++## Pinout and polarity++| Pin | Name | Function |+|---|---|---|+| 1 | K | Cathode (-). The underside triangle points to this terminal and the top polarity mark sits on this end. |+| 2 | A | Anode (+). Drive through a series resistor. |++How to find the cathode on the part (datasheet p.1):++- **Underside:** a green triangle between the two terminals points to the cathode (pin 1).+- **Top:** the "Polarity Mark" is a small dark wedge in one corner of the cathode end.+- **Reel:** p.5 shows the part's polarity mark relative to the feeding direction for pick-and-place set-up.++The symbol (KiCad Device:LED numbering, pin 1 = K, pin 2 = A), the footprint (pad 1 = cathode) and the 3D model (cathode toward -X) agree; the check is logged in the verification record above.++![Datasheet p.1: dimensions, land pattern, polarity marks and schematic](docs/figures/150060VS75000-ds-p1-drawings.png)++## Designer notes++- **Always use a series resistor.** The datasheet calls resistors for protection obligatory (p.7). R = (V_rail - Vf) / I_F: from 3.3 V at 10 mA, (3.3 - 2.0) / 0.010 = 130 ohm; check the worst case with Vf = 2.4 V max. From 5 V at 20 mA, (5.0 - 2.0) / 0.020 = 150 ohm.+- **Brightness:** 40 mcd typ at 20 mA is a moderate indicator; a few mA is usually enough for a status light, and the p.4 curve shows intensity against current, with the current derating against ambient temperature beside it.+- **Wide viewing angle** (140 degrees) and a water-clear lens: the part looks clear when off and lights bright green.+- **Reverse voltage is only 5 V.** Do not use it as a rectifier or put it across a signal that can swing negative by more than that.+- **Handling:** MSL 3 (bake or keep dry per J-STD-033 after the bag is opened) and ESD precautions apply (p.1, p.7).+- **Binning:** each reel holds one bin of intensity, chromaticity or wavelength and forward voltage; a single bin cannot be ordered (p.7).++## Footprint++Wurth's recommended land pattern from datasheet p.1: two 0.8 x 0.8 mm pads, 0.8 mm apart, 2.4 mm overall. KiCad's generic `LED_0603_1608Metric` is an IPC-7351 nominal pattern and does not match it, so this footprint follows Wurth.++| mm | Wurth datasheet p.1 | KiCad LED_0603_1608Metric | This page |+|---|---|---|---|+| Pad length (along the part) | 0.8 | 0.875 | 0.8 |+| Pad width | 0.8 | 0.95 | 0.8 |+| Gap between pads | 0.8 | 0.7 | 0.8 |+| Centre to centre | 1.6 | 1.575 | 1.6 |+| Overall | 2.4 | 2.45 | 2.4 |+| Corners | square, as drawn | rounded (ratio 0.25) | square |++Pin 1 and cathode marks: the silkscreen bracket closes the pad-1 (cathode) end; on F.Fab a line marks the cathode terminal edge and a filled wedge sits in the same corner as the part's top polarity mark. The footprint references `${KIPRJMOD}/150060VS75000.step` with an identity transform. Comparison data: [provenance/footprint-comparison.json](provenance/footprint-comparison.json).++## 3D models++::adom-models{src="/adom/150060vs75000/render/models.json"}++| File | What it is |+|---|---|+| [150060VS75000.step](150060VS75000.step) | **The library model** for board CAD (KiCad, Fusion, Altium) and the on-state STEP: green lens, part number on the side wall. |+| [150060VS75000-off.step](150060VS75000-off.step) | The off-state STEP: the same solids and etch with a water-clear lens. |+| [150060VS75000.glb](150060VS75000.glb) | GLB of the library model for boards and digital twins: no pad outlines, labels or silkscreen. |+| [states/150060VS75000-off.glb](states/150060VS75000-off.glb), [states/150060VS75000-on.glb](states/150060VS75000-on.glb) | The two state GLBs: translucent water-clear lens, and the lit emissive lens. |+| [150060vs75000-hero.glb](150060vs75000-hero.glb) | The annotated page hero (adom-hero 1.4): the model plus teal dashed pad outlines, silkscreen with a pin-1 dot and K / A pad labels. Display only, never for a board. |+| [lod/](lod/manifest.json) | Four board-use detail levels (below). |++The part number `150060VS75000` is etched on the -Y side wall of the white substrate, reading from the cathode end, as a virtual identification aid; Wurth prints no part number on this part.++### Where the 3D model comes from++The model is **AI-generated from the Wurth datasheet**, because neither better source was usable:++1. **Wurth's own STEP** (Wurth publishes one per part number on we-online.com) could not be downloaded for this page: the site answered every download with a bot challenge. Comparing against it is an open item in the verification record.+2. **KiCad's `LED_0603_1608Metric.step`** is 1.1 mm tall with a moulded dome; the datasheet gives 0.7 ±0.1 mm and a straight-walled lens, so it was rejected.+3. The model was therefore built from the p.1 dimensions with [provenance/tools/build_step.py](provenance/tools/build_step.py): 1.6 x 0.8 mm white substrate 0.3 mm thick, 1.1 mm lens 0.4 mm tall, gold terminals wrapping both 0.25 mm ends with R 0.175 castellations, bottom terminals 0.7 mm wide with a 0.7 mm gap, the underside triangle and the top polarity wedge. Colours and the wrap-around terminals follow Wurth's WL-SMCW product photo; the die under the lens is illustrative. Every dimension and its source is in [provenance/3d-model.json](provenance/3d-model.json).++Proof: top, side and bottom renders of the model blended over the datasheet's p.1 views at the drawing's 20:1 scale. Outline, lens, castellations, terminal gap and both polarity marks coincide.++![Model renders blended over the datasheet p.1 views: top, side, bottom](docs/figures/150060VS75000-overlay-p1.png)++### Detail levels for boards++::adom-component-lod{src="/adom/150060vs75000/render/lod/manifest.json"}++| Level | File | Triangles | Part number | Change from high |+|---|---|---|---|---|+| high | [150060VS75000-high.glb](lod/150060VS75000-high.glb) | 525 | yes | none (same bytes as 150060VS75000.glb) |+| medium | [150060VS75000-medium.glb](lod/150060VS75000-medium.glb) | 477 | yes | castellations at 6 segments |+| low | [150060VS75000-low.glb](lod/150060VS75000-low.glb) | 128 | no | castellations at 4 segments; die and etch dropped |+| super-low | [150060VS75000-super-low.glb](lod/150060VS75000-super-low.glb) | 96 | no | two-segment notch; die, marks and etch dropped |++All levels share the same Z-up frame, units and seating (z = 0 at the terminal bottoms, origin at the footprint centre) and contain only the chip. They are candidates: inspected as images, not yet qualified in a streaming LOD viewer.++## Ordering++| | |+|---|---|+| MPN | `150060VS75000` |+| Manufacturer | Wurth Elektronik (WL-SMCW series) |+| Mouser | [710-150060VS75000](https://www.mouser.com/en/ProductDetail/Wurth-Elektronik/150060VS75000?qs=LlUlMxKIyB1Q1Bi5mQ%2FKLw%3D%3D) |+| DigiKey | [732-4980-2-ND](https://www.digikey.com/en/products/detail/w%C3%BCrth-elektronik/150060VS75000/4489906) |+| LCSC / JLCPCB | [C6848499](https://www.lcsc.com/product-detail/C6848499.html) (JLCPCB extended part) |+| Packaging | tape and reel, 4000 pcs per 178 mm reel (p.5) |++Snapshot 2026-10-21 from `adom-parts-search search 150060VS75000`: Mouser 703,027 in stock at $0.15 (1 pc), DigiKey 533,153 at $0.15 (1 pc), LCSC 2,129. Prices and stock change; check before ordering. The MPN, manufacturer and the three distributor numbers are also in the KiCad symbol properties, the Altium parameters (with Supplier links) and the Fusion attributes, so a BOM exported from any of them is orderable.++## Downloads++| File | Tool |+|---|---|+| [150060VS75000.kicad_sym](150060VS75000.kicad_sym) | KiCad symbol (KiCad's standard LED symbol with the part's properties) |+| [150060VS75000.kicad_mod](150060VS75000.kicad_mod) | KiCad footprint (Wurth land pattern) |+| [150060VS75000.step](150060VS75000.step) | 3D model for KiCad, Fusion and Altium |+| [150060VS75000.lbr](150060VS75000.lbr) | Fusion 360 / EAGLE library (symbol, package, MPN and distributor attributes) |+| [altium/150060VS75000.SchLib](altium/150060VS75000.SchLib), [altium/150060VS75000.PcbLib](altium/150060VS75000.PcbLib) | Altium symbol and footprint (the PcbLib embeds the STEP body) |+| [altium/150060VS75000.adom-lbr.json](altium/150060VS75000.adom-lbr.json) | adom-lbr part: converts to Altium, KiCad and EAGLE |+| [docs/150060VS75000-datasheet.pdf](docs/150060VS75000-datasheet.pdf) | Wurth datasheet, revision 002.009 |++The libraries were produced from the one KiCad symbol and footprint by adom-lbr 2.47.5 (`generate --part-metadata page.json`, `import-kicad`, `assemble-altium`); the Altium pair was read back with `import-altium` and maps pin 1 K to pad 1 and pin 2 A to pad 2.++## Manufacturer and resources++| Resource | Link |+|---|---|+| WL-SMCW series product page | [we-online.com](https://www.we-online.com/en/components/products/WL-SMCW) |+| Datasheet 150060VS75000 | [we-online.com PDF](https://www.we-online.com/components/products/datasheet/150060VS75000.pdf), copy here: [docs/150060VS75000-datasheet.pdf](docs/150060VS75000-datasheet.pdf) |+| 3D model (STEP) | published by Wurth per part number on the product page; not yet compared here (see Where the 3D model comes from) |++## Datasheet pages++The pages this page cites, as images:++- p.1 Dimensions, recommended land pattern, absolute maximum ratings, schematic: ![p.1](docs/figures/150060VS75000-ds-p1.png)+- p.2 Electrical and optical properties, viewing angle: ![p.2](docs/figures/150060VS75000-ds-p2.png)+- p.3 Spectrum and forward current against forward voltage: ![p.3](docs/figures/150060VS75000-ds-p3.png)+- p.4 Luminous intensity against forward current, derating curve: ![p.4](docs/figures/150060VS75000-ds-p4.png)+- p.5 Tape and reel, polarity in the tape: ![p.5](docs/figures/150060VS75000-ds-p5.png)++## Provenance++- **Datasheet:** Wurth Elektronik 150060VS75000, revision 002.009, 2019-02-26, 8 pages, downloaded from we-online.com on 2026-10-21. Hashes in [provenance/sources.json](provenance/sources.json).+- **Symbol:** KiCad's `Device:LED` symbol, renamed and given this part's properties; graphics and pin numbering unchanged.+- **Footprint:** created with adom-footprint 1.0.26 from the p.1 land pattern; silkscreen cathode bracket, F.Fab cathode marks and the model path added afterwards ([provenance/footprint-comparison.json](provenance/footprint-comparison.json)).+- **3D:** built from the datasheet ([provenance/3d-model.json](provenance/3d-model.json), [provenance/tools/](provenance/tools/build_step.py)), etched with adom-chip-laser 0.2.0, converted with step2glb 0.13.2, materials set by [glb_post_materials.py](provenance/tools/glb_post_materials.py); hero by `adom-wiki pkg hero` (adom-hero 1.4).+- **Sourcing:** `adom-parts-search` snapshot of 2026-10-21.++## License++Files authored for this page (symbol properties, footprint, 3D models, libraries, tools, README) are CC-BY-4.0, except where they derive from KiCad's libraries: the symbol graphics come from KiCad's `Device:LED` (CC-BY-SA-4.0 with the KiCad library exception). The datasheet and its page images are Wurth Elektronik's documents and remain under Wurth's terms. See [LICENSE](LICENSE).
models.jsonadded+253
@@ -0,0 +1,253 @@+{+ "schema": "adom/models@1",+ "part": "150060VS75000",+ "models": [+  {+   "path": "150060VS75000-off.step",+   "format": "step",+   "title": "150060VS75000, water-clear lens (off state)",+   "status": "current",+   "slot": "model_3d_step_plain",+   "variant": "plain",+   "use": [+    "board-cad"+   ],+   "unique": "Same solids and etch as the library model; only the lens colour differs (water-clear, unlit): the off-state STEP",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "b02d350007403be3b466d7fbe21bd72ccf20564e62d37b7c50f7fd59fc5a0e40",+   "git_blob": "d1d64ff1f247d416e24d180f641ae6d575eecb18",+   "bytes": 556454,+   "role": "datasheet-built",+   "derived_from": "provenance/tools/build_step.py",+   "source": "build_step.py --lens off, etched by adom-chip-laser 0.2.0",+   "colours": true,+   "thumb": "docs/models/150060VS75000-off-step-top.png",+   "thumb_bottom": "docs/models/150060VS75000-off-step-bottom.png"+  },+  {+   "path": "150060VS75000.glb",+   "format": "glb",+   "title": "150060VS75000 GLB, board use",+   "status": "current",+   "slot": "model_3d_plain",+   "variant": "etched",+   "use": [+    "render",+    "board-insertion"+   ],+   "unique": "Web copy of the library STEP: opaque green lens, gold metallic terminals, no footprint art; byte-identical to lod high",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "52a2df8b85b96edd3418976eaa4cb7cce9a1db1ad7435fe643a19f669c3e1bec",+   "git_blob": "7088efe44563ec270fd011ee76453a25040205d4",+   "bytes": 48308,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "step2glb 0.13.2 + glb_post_materials.py --state board",+   "colours": true,+   "thumb": "lod/150060VS75000-high.png"+  },+  {+   "path": "150060VS75000.step",+   "format": "step",+   "title": "150060VS75000, green lens, MPN on the side wall (library model)",+   "status": "current",+   "slot": "model_3d_step",+   "variant": "etched",+   "use": [+    "board-cad"+   ],+   "unique": "The board-CAD STEP and the on-state STEP: lens in the 570 nm colour, MPN etched on the -Y substrate wall",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "539a9c8c45490bdeb90a033ed1fe18d78d79c90d5a766dd6aa036c34f9dd6bf9",+   "git_blob": "0fe4e07faaa038c8cac9779cb5684cb731de5468",+   "bytes": 556454,+   "role": "datasheet-built",+   "derived_from": "provenance/tools/build_step.py",+   "source": "Built from Wurth datasheet rev 002.009 p.1 by build_step.py, etched by adom-chip-laser 0.2.0",+   "colours": true,+   "thumb": "docs/models/150060VS75000-step-top.png",+   "thumb_bottom": "docs/models/150060VS75000-step-bottom.png"+  },+  {+   "path": "150060vs75000-hero.glb",+   "format": "glb",+   "title": "150060VS75000 annotated hero",+   "status": "current",+   "slot": "model_3d",+   "variant": "hero",+   "use": [+    "wiki-hero"+   ],+   "unique": "The board-use model plus nonphysical reference art: teal dashed pad outlines, silkscreen with pin-1 dot, K and A pad labels (adom-hero 1.4); never for a board",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "e6510dbaf6caf6bc56ffde962f7930df7ec23a2e34f92ebd6143554d8311b251",+   "git_blob": "9c4b0e86409dad492c8c18b0f8d3a2ae1425183f",+   "bytes": 57588,+   "role": "derived",+   "derived_from": "150060VS75000.glb",+   "source": "adom-wiki 1.7.76 pkg hero",+   "colours": true+  },+  {+   "path": "lod/150060VS75000-high.glb",+   "format": "glb",+   "title": "LOD high",+   "status": "current",+   "slot": null,+   "variant": "lod",+   "use": [+    "render",+    "board-insertion"+   ],+   "unique": "Full detail, byte-identical to 150060VS75000.glb",+   "marking": null,+   "sha256": "52a2df8b85b96edd3418976eaa4cb7cce9a1db1ad7435fe643a19f669c3e1bec",+   "git_blob": "7088efe44563ec270fd011ee76453a25040205d4",+   "bytes": 48308,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "lod/manifest.json",+   "colours": true,+   "thumb": "lod/150060VS75000-high.png"+  },+  {+   "path": "lod/150060VS75000-low.glb",+   "format": "glb",+   "title": "LOD low",+   "status": "current",+   "slot": null,+   "variant": "lod",+   "use": [+    "render",+    "board-insertion"+   ],+   "unique": "Castellations at 4 segments; die and MPN etch dropped, polarity marks kept",+   "marking": null,+   "sha256": "fee543b922d552f9455553bf6867529ddf7806b6138e7a40697aa5a29b365c06",+   "git_blob": "111da237b4d26490d54950f8191e7095a4f60d4b",+   "bytes": 25364,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "lod/manifest.json",+   "colours": true,+   "thumb": "lod/150060VS75000-low.png"+  },+  {+   "path": "lod/150060VS75000-medium.glb",+   "format": "glb",+   "title": "LOD medium",+   "status": "current",+   "slot": null,+   "variant": "lod",+   "use": [+    "render",+    "board-insertion"+   ],+   "unique": "Castellations at 6 segments; die, polarity marks and MPN etch kept",+   "marking": null,+   "sha256": "deaa4401e67600e09235887d375e7dfbbaba8324b0d21581195602de1a0f8b94",+   "git_blob": "9d955bb62a4ab7e29db19e34f90547045c6e674e",+   "bytes": 42208,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "lod/manifest.json",+   "colours": true,+   "thumb": "lod/150060VS75000-medium.png"+  },+  {+   "path": "lod/150060VS75000-super-low.glb",+   "format": "glb",+   "title": "LOD super-low",+   "status": "current",+   "slot": null,+   "variant": "lod",+   "use": [+    "render",+    "board-insertion"+   ],+   "unique": "Two-segment castellation notch; die, polarity marks and MPN etch dropped",+   "marking": null,+   "sha256": "a2eabd317f5b66406d8881c9e7af926571b3e756299c37e29c5e1d74e6afd721",+   "git_blob": "506f94bc88c9a2ee7975d83e51c121b35e19fd3f",+   "bytes": 18808,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "lod/manifest.json",+   "colours": true,+   "thumb": "lod/150060VS75000-super-low.png"+  },+  {+   "path": "states/150060VS75000-off.glb",+   "format": "glb",+   "title": "Off state GLB",+   "status": "current",+   "slot": null,+   "variant": "showcase",+   "use": [+    "render"+   ],+   "unique": "Lens water-clear and translucent (alpha 0.45, die visible), no emission",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "efd7fcc7f821a5b4e0ffbc8966fbb25eb4afb84bbc5e67eba9efc2ee07de578f",+   "git_blob": "382fd7962d0fc0f8ab9068f06df895562e3b7d64",+   "bytes": 48312,+   "role": "derived",+   "derived_from": "150060VS75000-off.step",+   "source": "step2glb 0.13.2 + glb_post_materials.py --state off",+   "colours": true,+   "thumb": "states/150060VS75000-state-off.png"+  },+  {+   "path": "states/150060VS75000-on.glb",+   "format": "glb",+   "title": "On state GLB",+   "status": "current",+   "slot": null,+   "variant": "showcase",+   "use": [+    "render"+   ],+   "unique": "Lens lit: 570 nm colour, emissive (KHR_materials_emissive_strength 1.6), alpha 0.85; everything else identical to the off GLB",+   "marking": {+    "text": "150060VS75000",+    "surface": "-Y long side wall of the white substrate, reading left to right from the pin-1 (cathode) end",+    "colour": "near-black on white substrate (virtual identification aid, not a Wurth marking)"+   },+   "sha256": "57447ad395af133eb68ca3b17ac6dd2341dadcfb6c8ed552a0f3cfc5ac508e7d",+   "git_blob": "e334fef8986e34cafd05131f35fb058849fec1a7",+   "bytes": 48476,+   "role": "derived",+   "derived_from": "150060VS75000.step",+   "source": "step2glb 0.13.2 + glb_post_materials.py --state on",+   "colours": true,+   "thumb": "states/150060VS75000-state-on.png"+  }+ ],+ "updated": "2026-10-21",+ "front": [+  0,+  -1,+  0+ ],+ "thumbs_note": "Previews are step2glb 0.13.2 server-side renders of each file's STEP source (GLB previews show the STEP the GLB was converted from); the hero has no preview here because its reference art exists only in the GLB."+}
provenance/3d-model.jsonadded+163
@@ -0,0 +1,163 @@+{+ "schema": "adom/3d-model-provenance@1",+ "mpn": "150060VS75000",+ "decision": "datasheet-built (rung 3 of the wiki-component ladder)",+ "ladder": [+  {+   "rung": "Wurth's own STEP (we-online.com publishes one per part number)",+   "result": "not reachable",+   "detail": "2026-10-21: every we-online.com download path tried answered HTTP 503 with a JavaScript challenge page (bot protection); browser automation was not used for this page. The datasheet PDF itself downloaded before the challenge engaged. Open item: fetch the Wurth STEP in a browser and compare it against this model."+  },+  {+   "rung": "KiCad library model LED_SMD.3dshapes/LED_0603_1608Metric.step",+   "result": "rejected",+   "detail": "Its height is 1.10 mm (bbox z [-0.0, 1.1] by step2glb features); the datasheet gives 0.7 +/-0.1 mm (p.1), so it is 0.3 mm above the maximum. It also has no castellations, a moulded dome rather than Wurth's straight-walled lens, and no polarity marks.",+   "url": "https://gitlab.com/kicad/libraries/kicad-packages3D/-/raw/master/LED_SMD.3dshapes/LED_0603_1608Metric.step",+   "sha256": "98343205ec260ec165026ba2d44329a23096779ac36c553ea84aa7b370242e6d"+  },+  {+   "rung": "KiCad package generator at the datasheet values",+   "result": "not used",+   "detail": "KiCad's generator has no WL-SMCW style chip LED (substrate + straight lens + castellated wrap terminals) and CadQuery is not installed in this container."+  },+  {+   "rung": "hand-built from the datasheet",+   "result": "used",+   "tool": "provenance/tools/build_step.py",+   "detail": "planar-faced solids written directly to AP214 STEP with colours"+  }+ ],+ "frame": {+  "units": "mm",+  "up": "+Z",+  "seat": "z = 0 (bottom of the terminals)",+  "origin": "footprint origin = pad-pattern centre",+  "pin1": "-X (cathode)",+  "transform_to_footprint": "identity"+ },+ "dimensions_mm": {+  "length": [+   1.6,+   "1.6 +/-0.1, p.1"+  ],+  "width": [+   0.8,+   "0.8 +/-0.1, p.1"+  ],+  "height": [+   0.7,+   "0.7 +/-0.1, p.1 end view"+  ],+  "substrate": [+   0.3,+   "0.3 +/-0.1, p.1 side view"+  ],+  "lens_length": [+   1.1,+   "1.1 +/-0.1, p.1 side view"+  ],+  "lens_top_inset": [+   0.02,+   "measured off the p.1 side and end views (draft)"+  ],+  "bottom_terminal_gap": [+   0.7,+   "0.7 +/-0.1, p.1 bottom view"+  ],+  "bottom_terminal_width": [+   0.7,+   "0.7 typ, p.1 bottom view"+  ],+  "end_block_length": [+   0.25,+   "(1.6 - 1.1) / 2"+  ],+  "castellation_radius": [+   0.175,+   "R 0.175 typ, p.1"+  ],+  "plating_thickness": [+   0.02,+   "not dimensioned; assumed"+  ],+  "die": [+   0.24,+   "not dimensioned; illustrative 0.24 x 0.24 x 0.10 die under the lens"+  ]+ },+ "appearance": {+  "source": "Wurth WL-SMCW 0603 product photo as shown on the DigiKey listing (https://mm.digikey.com/Volume0/opasdata/d220001/medias/images/2958/WL-SMCW%20Series%200603.jpg)",+  "features": [+   "white substrate",+   "gold terminals wrapping both ends (top, end face with castellation, sides, bottom)",+   "green triangle on the underside pointing to the cathode",+   "water-clear lens"+  ],+  "colours_srgb": {+   "substrate": [+    0.9,+    0.9,+    0.88+   ],+   "terminal": [+    0.85,+    0.68,+    0.35+   ],+   "polarity_mark": [+    0.1,+    0.65,+    0.25+   ],+   "lens_off": [+    0.86,+    0.92,+    0.93+   ],+   "lens_on": [+    0.62,+    0.95,+    0.1+   ],+   "die": [+    0.15,+    0.15,+    0.17+   ]+  },+  "lens_on_colour": "570 nm dominant wavelength (p.2) mapped to a yellow-green sRGB"+ },+ "marking": {+  "text": "150060VS75000",+  "tool": "adom-chip-laser 0.2.0 etch surface=side:-y",+  "surface": "-Y long side wall of the substrate",+  "font_mm": 0.123,+  "colour": "near black",+  "note": "virtual identification aid; Wurth prints no part number on the part"+ },+ "proof": {+  "overlay": "docs/figures/150060VS75000-overlay-p1.png",+  "views": [+   "top vs p.1 top view (Polarity Mark drawing)",+   "front vs p.1 side view",+   "bottom vs p.1 bottom view"+  ],+  "scale": "datasheet drawn at 20:1, rendered at 300 dpi = 236.2 px/mm; model renders scaled to the same px/mm on the 1.6 mm length",+  "result": "outline, lens, castellations, terminal gap and both polarity marks coincide with the drawing within line width"+ },+ "files": {+  "150060VS75000.step": "539a9c8c45490bdeb90a033ed1fe18d78d79c90d5a766dd6aa036c34f9dd6bf9",+  "150060VS75000-off.step": "b02d350007403be3b466d7fbe21bd72ccf20564e62d37b7c50f7fd59fc5a0e40",+  "150060VS75000.glb": "52a2df8b85b96edd3418976eaa4cb7cce9a1db1ad7435fe643a19f669c3e1bec",+  "states/150060VS75000-off.glb": "efd7fcc7f821a5b4e0ffbc8966fbb25eb4afb84bbc5e67eba9efc2ee07de578f",+  "states/150060VS75000-on.glb": "57447ad395af133eb68ca3b17ac6dd2341dadcfb6c8ed552a0f3cfc5ac508e7d",+  "150060vs75000-hero.glb": "e6510dbaf6caf6bc56ffde962f7930df7ec23a2e34f92ebd6143554d8311b251"+ },+ "tools": {+  "build_step.py": "df774795cd296623565261f4f7814703af313569946d663597122a61d0f94a40",+  "glb_post_materials.py": "c90ff59670ddce571b9d9abbcbf2ff24ffaeb821fbe01d4cf2993c3d2723077c",+  "step2glb": "0.13.2",+  "adom-chip-laser": "0.2.0",+  "adom-wiki pkg hero": "1.7.76"+ }+}
provenance/footprint-comparison.jsonadded+70
@@ -0,0 +1,70 @@+{+ "schema": "adom/footprint-comparison@1",+ "mpn": "150060VS75000",+ "source": "Wurth Elektronik datasheet 150060VS75000 rev 002.009 (2019-02-26) p.1, Recommended Land Pattern [mm]: 2.4 overall, 0.8 gap, 0.8 pad height",+ "derived": {+  "pad_w_mm": 0.8,+  "pad_h_mm": 0.8,+  "centre_to_centre_mm": 1.6,+  "how": "pad length = (2.4 - 0.8) / 2 = 0.8; pad centre = 0.4 + 0.8 / 2 = 0.8"+ },+ "rows": [+  {+   "dim": "pad length along the part",+   "datasheet": 0.8,+   "kicad_LED_0603_1608Metric": 0.875,+   "this_page": 0.8+  },+  {+   "dim": "pad width",+   "datasheet": 0.8,+   "kicad_LED_0603_1608Metric": 0.95,+   "this_page": 0.8+  },+  {+   "dim": "gap between pads",+   "datasheet": 0.8,+   "kicad_LED_0603_1608Metric": 0.7,+   "this_page": 0.8+  },+  {+   "dim": "centre to centre",+   "datasheet": 1.6,+   "kicad_LED_0603_1608Metric": 1.575,+   "this_page": 1.6+  },+  {+   "dim": "overall",+   "datasheet": 2.4,+   "kicad_LED_0603_1608Metric": 2.45,+   "this_page": 2.4+  },+  {+   "dim": "corners",+   "datasheet": "square (as drawn)",+   "kicad_LED_0603_1608Metric": "roundrect ratio 0.25",+   "this_page": "square (rect)"+  }+ ],+ "verdict": "KiCad's LED_0603_1608Metric is an IPC-7351 nominal pattern, not Wurth's: its pads are 0.15 mm wider and the gap 0.1 mm narrower. This page uses Wurth's recommended land pattern exactly.",+ "kicad_reference": {+  "file": "LED_SMD.pretty/LED_0603_1608Metric.kicad_mod",+  "url": "https://gitlab.com/kicad/libraries/kicad-footprints/-/raw/master/LED_SMD.pretty/LED_0603_1608Metric.kicad_mod",+  "sha256": "7931ed1efba34cb13c8d74a60eb1dca4b0be57d950c38e08c3e7f007db500a1c",+  "retrieved": "2026-10-21"+ },+ "polarity": {+  "pad1": "K (cathode)",+  "evidence": [+   "p.1 schematic: pin 1 '-', pin 2 '+'",+   "p.1 bottom view: triangle between the terminals points to pin 1",+   "p.1 top view: 'Polarity Mark' corner on the pin-1 end"+  ],+  "footprint_marks": [+   "F.SilkS bracket closes the pad-1 (cathode) end at x = -1.36 mm",+   "F.Fab line at the terminal/lens boundary on the cathode end (x = -0.55) and a filled F.Fab wedge in the same corner as the part's top polarity mark"+  ]+ },+ "footprint_sha256": "cfdef86d20fb92b366257fe4f6279ab2a6aef81867e4c5ad014df37b4fd4466c",+ "tool": "adom-footprint 1.0.26 create, then silk bracket, fab cathode marks and model path added by hand (recorded here)"+}
provenance/sources.jsonadded+42
@@ -0,0 +1,42 @@+{+ "schema": "adom/sources@1",+ "mpn": "150060VS75000",+ "retrieved": "2026-10-21",+ "datasheet": {+  "file": "docs/150060VS75000-datasheet.pdf",+  "url": "https://www.we-online.com/components/products/datasheet/150060VS75000.pdf",+  "revision": "002.009",+  "date": "2019-02-26",+  "pages": 8,+  "sha256": "75685f7ae49ae4fa3c05ea3c6ad7a72d53747ca803320a8b96b8fdf38b368da7",+  "md5": "e093e9faf730efc2320395e6155342e2",+  "terms": "Wurth Elektronik eiSos GmbH & Co. KG document, redistributed unmodified; Wurth's terms apply (not covered by this page's CC-BY-4.0)"+ },+ "symbol": {+  "file": "150060VS75000.kicad_sym",+  "baseline": "KiCad Device:LED (kicad-symbols, CC-BY-SA-4.0 with the KiCad library exception)",+  "url": "https://gitlab.com/kicad/libraries/kicad-symbols/-/raw/master/Device.kicad_symdir/LED.kicad_sym",+  "baseline_sha256": "e85b6faf1f41fab98385fbaf44f9cbb87ca7f79c4948d6dba92c73a733db5982",+  "changes": "renamed, Adom properties added (MPN, Manufacturer, Mouser, DigiKey, LCSC, Adom Wiki, Datasheet, Description, Footprint); graphics and pin numbering (1 = K, 2 = A) unchanged",+  "sha256": "c17f3f43eb2eafa32fe69804050addc19df4e5fcd0c87860d6af2f4694a7011d"+ },+ "distributors": {+  "tool": "adom-parts-search search 150060VS75000",+  "checked": "2026-10-21",+  "mouser": {+   "part": "710-150060VS75000",+   "stock": 703027,+   "price_1": "$0.15"+  },+  "digikey": {+   "part": "732-4980-2-ND",+   "stock": 533153,+   "price_1": "$0.15"+  },+  "lcsc": {+   "part": "C6848499",+   "stock": 2129,+   "note": "JLCPCB extended part"+  }+ }+}
provenance/tools/build_step.pyadded+202
@@ -0,0 +1,202 @@+#!/usr/bin/env python3+"""Build the 150060VS75000 (Wurth WL-SMCW 0603) 3D model from the datasheet as an AP214 STEP.++No CAD kernel needed: every solid is a planar-faced prism (an extruded or lofted polygon), written+straight to STEP with colours (STYLED_ITEM per solid). Adom frame: Z-up, millimetres, seated on z = 0,+origin = footprint origin (pad-pattern centre), pin 1 (cathode) toward -X.++Dimensions: Wurth Elektronik datasheet 150060VS75000, revision 002.009 (2019-02-26), p.1 "Dimensions":+  body 1.6 +/-0.1 x 0.8 +/-0.1, total height 0.7 +/-0.1, substrate 0.3 +/-0.1, lens 1.1 +/-0.1 long,+  bottom terminals 0.7 typ wide with a 0.7 +/-0.1 gap, castellation R 0.175 typ, polarity marks.+Appearance (colours, wrap-around gold ends, green underside triangle): the Wurth WL-SMCW 0603 product+photo used on distributor listings. See provenance/3d-model.json.++usage: build_step.py OUT.step [--lens off|on] [--segs 12] [--no-die] [--no-marks] [--name NAME]+"""+import argparse, math++COL = {+    "substrate": (0.90, 0.90, 0.88),+    "terminal": (0.85, 0.68, 0.35),+    "mark": (0.10, 0.65, 0.25),+    "die": (0.15, 0.15, 0.17),+    "lens_off": (0.86, 0.92, 0.93),   # water-clear epoxy, unlit+    "lens_on": (0.62, 0.95, 0.10),    # 570 nm dominant (bright green), lit+}++L, W = 1.6, 0.8          # body length (x), width (y)+H_SUB = 0.30             # substrate top+H_TOT = 0.70             # lens top+LENS_L = 1.10            # lens length at its base+LENS_TOP_INSET = 0.02    # draft seen on p.1 side and end views+END = (L - LENS_L) / 2   # 0.25 mm end blocks (gold wrap-around terminals)+PAD_GAP = 0.70           # bottom terminal gap+PAD_W = 0.70             # bottom terminal width (typ)+R_CAST = 0.175+PLATE = 0.02             # bottom pad / plating thickness+TOP_PLATE = 0.01         # terminal stands proud of the substrate top+++def end_block_outline(sign, segs):+    """CCW outline of one end block (x from 0.55 to 0.8 on the +X end), castellation notch at the end face."""+    xi, xo = LENS_L / 2, L / 2+    pts = [(xi, -W / 2), (xo, -W / 2), (xo, -R_CAST)]+    for k in range(1, segs):+        t = -math.pi / 2 + math.pi * k / segs+        pts.append((xo - R_CAST * math.cos(t), R_CAST * math.sin(t)))+    pts += [(xo, R_CAST), (xo, W / 2), (xi, W / 2)]+    if sign < 0:+        pts = [(-x, y) for x, y in pts][::-1]+    return pts+++def rect(x0, y0, x1, y1):+    return [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]+++class Step:+    def __init__(self):+        self.lines = []+        self.n = 0+        self.vcache = {}+        self.dcache = {}++    def add(self, s):+        self.n += 1+        self.lines.append("#%d = %s;" % (self.n, s))+        return "#%d" % self.n++    def pt(self, p):+        return self.add("CARTESIAN_POINT('',(%s))" % ",".join("%.6f" % c for c in p))++    def dir(self, d):+        k = tuple(round(c, 9) for c in d)+        if k not in self.dcache:+            self.dcache[k] = self.add("DIRECTION('',(%s))" % ",".join("%.9f" % c for c in d))+        return self.dcache[k]+++def sub(a, b): return (a[0] - b[0], a[1] - b[1], a[2] - b[2])+def cross(a, b): return (a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0])+def norm(a):+    m = math.sqrt(sum(c * c for c in a)); return tuple(c / m for c in a)+++def newell(poly):+    n = [0.0, 0.0, 0.0]+    for i, p in enumerate(poly):+        q = poly[(i + 1) % len(poly)]+        n[0] += (p[1] - q[1]) * (p[2] + q[2]); n[1] += (p[2] - q[2]) * (p[0] + q[0]); n[2] += (p[0] - q[0]) * (p[1] + q[1])+    return norm(n)+++def solid(st, name, bottom, top, z0, z1):+    """Loft polygon `bottom` at z0 to polygon `top` at z1 (same vertex count, both CCW from +Z, planar sides)."""+    nb = len(bottom)+    V = [(x, y, z0) for x, y in bottom] + [(x, y, z1) for x, y in top]+    faces = [list(range(nb))[::-1], [nb + i for i in range(nb)]]+    for i in range(nb):+        j = (i + 1) % nb+        faces.append([i, j, nb + j, nb + i])+    vp = {}+    for i, p in enumerate(V):+        vp[i] = st.add("VERTEX_POINT('',%s)" % st.pt(p))+    edges = {}++    def edge(a, b):+        k = (min(a, b), max(a, b))+        if k not in edges:+            p, q = V[k[0]], V[k[1]]+            d = sub(q, p); ln = math.sqrt(sum(c * c for c in d))+            line = st.add("LINE('',%s,%s)" % (st.pt(p), st.add("VECTOR('',%s,%.6f)" % (st.dir(norm(d)), ln))))+            edges[k] = st.add("EDGE_CURVE('',%s,%s,%s,.T.)" % (vp[k[0]], vp[k[1]], line))+        return edges[k], (a, b) == (min(a, b), max(a, b))++    fids = []+    for f in faces:+        poly = [V[i] for i in f]+        n = newell(poly)+        ref = norm(sub(poly[1], poly[0]))+        ax = st.add("AXIS2_PLACEMENT_3D('',%s,%s,%s)" % (st.pt(poly[0]), st.dir(n), st.dir(ref)))+        plane = st.add("PLANE('',%s)" % ax)+        oes = []+        for i in range(len(f)):+            e, fwd = edge(f[i], f[(i + 1) % len(f)])+            oes.append(st.add("ORIENTED_EDGE('',*,*,%s,%s)" % (e, ".T." if fwd else ".F.")))+        loop = st.add("EDGE_LOOP('',(%s))" % ",".join(oes))+        bound = st.add("FACE_OUTER_BOUND('',%s,.T.)" % loop)+        fids.append(st.add("ADVANCED_FACE('',(%s),%s,.T.)" % (bound, plane)))+    shell = st.add("CLOSED_SHELL('',(%s))" % ",".join(fids))+    return st.add("MANIFOLD_SOLID_BREP('%s',%s)" % (name, shell))+++def build(out, lens="off", segs=12, die=True, marks=True, name="150060VS75000"):+    st = Step()+    parts = []  # (solid id, colour key)+    # substrate (white PCB) between the end blocks, bottom at the plating height+    parts.append((solid(st, "substrate", rect(-LENS_L / 2, -W / 2, LENS_L / 2, W / 2), rect(-LENS_L / 2, -W / 2, LENS_L / 2, W / 2), PLATE, H_SUB), "substrate"))+    for s, tag in ((-1, "K"), (1, "A")):+        o = end_block_outline(s, segs)+        parts.append((solid(st, "terminal_%s_end" % tag, o, o, 0.0, H_SUB + TOP_PLATE), "terminal"))+        x0, x1 = sorted((s * PAD_GAP / 2, s * LENS_L / 2))+        r = rect(x0, -PAD_W / 2, x1, PAD_W / 2)+        parts.append((solid(st, "terminal_%s_bottom" % tag, r, r, 0.0, PLATE), "terminal"))+    # lens: 1.1 x 0.8 at its base, slight draft to the top (p.1 side and end views)+    lb = rect(-LENS_L / 2, -W / 2, LENS_L / 2, W / 2)+    lt = rect(-LENS_L / 2 + LENS_TOP_INSET, -W / 2 + LENS_TOP_INSET, LENS_L / 2 - LENS_TOP_INSET, W / 2 - LENS_TOP_INSET)+    parts.append((solid(st, "lens", lb, lt, H_SUB, H_TOT), "lens_" + lens))+    if die:+        d = rect(-0.12, -0.12, 0.12, 0.12)+        parts.append((solid(st, "die", d, d, H_SUB, H_SUB + 0.10), "die"))+    if marks:+        # underside: triangle between the pads, tip toward pin 1 (cathode), p.1 bottom view+        tri = [(-0.16, 0.0), (0.16, -0.175), (0.16, 0.175)]+        parts.append((solid(st, "polarity_mark_bottom", tri, tri, PLATE * 0.4, PLATE), "mark"))+        # top: corner wedge on the pin-1 end, p.1 top view ("Polarity Mark")+        wedge = [(-L / 2, W / 2), (-LENS_L / 2, W / 2 - 0.10), (-LENS_L / 2, W / 2)]+        parts.append((solid(st, "polarity_mark_top", wedge, wedge, H_SUB + TOP_PLATE, H_SUB + TOP_PLATE + 0.005), "mark"))++    # product structure + units+    ctx_app = st.add("APPLICATION_CONTEXT('automotive_design')")+    st.add("APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,%s)" % ctx_app)+    pctx = st.add("PRODUCT_CONTEXT('',%s,'mechanical')" % ctx_app)+    prod = st.add("PRODUCT('%s','%s','',(%s))" % (name, name, pctx))+    st.add("PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(%s))" % prod)+    pdf = st.add("PRODUCT_DEFINITION_FORMATION('','',%s)" % prod)+    pdctx = st.add("PRODUCT_DEFINITION_CONTEXT('part definition',%s,'design')" % ctx_app)+    pd = st.add("PRODUCT_DEFINITION('design','',%s,%s)" % (pdf, pdctx))+    pds = st.add("PRODUCT_DEFINITION_SHAPE('','',%s)" % pd)+    lu = st.add("( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) )")+    au = st.add("( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) )")+    su = st.add("( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() )")+    unc = st.add("UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),%s,'distance_accuracy_value','confusion accuracy')" % lu)+    gctx = st.add("( GEOMETRIC_REPRESENTATION_CONTEXT(3) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((%s)) GLOBAL_UNIT_ASSIGNED_CONTEXT((%s,%s,%s)) REPRESENTATION_CONTEXT('Context #1','3D Context with UNIT and UNCERTAINTY') )" % (unc, lu, au, su))+    origin = st.add("AXIS2_PLACEMENT_3D('',%s,%s,%s)" % (st.pt((0, 0, 0)), st.dir((0, 0, 1)), st.dir((1, 0, 0))))+    rep = st.add("ADVANCED_BREP_SHAPE_REPRESENTATION('',(%s),%s)" % (",".join([origin] + [p[0] for p in parts]), gctx))+    st.add("SHAPE_DEFINITION_REPRESENTATION(%s,%s)" % (pds, rep))+    styled = []+    for sid, ck in parts:+        r, g, b = COL[ck]+        c = st.add("COLOUR_RGB('%s',%.4f,%.4f,%.4f)" % (ck, r, g, b))+        fa = st.add("FILL_AREA_STYLE('',(%s))" % st.add("FILL_AREA_STYLE_COLOUR('',%s)" % c))+        sss = st.add("SURFACE_SIDE_STYLE('',(%s))" % st.add("SURFACE_STYLE_FILL_AREA(%s)" % fa))+        psa = st.add("PRESENTATION_STYLE_ASSIGNMENT((%s))" % st.add("SURFACE_STYLE_USAGE(.BOTH.,%s)" % sss))+        styled.append(st.add("STYLED_ITEM('color',(%s),%s)" % (psa, sid)))+    st.add("MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(%s),%s)" % (",".join(styled), gctx))++    hdr = ["ISO-10303-21;", "HEADER;",+           "FILE_DESCRIPTION(('%s, Wurth Elektronik WL-SMCW 0603 chip LED, built from datasheet rev 002.009 p.1'),'2;1');" % name,+           "FILE_NAME('%s','2026-10-21T00:00:00',('Adom'),('Adom'),'adom build_step.py 1.0','adom build_step.py 1.0','');" % out.split('/')[-1],+           "FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));", "ENDSEC;", "DATA;"]+    open(out, "w").write("\n".join(hdr + st.lines + ["ENDSEC;", "END-ISO-10303-21;", ""]))+    return len(parts)+++if __name__ == "__main__":+    ap = argparse.ArgumentParser()+    ap.add_argument("out"); ap.add_argument("--lens", default="off", choices=["off", "on"])+    ap.add_argument("--segs", type=int, default=12); ap.add_argument("--no-die", action="store_true")+    ap.add_argument("--no-marks", action="store_true"); ap.add_argument("--name", default="150060VS75000")+    a = ap.parse_args()+    n = build(a.out, a.lens, a.segs, not a.no_die, not a.no_marks, a.name)+    print("OK: %d solids -> %s" % (n, a.out))
provenance/tools/glb_post_materials.pyadded+92
@@ -0,0 +1,92 @@+#!/usr/bin/env python3+"""Finish a step2glb GLB of the 150060VS75000 datasheet-built model: name the materials, give the gold+terminals a metallic finish and the epoxy / substrate a dielectric one, and set the lens for its state.++  glb_post_materials.py IN.glb [OUT.glb] [--state auto|off|on|board]++  off   : water-clear lens, unlit, translucent (alpha 0.45) so the die shows through+  on    : lens in the 570 nm emitted colour, emissive (KHR_materials_emissive_strength), alpha 0.85+  board : lens opaque in its own base colour, no emission (board CAD / LOD use)+  auto  : off when the lens is water-clear, board when it is green (the default for thumbnails)++Materials are recognised by the base colours build_step.py writes (step2glb converts them to linear).+The on state differs from the off state ONLY in the lens material, as adom/component-states@1 requires.+"""+import sys+import pygltflib+++def srgb2lin(c):+    return c / 12.92 if c <= 0.04045 else ((c + 0.055) / 1.055) ** 2.4+++SRC = {  # sRGB as written into the STEP by build_step.py, and by adom-chip-laser for the etch+    "substrate": (0.90, 0.90, 0.88),+    "terminal_gold": (0.85, 0.68, 0.35),+    "polarity_mark": (0.10, 0.65, 0.25),+    "die": (0.15, 0.15, 0.17),+    "lens_off": (0.86, 0.92, 0.93),+    "lens_on": (0.62, 0.95, 0.10),+}+LIN = {k: tuple(srgb2lin(c) for c in v) for k, v in SRC.items()}+++def classify(rgb):+    if max(rgb) < 0.015:          # adom-chip-laser's near-black etch (sRGB 0.112 -> linear 0.012)+        return "laser_etch_mpn"+    best, d = None, 9+    for k, v in LIN.items():+        e = sum((a - b) ** 2 for a, b in zip(rgb, v))+        if e < d:+            best, d = k, e+    if d > 2e-3:+        return "laser_etch_mpn" if max(rgb) < 0.05 else None+    return best+++def main():+    args = [a for a in sys.argv[1:] if not a.startswith("--")]+    state = "auto"+    if "--state" in sys.argv:+        state = sys.argv[sys.argv.index("--state") + 1]+        args = [a for a in args if a != state]+    src = args[0]+    out = args[1] if len(args) > 1 else src+    g = pygltflib.GLTF2().load(src)+    used = set(g.extensionsUsed or [])+    for m in g.materials:+        pbr = m.pbrMetallicRoughness+        k = classify(pbr.baseColorFactor[:3])+        if k is None:+            continue+        if k == "terminal_gold":+            m.name = "terminal_gold"; pbr.metallicFactor = 1.0; pbr.roughnessFactor = 0.35+        elif k in ("substrate", "die", "polarity_mark", "laser_etch_mpn"):+            m.name = k; pbr.metallicFactor = 0.0; pbr.roughnessFactor = 0.6+        elif k.startswith("lens"):+            st = state+            if st == "auto":+                st = "off" if k == "lens_off" else "board"+            pbr.metallicFactor = 0.0; pbr.roughnessFactor = 0.15+            if st == "off":+                m.name = "lens_water_clear"+                pbr.baseColorFactor = list(LIN["lens_off"]) + [0.45]+                m.alphaMode = "BLEND"; m.doubleSided = True; m.emissiveFactor = [0, 0, 0]+            elif st == "on":+                m.name = "lens_lit_570nm"+                pbr.baseColorFactor = list(LIN["lens_on"]) + [0.85]+                m.alphaMode = "BLEND"; m.doubleSided = True+                m.emissiveFactor = list(LIN["lens_on"])+                m.extensions = dict(m.extensions or {}, KHR_materials_emissive_strength={"emissiveStrength": 1.6})+                used.add("KHR_materials_emissive_strength")+            else:+                m.name = "lens_green" if k == "lens_on" else "lens_water_clear"+                pbr.baseColorFactor = list(pbr.baseColorFactor[:3]) + [1.0]+                m.alphaMode = "OPAQUE"; m.emissiveFactor = [0, 0, 0]+    g.extensionsUsed = sorted(used)+    g.save(out)+    print("OK: %s -> %s (%s)" % (src, out, ", ".join(m.name for m in g.materials)))+++if __name__ == "__main__":+    main()
states.jsonadded+66
@@ -0,0 +1,66 @@+{+ "schema": "adom/component-states@1",+ "mpn": "150060VS75000",+ "kind": "led",+ "default": "off",+ "states": [+  {+   "id": "off",+   "label": "Off",+   "summary": "No current: the water-clear lens as built, unlit, the die visible through it.",+   "models": {+    "step": "150060VS75000-off.step",+    "glb": "states/150060VS75000-off.glb"+   },+   "image": "states/150060VS75000-state-off.png",+   "when": {+    "text": "no forward current (unpowered, reverse biased, or below about 0.1 mA)"+   }+  },+  {+   "id": "on",+   "label": "On (bright green, 570 nm)",+   "summary": "Forward current flowing: the lens lit bright green.",+   "models": {+    "step": "150060VS75000.step",+    "glb": "states/150060VS75000-on.glb"+   },+   "image": "states/150060VS75000-state-on.png",+   "look": {+    "lit": "the materials the off model does not have (the lens)",+    "material": "lens_lit_570nm",+    "emissive_strength": 1.6,+    "glow": "#aaff28",+    "light": "point"+   },+   "when": {+    "forward_current_mA": [+     0.1,+     30+    ],+    "text": "forward current from A (pin 2) to K (pin 1) above about 0.1 mA, up to 30 mA continuous; (rail - 2.0 V) / R sets it (2.4 V max Vf at 20 mA)"+   }+  }+ ],+ "electrical": {+  "vf_V": 2.0,+  "vf_max_V": 2.4,+  "vf_test_current_mA": 20,+  "if_max_mA": 30,+  "if_peak_mA": 100,+  "vr_max_V": 5,+  "lambda_d_nm": 570,+  "lambda_peak_nm": 572,+  "iv_mcd_typ": 40,+  "iv_mcd_min": 12,+  "source": "Wurth Elektronik datasheet 150060VS75000 rev 002.009 (2019-02-26): p.1 Absolute Maximum Ratings (If 30 mA, If peak 100 mA at 1/10 duty 1 kHz, Vr 5 V), p.2 Electrical & Optical Properties (Vf 2.0 typ / 2.4 max, 570 nm dominant, 572 nm peak, 12 / 40 mcd at 20 mA)"+ },+ "pins": {+  "anode": "2",+  "cathode": "1"+ },+ "notes": [+  "The on model differs from the off model only in the lens material (checked: identical meshes, accessors and binary buffer; only material 2 changes).",+  "State images are step2glb (server-side) renders of each state's STEP; the on image adds a glow drawn only over the pixels where the two renders differ (the lens). They are not Adom 3D Viewer captures."+ ]+}
verification.jsonadded+253
@@ -0,0 +1,253 @@+{+ "schema": "adom/verification@1",+ "part": "150060VS75000",+ "variants": [+  {+   "mpn": "150060VS75000",+   "note": "bright green 570 nm, water-clear lens, 0603",+   "stocked": false+  }+ ],+ "entries": [+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "verified",+   "title": "Footprint is Wurth's recommended land pattern",+   "scope": [+    "footprint"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Pads 0.8 x 0.8 mm at x = -0.8 / +0.8 mm: 2.4 mm overall, 0.8 mm gap (p.1 Recommended Land Pattern)",+     "result": "pass"+    },+    {+     "text": "Square corners, as the datasheet draws them",+     "result": "pass"+    },+    {+     "text": "KiCad LED_0603_1608Metric differs (0.875 x 0.95 mm pads, 0.7 mm gap), so it was not used",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "datasheet p.1 crop",+     "href": "docs/figures/150060VS75000-ds-p1-drawings.png"+    },+    {+     "label": "comparison",+     "href": "provenance/footprint-comparison.json"+    }+   ],+   "files": {+    "150060VS75000.kicad_mod": "cfdef86d20fb92b366257fe4f6279ab2a6aef81867e4c5ad014df37b4fd4466c"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "verified",+   "title": "Pin 1 is the cathode on every file",+   "scope": [+    "symbol",+    "footprint",+    "3d"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Datasheet p.1 schematic: pin 1 '-' (cathode), pin 2 '+' (anode)",+     "result": "pass"+    },+    {+     "text": "Symbol: pin 1 = K, pin 2 = A (KiCad Device:LED numbering, Sim.Pins 1=K 2=A)",+     "result": "pass"+    },+    {+     "text": "Footprint: pad 1 at -X, closed by the silkscreen bracket; F.Fab wedge in the pad-1 corner",+     "result": "pass"+    },+    {+     "text": "3D: underside triangle points to -X (pad 1), top polarity wedge on the -X end at +Y, same corner as the p.1 top view and the footprint F.Fab wedge",+     "result": "pass"+    },+    {+     "text": "Footprint is the p.1 top view turned, not mirrored: pin 1 left in both",+     "result": "pass"+    },+    {+     "text": "Altium round trip (import-altium of the shipped SchLib/PcbLib): pin 1 K -> pad 1, pin 2 A -> pad 2",+     "result": "pass"+    }+   ],+   "evidence": [+    {+     "label": "overlay",+     "href": "docs/figures/150060VS75000-overlay-p1.png"+    },+    {+     "label": "underside render",+     "href": "docs/models/150060VS75000-step-bottom.png"+    }+   ],+   "files": {+    "150060VS75000.kicad_sym": "c17f3f43eb2eafa32fe69804050addc19df4e5fcd0c87860d6af2f4694a7011d",+    "150060VS75000.kicad_mod": "cfdef86d20fb92b366257fe4f6279ab2a6aef81867e4c5ad014df37b4fd4466c",+    "150060VS75000.step": "539a9c8c45490bdeb90a033ed1fe18d78d79c90d5a766dd6aa036c34f9dd6bf9",+    "150060VS75000-off.step": "b02d350007403be3b466d7fbe21bd72ccf20564e62d37b7c50f7fd59fc5a0e40",+    "altium/150060VS75000.SchLib": "f23399599f58f3a2ed3fed151f1f80d356944ae37c43adcd010be42dd78c7fe6",+    "altium/150060VS75000.PcbLib": "b8077a2035bc90d42a8a3e2fc10d3cc6898b04008733308af1264abfb9d69ef4",+    "150060VS75000.lbr": "18b28ca5a1bfe249b2ab89bb2388ed8e3a8a27deef50c23eca929e8a3de0bfa4"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "verified",+   "title": "3D model matches the datasheet drawing",+   "scope": [+    "3d"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Top, side and bottom renders blended over the p.1 views at the drawing's 20:1 scale: outline, lens (1.1 mm), height (0.7 mm), castellations (R 0.175), terminal gap (0.7 mm) and both polarity marks coincide",+     "result": "pass"+    },+    {+     "text": "Bounding box 1.6 x 0.8 x 0.7 mm, seated on z = 0, centred on the footprint origin (step2glb features)",+     "result": "pass"+    },+    {+     "text": "Wurth's own STEP could not be fetched (we-online.com bot challenge); KiCad's LED_0603 model is 1.1 mm tall, outside 0.7 +/-0.1, so the model is built from the datasheet",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "overlay",+     "href": "docs/figures/150060VS75000-overlay-p1.png"+    },+    {+     "label": "provenance",+     "href": "provenance/3d-model.json"+    }+   ],+   "files": {+    "150060VS75000.step": "539a9c8c45490bdeb90a033ed1fe18d78d79c90d5a766dd6aa036c34f9dd6bf9",+    "150060VS75000-off.step": "b02d350007403be3b466d7fbe21bd72ccf20564e62d37b7c50f7fd59fc5a0e40",+    "150060VS75000.glb": "52a2df8b85b96edd3418976eaa4cb7cce9a1db1ad7435fe643a19f669c3e1bec"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "verified",+   "title": "Off and on states differ only in the lens",+   "scope": [+    "states"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "states/*.glb: identical meshes, accessors and binary buffer; only the lens material differs (water-clear translucent vs 570 nm emissive)",+     "result": "pass"+    },+    {+     "text": "STEP: the on STEP is the off STEP with only the lens COLOUR_RGB changed",+     "result": "pass"+    },+    {+     "text": "Electrical: Vf 2.0 V typ / 2.4 V max at 20 mA, 30 mA max, 570 nm dominant (p.1, p.2)",+     "result": "pass"+    }+   ],+   "evidence": [+    {+     "label": "off",+     "href": "states/150060VS75000-state-off.png"+    },+    {+     "label": "on",+     "href": "states/150060VS75000-state-on.png"+    }+   ],+   "files": {+    "states.json": "4ba4f512b5e36c9f409085ef92dfba04c126983ba18da0a91f8280ecdd7bd120",+    "states/150060VS75000-off.glb": "efd7fcc7f821a5b4e0ffbc8966fbb25eb4afb84bbc5e67eba9efc2ee07de578f",+    "states/150060VS75000-on.glb": "57447ad395af133eb68ca3b17ac6dd2341dadcfb6c8ed552a0f3cfc5ac508e7d"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "open",+   "title": "Compare against Wurth's own STEP",+   "scope": [+    "3d"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Fetch Wurth's per-part STEP from we-online.com in a browser and diff it against 150060VS75000.step (dimensions, castellation, lens shape)",+     "result": "pass"+    }+   ],+   "evidence": [],+   "files": {}+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent, for Adom)",+    "handle": ""+   },+   "status": "open",+   "title": "Native EDA and live-viewer visual check",+   "scope": [+    "symbol",+    "footprint",+    "3d"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Open the .kicad_sym/.kicad_mod with the STEP in KiCad, the .lbr in Fusion and the SchLib/PcbLib in Altium, and check the page's 3D viewer, hero and states widget visually; not done in this pass (no desktop or browser use)",+     "result": "pass"+    }+   ],+   "evidence": [],+   "files": {}+  }+ ]+}