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
#133: dismiss rescans chained Open dialogs
2 files changed
+20−5
CHANGELOG.md+7@@ -3,6 +3,13 @@ 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.41 (2026-10-30)++- `fusion_dismiss_blocking_dialogs` scans again after closing a native Open dialog: a cancelled EAGLE import opens its+ next Open dialog (the .brd after the .sch) at once, which one pass left behind (seen live).+- Checked live on 1.13.40 with add-in 1.0.30 (#133): fusion_new_electronics_from_eagle imported a .sch and .brd pair+ as AI Flow calls it, 109 of 109 parts placed, success true, no dialog left.+ ## 1.13.40 (2026-10-30) - Issue #133, second half: the EAGLE import's wait for the new design compared the workspace's NAME (PCB Editor), but
rust/bridge/src/small_verbs.rs+13−5@@ -485,11 +485,19 @@ pub fn dismiss_blocking_dialogs(state_dir: &Path, args: &Value, caller: &fusion_ // lists them, so this answers them too, with Cancel, and proves each is gone (issue #133) let mut native_answered = Vec::new(); if want.is_empty() || want.iter().any(|w| w == "file_dialog") {- for w in native_file_dialogs(&ab, caller, fusion_pids) {- let Some(h) = w["hwnd"].as_i64() else { continue };- let (closed, how) = close_native_dialog(&ab, caller, h);- crate::fusion_prefs::action_ledger(state_dir, "dialog_dismissed", json!({"title": w["title"], "category": "file_dialog", "hwnd": h, "closed": closed, "how": how}));- native_answered.push(json!({"title": w["title"], "category": "file_dialog", "answeredWith": format!("Cancel ({how})"), "closed": closed, "hwnd": h}));+ // a cancelled import opens its next Open dialog (the .brd after the .sch) at once: scan again+ // until none is left, a few rounds at most+ for round in 0..3 {+ let found = native_file_dialogs(&ab, caller, fusion_pids);+ if found.is_empty() { break; }+ if round > 0 { std::thread::sleep(std::time::Duration::from_millis(500)); }+ for w in found {+ let Some(h) = w["hwnd"].as_i64() else { continue };+ let (closed, how) = close_native_dialog(&ab, caller, h);+ crate::fusion_prefs::action_ledger(state_dir, "dialog_dismissed", json!({"title": w["title"], "category": "file_dialog", "hwnd": h, "closed": closed, "how": how}));+ native_answered.push(json!({"title": w["title"], "category": "file_dialog", "answeredWith": format!("Cancel ({how})"), "closed": closed, "hwnd": h}));+ }+ std::thread::sleep(std::time::Duration::from_millis(1500)); } } if classified.is_empty() && !native_answered.is_empty() {