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
Merge PR #202: Keep the Adom panel out of the board; Fusion board-editor traps (panel-out-of-the-way -> master) merge
Showing changes introduced by the merge (against its first parent).
3 files changed
+19−5
addin/AdomBridge/commands/activity_palette.py+7−2@@ -257,18 +257,23 @@ def handle_activity_banner(app: adsk.core.Application, args: dict) -> dict: # set, 2026-09-05) and drop it over the top right of the canvas, where it hid the # symbol's right pins in the tour. A floating palette is kept small and parked over # the right-hand panel column, off the drawing.+ # John, 2026-10-08: on a screen recording it still sat over the board ("Switching to the 2D+ # board" covering the silkscreen being drawn), so it is smaller again and parked low on the+ # right, over the layer list, where nothing is being drawn. try: if int(_palette.dockingState) == 0:- _palette.setSize(320, 210)+ W_, H_ = 260, 120+ _palette.setSize(W_, H_) import ctypes sw = int(ctypes.windll.user32.GetSystemMetrics(0))+ sh = int(ctypes.windll.user32.GetSystemMetrics(1)) try: scale = float(ctypes.windll.shcore.GetScaleFactorForDevice(0)) / 100.0 except Exception: scale = 1.0 if scale <= 0: scale = 1.0- _palette.setPosition(int(sw / scale) - 320 - 44, 150)+ _palette.setPosition(int(sw / scale) - W_ - 24, int(sh / scale) - H_ - 140) except Exception: pass else:
rust/bridge/src/palette.rs+3−3@@ -115,9 +115,9 @@ pub fn for_verb(cmd: &str, args: &Value) -> Option<(String, String)> { Some(match cmd { "open_by_urn" => ("Opening a cloud design".into(), format!("from your hub: {}", args["name"].as_str().or(args["urn"].as_str()).unwrap_or("").chars().rev().take(40).collect::<String>().chars().rev().collect::<String>())), "open_cloud_file" => ("Opening a cloud design".into(), format!("from your hub: {}", args["fileName"].as_str().or(args["name"].as_str()).unwrap_or(""))),- "show_schematic" => ("Switching to the schematic".into(), "Fusion's electronics design: the schematic sheet".into()),- "show_2d_board" => ("Switching to the 2D board".into(), "the board editor: copper, pours and parts".into()),- "show_3d_board" => ("Switching to the 3D board".into(), "the 3D PCB: every component body in place".into()),+ // view switches are instant and callers repeat them (an AI flow asks for the board on every landing):+ // a palette per switch never got its 25 quiet seconds and sat over Fusion at 0% for a whole routing pass+ "show_schematic" | "show_2d_board" | "show_3d_board" => return None, "import_step" | "import_file" => ("Importing a model".into(), name("filePath").unwrap_or_default()), "import_electronics" | "new_electronics_from_eagle" => ("Importing an electronics design".into(), name("filePath").or(name("schPath")).unwrap_or_default()), "export_step" | "export_stl" | "export_f3d" | "export_glb" | "export_gerbers" | "export_bom" => (format!("Exporting {}", cmd.trim_start_matches("export_").to_uppercase()), name("outputPath").unwrap_or_default()),
skills/fusion-eagle-commands/SKILL.md+9@@ -140,3 +140,12 @@ When you verify a new command works, add it here with the date so future session ## Adding new commands to this doc This file is the source of truth — edit it directly and commit. The CLI's `fusion_electron_run` help points here via its `note` field. No rebuild required.++## Traps that cost a board (2026-10-08, the TPS54202 buck)++- **DELETE at a point can delete a whole part.** In the board editor a point that lands on a part's own tPlace artwork picks the PART, and DELETE removes the element with its connections (J4 and MP4 went this way during a silkscreen cleanup). Delete only at a plain text's or a smashed name's exact origin (that removes just the text), never on a line, and compare the element count before and after.+- **CHANGE at a point does not land** in Fusion's board editor (CHANGE LAYER 51 (x y), CHANGE SIZE (x y)), and neither does CHANGE by name ('R1>NAME'). Move and rotate by name (MOVE 'R1>NAME' (x y), ROTATE =R90 'R1>NAME') inside a SCRIPT; remove a text with DELETE at its origin.+- **`fusion_board_source` saves a new cloud version** each time it reads the board, so an edit is never left unsaved and closing without saving does not undo it. To undo, promote the earlier version: `fusion_aps_versions {query}`, then in `fusion_run_modeling_script`: `app.data.findFileById(<lineage urn>).versions` and `.promote()` on the clean one; close the open copy with `fusion_close_document {name, save:false}` and reopen.+- **`fusion_close_document` with no name closes the ACTIVE document.** Always pass `{name, save:false}` (or `save:true`).+- **Never close the bridge's "ADOM" panel window with a window-close call** (`desktop_close_window`): it closes Fusion with every open document. Click the panel's own Close button, or leave it; it is parked small at the lower right.+- **A SCRIPT stops at a dialog.** When a script's command raises a Fusion dialog, the rest is refused with "dialog is up"; check the reply and the board after every script.