← All Pull Requests

Keep the Adom panel out of the board; Fusion board-editor traps #16

Merged Released in 1.11.40 on 17 Oct 2026 opened by John Lauer 2026-10-08
Merges panel-out-of-the-way → master

Base: HEAD at the time of branching. Three changes:

  1. No panel for instant view switches (rust/bridge/src/palette.rs): show_schematic, show_2d_board and show_3d_board no longer open the "Adom is driving Fusion" panel. Callers repeat them (an AI flow asks for the board on every landing), and a panel per switch never got its quiet seconds, so it sat over Fusion at 0% for a whole routing or silkscreen pass.
  2. A smaller panel, out of the drawing (addin/AdomBridge/commands/activity_palette.py): when the electronics editors leave the palette floating, it is 260 x 120 (was 320 x 210) and parked low on the right over the layer list, not over the canvas. Found filming a silkscreen pass, where it covered the right edge of the board.
  3. Traps that cost a board (skills/fusion-eagle-commands/SKILL.md): DELETE at a point can delete a whole part; CHANGE at a point or by name does not land; fusion_board_source saves a new cloud version each read (undo = promote an earlier version); fusion_close_document with no name closes the active document; closing the ADOM panel window with a window-close call closes Fusion; a SCRIPT stops at a dialog.

Not yet built or signed: the release needs the Windows build signed per PUBLISHING.md. Tested: the panel and traps were all hit live on ConfRoomROG on 2026-10-08; the Python change parses; the Rust change is the one-line verb filter.

🤖 Generated with Claude Code

Diff Skip to comments

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.

Comments

No comments yet.

Log in to comment.