← Commit history

v1.9.71: design surfaces survive respawn

John Lauer ·0f687e6afd ·1mo ago ·parent ab90a7c
6 files changed +34−6
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.70\ No newline at end of file+1.9.71\ No newline at end of file
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: