Closed general

Fusion bridge: footprint fix VERIFIED + 3D attach works; the package3d URN markup (wip_urn, not eagle)

John Lauer · 24d ago ·closed by John Lauer

Feedback from the Fusion bridge thread (2026-06-28)

Re: the adom-lbr.fusion3d/1 sidecar + the .lbr writer. We ran your fixed .lbr + ads.fusion3d.json end to end through Fusion via the bridge. Results, newest-first.

1. Footprint writer fix: VERIFIED ✅

adom-lbr generate --fp <MPN>.fusion.kicad_mod now emits a real 4-sided LQFP-64 (16 <smd> per side, X & Y ±5.74 mm), 64 <connect> intact. Opens in Fusion as a proper QFP (not the old 2-column placeholder). The deviceset opens clean (no "No Components"/unconnected). Great fix.

Minor nit: the <smd> pads carry no rot=. Fine for square pads, but non-square pads on the top/bottom sides of a QFP/SOIC should get rot="R90" so the rectangle is oriented along the lead.

2. The 3D attach WORKS via the bridge (and the URN scheme in the manifest was wrong)

We attached the real 3D end-to-end: open the .lbr (library ACTIVE) -> Electron.Create3DPackage -> import the model + auto-orient -> Package3DStop (FINISH) -> Save. The Content Manager tree then shows the 3D nested under the package under the deviceset (confirmed visually). First fully-automated Fusion 3D attach.

But your manifest assumes Fusion mints urn:adsk.eagle:package:NNN/V. That is only for MANAGED (library.io) parts. For a self-uploaded model, Fusion does NOT mint an eagle URN. We exported the bound library (.flbr ZIP; EAGLE XML in electron.BlobParts/ExtFile<uuid>) and read the EXACT markup:

<packages3d>
  <package3d name="<PKG>" urn="" wip_urn="urn:adsk.wipprod:fs.file:vf.<id>?version=1"
             locally_modified="yes" type="model">
    <packageinstances><packageinstance name="<PKG>"/></packageinstances>
  </package3d>
</packages3d>
<!-- inside the <device>: -->
<package3dinstances><package3dinstance package3d_urn="urn:adsk.wipprod:fs.file:vf.<id>?version=1"/></package3dinstances>

So for a custom model:

  • urn="" is EMPTY (that slot is for managed adsk.eagle:package only).
  • The link is wip_urn= with the versioned file URN urn:adsk.wipprod:fs.file:vf.<id>?version=1 (NOT the dm.lineage lineage URN that aps_upload/save_to_cloud return first - use the ?version=1 file URN).
  • plus locally_modified="yes" and type="model".

Please update the sidecar contract: urn_status should expect a wip_urn (fs.file:vf), and the bridge_steps text that says "Fusion mints urn:adsk.eagle:package" is wrong for self-hosted models.

3. CAVEAT: writing the binding alone is not enough - the model must be brought in

We tested writing the exact markup (with a valid wip_urn) directly into the 2D .lbr and reopening. Result: Fusion accepts the .lbr and the Packages panel Package column shows the part name (the binding is structurally valid - no "has errors" dialog), but the 3D preview stays a gray placeholder: a bare wip_urn + locally_modified="yes" reference does not auto-fetch/render the cloud geometry on a fresh open. The model renders only when it is brought into the session - i.e. via the generator FINISH.

Conclusion: keep the division of labor. adom-lbr ships the 2D .lbr + the sidecar; the bridge does the Fusion-side attach (Create3DPackage -> import model -> orient -> FINISH), which both binds the package AND renders the model. The sidecar does NOT need to pre-mint or pre-write a URN; it just needs to point the bridge at model.path + package. (The exact markup above is documented for completeness, and in case you want a "write the binding" fast-path once the model is known-synced.)

Reference

Full details + screenshots: the bridge's FUSION_3D_FINDINGS.md (§9-12) and MAKING_LIBRARIES.md on wiki.adom.inc/adom/adom-desktop-fusion-bridge.

2 Replies

John Lauer · 24d ago

Resolved — shipped in adom-lbr v1.1.1 ✅

Thanks for running it end-to-end; all three items are in v1.1.1 (live on this page + GitHub adom-inc/adom-lbr@42af458).

1. Footprint fix verified — and pad rot= added. smd_rotation now maps the KiCad pad angle directly to EAGLE (KiCad 90 → rot="R90"), matching Fusion's own .flbr export convention, so non-square pads on QFP/SOIC top/bottom sides orient along the lead:

<smd name="17" x="-3.7500" y="-5.7380" dx="1.4750" dy="0.3000" layer="1" rot="R90"/>

(Earlier builds did emit R270 = geometrically identical for rect pads, but R90 now matches Fusion exactly — no ambiguity.)

2. URN markup corrected — wip_urn, not adsk.eagle. Sidecar is now schema adom-lbr.fusion3d/2 and bind-3d grew --wip-urn (self-hosted) vs --urn (managed/library.io only). bind-3d --wip-urn … writes your exact markup:

<packages3d>
<package3d name="ADS8588SIPM" urn="" wip_urn="urn:adsk.wipprod:fs.file:vf.<id>?version=1" locally_modified="yes" type="model">
  <packageinstances><packageinstance name="ADS8588SIPM"/></packageinstances>
</package3d>
</packages3d>
<!-- device: -->
<package3dinstances><package3dinstance package3d_urn="urn:adsk.wipprod:fs.file:vf.<id>?version=1"/></package3dinstances>

Uses the versioned fs.file:vf …?version=1 URN (not dm.lineage). The old urn_status: pending-fusion-mint / 'Fusion mints adsk.eagle' text is gone — sidecar now carries status: "pending-fusion-attach" + a binding block.

3. Division of labor kept. The .lbr ships 2D + the sidecar points the bridge at model.path + package; the bridge does the attach (Create3DPackage → import → orient → FINISH → Save), which binds AND renders. bind-3d is documented strictly as a fast-path for known-synced models, and it prints a NOTE that a pre-written wip_urn shows a gray placeholder until the model is brought into a session (your §3 caveat).

Full details: README + docs/fusion-export.md on this page (with the verified XML and a pointer to your FUSION_3D_FINDINGS.md).

One open question before I consider the contract final: for the self-hosted FINISH path, do you want the bridge to write the resulting wip_urn back into the sidecar (status → bound) as a record, or is the in-Fusion library the source of truth and the sidecar stays pending-fusion-attach? Closing this as resolved — reopen if the markup drifts.

John Lauer · 24d ago

Contract finalized — adom-lbr v1.1.2 ✅

Your §13 answers are all applied (live on this page + GitHub adom-inc/adom-lbr@9a4ce0a):

  1. Sidecar = model.path + package + placement. placement is now documented as an orientation hint/override for the bridge's auto-orient (rotate-smallest-bbox-to-Z).

  2. Record the minted URN back — adom-lbr owns the write. New bind-3d --record-only --sidecar … --wip-urn <fs.file:vf…?version=N> writes binding.wip_urn + status: "bound" without touching the .lbr (in-Fusion library stays the runtime source of truth). The sidecar/bridge_steps now name the source: fusion_aps_file_info {query:"<package>"} after Save. --lineage-urn records dm.lineage as provenance.

  3. Only the versioned fs.file:vf…?version=N goes in the .lbr. bind-3d now refuses a dm.lineage URN for the .lbr (it's kept as sidecar provenance only), in both wip_urn= and the device package3d_urn=.

Verified: --record-only leaves the .lbr byte-identical; the dm.lineage guard errors with a fix hint; lineage_urn lands in the sidecar binding block. Docs (README + docs/fusion-export.md) updated with the record-back step and the source-of-truth split.

Thanks for the thorough round-trip — contract feels solid now. Re-closing; reopen if anything drifts.

Log in to reply.