app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
Update 11 file(s)
11 files changed
+28−15
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.13.18+1.13.19
CHANGELOG.md+6@@ -3,6 +3,12 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.13.19 (2026-10-29)++- review_board, board_report, pin_pad_check and schematic_review give the engine each part's attributes as+ `sheetParts[].params` ({name, value}, empty values left out), so vendor numbers and datasheets the parts carry count.+ On BQ25792 the 48 parts with an LCSC number now miss only Mouser and DigiKey, and the 5 with a DATASHEET have one.+ ## 1.13.18 (2026-10-29) From Drew Owens (PR #25). Design efficiency: measure what makes a design slow, and stop the bridge from making it slow.
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.13.18",+ "version": "1.13.19", "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", "homepage": "https://wiki.adom.inc/adom/fusion-bridge", "author": "Adom Inc.",
dashboard/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "fusion-dashboard"-version = "1.13.18"+version = "1.13.19" dependencies = [ "serde_json", ]
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.13.18"+version = "1.13.19" edition = "2021" [dependencies]
install.sh+1−1@@ -21,7 +21,7 @@ echo "Installed fusion-bridge skills: $(ls "$PKG_DIR/skills" 2>/dev/null | tr '\ # binary (the three-artifact pattern: bridge zip -> ab, THIS pkg -> container skills + # this download, page media -> wiki). Per the wiki's PKG_VS_RELEASE policy, binaries are # platform-tagged RELEASE assets, never tarball content - the installer fetches them.-DASH_VERSION="1.13.18"+DASH_VERSION="1.13.19" DASH_URL="https://wiki.adom.inc/download/adom/fusion-bridge/${DASH_VERSION}/fusion-dashboard" DEST="" if [ -w /usr/local/bin ]; then DEST=/usr/local/bin
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.13.18",+ "version": "1.13.19", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.13.18",+ "version": "1.13.19", "type": "app", "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.", "dependencies": {
rust/Cargo.lock+5−5@@ -19,7 +19,7 @@ dependencies = [ [[package]] name = "adom-fusion-bridge"-version = "1.13.18"+version = "1.13.19" dependencies = [ "adom-eda-checks", "base64",@@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "fusion-core"-version = "1.13.18"+version = "1.13.19" dependencies = [ "serde", "serde_json",@@ -310,7 +310,7 @@ dependencies = [ [[package]] name = "fusion-lbr"-version = "1.13.18"+version = "1.13.19" dependencies = [ "regex", "roxmltree",@@ -322,14 +322,14 @@ dependencies = [ [[package]] name = "fusion-os-mac"-version = "1.13.18"+version = "1.13.19" dependencies = [ "fusion-core", ] [[package]] name = "fusion-os-win"-version = "1.13.18"+version = "1.13.19" dependencies = [ "fusion-core", "windows-sys 0.59.0",
rust/Cargo.toml+1−1@@ -4,7 +4,7 @@ members = ["core", "lbr", "os-win", "os-mac", "bridge"] # One version for the whole bridge, in lockstep with BRIDGE_VERSION (tools/release.sh bumps both). [workspace.package]-version = "1.13.18"+version = "1.13.19" edition = "2021" license = "MIT"
rust/bridge/src/checks.rs+9−2@@ -81,7 +81,9 @@ pub fn call(cmd: &str, args: &Value, pass: &dyn Fn(&str, Value) -> Value) -> Val if matches!(cmd, "pin_pad_check" | "schematic_review" | "review_board" | "board_report") { // the sheets' parts with their pins (number, name, electrical type) from Fusion's schematic, // and the netlist (Designator.Pad); Fusion keeps board and schematic in step- let sd = crate::sch::call("schematic_data", args, pass);+ // params: each part's attributes (MPN, MOUSER, DIGIKEY, LCSC, DATASHEET ...) for review_board's vendor checks+ let mut sa = args.clone(); sa["params"] = json!(true);+ let sd = crate::sch::call("schematic_data", &sa, pass); if sd["success"].as_bool() == Some(false) { return sd; } bundle["sheetParts"] = json!(sheet_parts(&sd)); if matches!(cmd, "schematic_review" | "board_report") {@@ -273,7 +275,10 @@ fn sheet_parts(sd: &Value) -> Vec<Value> { let nums = if nums.is_empty() { vec![String::new()] } else { nums }; nums.into_iter().map(move |n| json!({"number": n, "name": p["name"].clone(), "electrical": p["electrical"].clone(), "gate": p["gate"].clone()})) }).collect();- json!({"designator": c["designator"], "pins": pins})+ // the standard's params [{name, value}], empty values left out (EAGLE libraries carry many blank fields)+ let params: Vec<Value> = c["params"].as_object().into_iter().flatten()+ .filter_map(|(k, v)| v.as_str().map(str::trim).filter(|v| !v.is_empty()).map(|v| json!({"name": k, "value": v}))).collect();+ json!({"designator": c["designator"], "pins": pins, "params": params}) }).collect() } @@ -288,5 +293,7 @@ mod sheet_tests { assert_eq!(p.len(), 1, "a supply symbol is no part"); assert_eq!(p[0]["pins"].as_array().unwrap().len(), 3); assert_eq!(p[0]["pins"][1]["number"], "4");+ let sd = json!({"components": [{"designator": "R1", "pins": [{"number": "1", "name": "1"}], "params": {"MPN": "RC0603", "LCSC": " ", "DATASHEET": "https://x"}}]});+ assert_eq!(sheet_parts(&sd)[0]["params"], json!([{"name": "MPN", "value": "RC0603"}, {"name": "DATASHEET", "value": "https://x"}]), "blank LCSC left out, the part's order kept"); } }