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
v1.9.71: design surfaces survive respawn
6 files changed
+34−6
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.70+1.9.71
CHANGELOG.md+10@@ -3,6 +3,16 @@ 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.9.71 - 2026-08-18 (ralph)++- **The DESIGN surfaces survive a bridge respawn.** show_project / show_schematic / show_2d_board /+ show_3d_board resolve through the in-memory `_TEST_PROJECT` handle, which every bridge_install+ wiped - so all four failed with "query or urn required" until something re-staged (found by+ driving all eight surfaces: 3/7 passed, the 4 design ones failed). The handle now persists to+ bridge prefs and is restored at import when both generated files still exist on the box.+- Dashboard: the surface remediation also re-stages on "make_test_project / urn required / no+ design" errors, not just library-shaped ones.+ ## 1.9.70 - 2026-08-18 (ralph) - **fusion_state imageAs:base64 now DOWNSCALES instead of refusing.** On a PIL-less bridge the
adom-bridge-fusion-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.9.70",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.70/adom-bridge-fusion-v1.9.70.zip",- "sha256": "791673017933c7589428c09e75209122cdd99d826e33fc5fb17710b28cc92d4d",- "size": 408960,+ "version": "1.9.71",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.71/adom-bridge-fusion-v1.9.71.zip",+ "sha256": "ecaa27e89c81db89cf24d2da7e035887a57d79f5e5ec1f9b6574f7ea7be0d36c",+ "size": 409291, "verbPrefixes": [ "fusion_" ],
bin/fusion-dashboard⋯ 1 unchanged line ⋯
dashboard/src/main.rs+2−1@@ -561,7 +561,8 @@ fn show_surface(app: &Arc<App>, target: &str, key: &str, page: &str) -> serde_js if err.contains("not running") || err.contains("not responding") || err.contains("add-in") { ensure_ready(app, target, 180); }- if err.contains("edit") || err.contains("library") || err.contains("deviceset") || err.contains("not found") {+ if err.contains("edit") || err.contains("library") || err.contains("deviceset") || err.contains("not found")+ || err.contains("make_test_project") || err.contains("urn required") || err.contains("no design") { app.staged.lock().unwrap().remove(&format!("{}|{}", target, page)); let _ = stage_demo_part(app, target, page); }
server.py+17@@ -7286,6 +7286,15 @@ def _mtp_generate(lib_name, ex, part_name, urn="", rex=None, r_urn="", solo=True _TEST_PROJECT: dict = {}+try: # restore the last generated test project so the DESIGN surfaces (project/schematic/+ # 2d/3d) survive a bridge respawn - an install used to wipe this and those four verbs+ # failed with "query or urn required" until something re-staged (ralph, 2026-08-18).+ _tp = _get_bridge_pref("testProject", None)+ if isinstance(_tp, dict) and _tp.get("sch") and _tp.get("brd"):+ if os.path.isfile(_tp["sch"]) and os.path.isfile(_tp["brd"]):+ _TEST_PROJECT = _tp+except Exception:+ pass def _test_project_activate(kind):@@ -7376,6 +7385,14 @@ def _orchestrate_make_test_project(args: dict) -> dict: global _TEST_PROJECT _TEST_PROJECT = {"sch": sch_path, "brd": brd_path, "docBase": base.lower()}+ # PERSIST: the design surfaces (show_project/schematic/2d/3d) resolve through this handle,+ # and a bridge respawn - which happens on every install - used to wipe it, so those four+ # surfaces failed with "query or urn required" until the caller re-staged (ralph, 2026-08-18).+ # The paths live on the box, so they stay valid across respawns.+ try:+ _set_bridge_pref("testProject", _TEST_PROJECT)+ except Exception:+ pass try: _note_bridge_doc(base) # generated test docs = bridge docs (sentinel may discard) except Exception: