# Fusion 360 bridge verbs

Drive Fusion 360: CAD export, cloud docs, EAGLE electronics, manufacturing, UI.

_Part of the [Adom Desktop verb reference](VERB-REFERENCE.md). Invoke as `adom-desktop <verb> '<json>'`._

> **Note:** Two-tier architecture: bridge (port 8773) handles launch/detection; AdomBridge add-in (port 8774) handles exports/queries inside Fusion.

> **Workflow:** fusion_start -> fusion_open_cloud_file or fusion_open_board -> work -> fusion_close

## cad_3d

### `fusion_export_3mf`

Export active design as 3MF

**Args:**
  - `outputPath` — required

**Prerequisite:** Active 3D design


### `fusion_export_dwg`

Export active design as DWG

**Args:**
  - `outputPath` — required

**Note:** Not available via API (dialog only). Use fusion_export_step or fusion_export_dxf instead.

**Prerequisite:** Active 3D design


### `fusion_export_dxf`

Export active design as DXF

**Args:**
  - `outputPath` — required

**Note:** Not available via API (dialog only). Use fusion_export_step or fusion_export_iges instead.

**Prerequisite:** Active 3D design


### `fusion_export_f3d`

Export active design as Fusion 360 archive (.f3d)

**Args:**
  - `outputPath` — required

**Note:** Native Fusion format — preserves parametric features, history, component references

**Prerequisite:** Active 3D design


### `fusion_export_fbx`

Export active design as FBX

**Args:**
  - `outputPath` — required

**Note:** FBX only — no fallback. Not available in current Fusion builds. Use fusion_export_usdz or fusion_export_step instead.

**Prerequisite:** Active 3D design


### `fusion_export_iges`

Export active design as IGES (.igs)

**Args:**
  - `outputPath` — required

**Note:** Legacy CAD interchange. STEP is preferred for modern workflows.

**Prerequisite:** Active 3D design


### `fusion_export_obj`

Export active design as OBJ

**Args:**
  - `outputPath` — required

**Note:** Not available via API (dialog only). Use fusion_export_stl or fusion_export_usdz instead.

**Prerequisite:** Active 3D design


### `fusion_export_sat`

Export active design as SAT (.sat, ACIS solid model)

**Args:**
  - `outputPath` — required

**Note:** ACIS kernel format — opens in SolidWorks, SpaceClaim.

**Prerequisite:** Active 3D design


### `fusion_export_skp`

Export active design as SKP (SketchUp)

**Args:**
  - `outputPath` — required

**Note:** Not available via API (dialog only). Use fusion_export_step or fusion_export_stl instead.

**Prerequisite:** Active 3D design


### `fusion_export_step`

Export active design as STEP

**Args:**
  - `outputPath` — required

**Prerequisite:** Active 3D design (not Electronics)


### `fusion_export_stl`

Export active design as STL

**Args:**
  - `outputPath` — required

**Prerequisite:** Active 3D design


### `fusion_export_usdz`

Export active design as USDZ (best for digital twins + GLB)

**Args:**
  - `outputPath` — required

**Note:** Preserves component hierarchy, PBR materials, named nodes. Ideal for Blender→GLB or direct iOS/macOS AR viewing.

**Prerequisite:** Active 3D design


### `fusion_get_design_info`

Get active design metadata (bodies, components)

**Prerequisite:** Active 3D design


### `fusion_get_parameters`

List user parameters from active design


### `fusion_import_step`

Import STEP/STL/IGES/SAT/OBJ/F3D file into Fusion

**Args:**
  - `filePath` — required Windows path


### `fusion_set_parameter`

Modify a user parameter

**Args:**
  - `name` — required
  - `value` — required


### `fusion_take_screenshot`

Capture Fusion viewport as PNG with camera orientation control

**Args:**
  - `height` — optional (default 1080)
  - `orientation` — optional: home, front, back, top, bottom, left, right
  - `outputPath` — required
  - `width` — optional (default 1920)

**Note:** Uses Fusion's render API (Capture Image) — not a window screenshot. Supports all standard views for product images/icons.


## cloud

### `fusion_check_recovery`

Check if a cloud file has crash recovery data

**Args:**
  - `fileName` — required
  - `folderPath` — optional
  - `projectName` — optional

**Note:** Check BEFORE opening files to avoid blocking recovery dialog


### `fusion_create_cloud_folder`

Create folder (idempotent)

**Args:**
  - `folderName` — required
  - `parentPath` — optional
  - `projectName` — optional


### `fusion_delete_cloud_file`

Delete a cloud file (must not be open)

**Args:**
  - `fileName` — required
  - `folderPath` — optional
  - `projectName` — optional


### `fusion_export_cloud_file`

Export active document to local file (step/stl/f3d/iges/sat/smt)

**Args:**
  - `format` — optional (default: step)
  - `outputPath` — required


### `fusion_list_cloud_files`

List files and subfolders in a cloud project/folder

**Args:**
  - `folderPath` — optional
  - `projectName` — optional


### `fusion_list_cloud_projects`

List all cloud projects in user's hub


### `fusion_open_cloud_file`

Open a cloud file by name. STOPS if recovery exists — you must specify recovery='open' or recovery='discard'

**Args:**
  - `fileName` — required
  - `folderPath` — optional
  - `projectName` — optional
  - `recovery` — optional: open|discard


### `fusion_save_to_cloud`

Save active document to Fusion cloud

**Args:**
  - `description` — optional
  - `folderPath` — optional
  - `name` — required
  - `projectName` — optional


### `fusion_search_cloud_files`

Search a cloud project / subfolder by file-name substring. Returns matches + a detailed scope analysis. Use this for targeted lookups; for exhaustive whole-cloud walks prefer fusion_walk_cloud_tree.

**Args:**
  - `folderPath` — optional starting subfolder (default: project root). NARROW THE SCOPE HERE — naming the right subfolder can reduce search time 10-50x.
  - `folderTimeout` — optional int seconds per-folder cloud-API timeout (default 30)
  - `maxDepth` — optional int (default 2, no upper cap)
  - `maxFolders` — optional int (default 10, no upper cap). For exhaustive 100+ folder searches consider walk_cloud_tree.
  - `maxResults` — optional int (default 20, no upper cap)
  - `projectName` — optional (defaults to active project)
  - `query` — required case-insensitive substring of the file name
  - `recursive` — optional bool (default false). false = root folder only (fast); true = descend into subfolders.
  - `searchTimeout` — optional int seconds overall wall-clock timeout (default 120). If you set this >180, also pass timeout:<N> to the bridge so the HTTP waiter doesn't give up first.

**Returns:** data{files[], totalFound, foldersSearched, foldersSkipped, filesSkipped, searchComplete, truncated, folderLimitReached, searchTimedOut, elapsedSeconds, costAnalysis{foldersPerSecond, estimatedSecondsPer100Folders}, hint}

**Note:** All defenses (per-folder timeout, doEvents, per-file try/except, watchdog) make hard caps unnecessary. Defaults are conservative; raise maxFolders/maxDepth/maxResults for thorough searches.


### `fusion_walk_cloud_tree`

Walk a cloud folder tree iteratively (BFS) and return a flat list of folders + files with full paths.

**Args:**
  - `extensions` — optional list of extensions to include, e.g. ["f3d","fprj"]
  - `folderPath` — optional starting folder (defaults to root)
  - `includeFiles` — optional bool (default true) — set false for folder-only tree
  - `maxDepth` — optional int (default 10)
  - `maxFolders` — optional int (default 500, truncates if exceeded)
  - `nameContains` — optional case-insensitive substring filter on file names
  - `projectName` — optional (defaults to active)

**Returns:** folders[], files[] (each with path), stats{foldersVisited, filesFound, truncated}

**Note:** Single add-in call does the entire walk. No sleeps, no batching. For targeted finds use nameContains; for exports use extensions.


## electronics

### `fusion_board_info`

Get structured board data: components, nets, traces, DRC violations

**Note:** Much richer than a screenshot — exact coordinates and connectivity

**Prerequisite:** Board open in PCB Editor


### `fusion_electron_run`

Execute EAGLE command (WINDOW FIT, DISPLAY ALL, RATSNEST, DRC, etc.)

**Args:**
  - `command` — required EAGLE command string

**Returns:** activeWorkspace, fusionOperations[] (diff of internal log), _hint

**Note:** Fire-and-forget: never returns output. Use fusion_board_info for data. Full command reference with safe/blocking split: skills/eagle-commands.md (ships next to this CLI binary). Avoid blocking commands: WRITE, ADD, SHOW, MOVE, CHANGE, EDIT.


### `fusion_execute_text_command`

Low-level Fusion app.executeTextCommand() access

**Args:**
  - `command` — required Fusion text command


### `fusion_export_eagle_source`

Export active electronics document as plain EAGLE .sch or .brd XML — extracts from Fusion's .fsch/.fbrd ZIP container

**Args:**
  - `outputPath` — required — full path ending in .sch or .brd

**Note:** Produces valid EAGLE XML (<?xml><eagle version=...>) parseable by standalone EAGLE, KiCad import, or any XML tool. For Fusion-native format use fusion_export_source instead.

**Prerequisite:** MUST have correct editor active: PCB Editor / Board Layout for .brd, Schematic Editor for .sch


### `fusion_export_lbr`

Export library as .scr script (no 3D refs)

**Args:**
  - `outputPath` — optional


### `fusion_export_source`

Export active electronics document as .fsch (schematic), .fbrd (board), or .flbr (library) source file

**Args:**
  - `outputPath` — required — full path with extension (.fsch, .fbrd, or .flbr)

**Note:** Always export .fbrd FIRST (from board view), then switch to schematic for .fsch. If file not created, wrong workspace is active — screenshot to check.

**Prerequisite:** MUST have correct editor active: Board Layout for .fbrd, Schematic Editor for .fsch


### `fusion_import_electronics`

Import Fusion-native .fsch/.fbrd/.flbr file as new local electronics project

**Args:**
  - `filePath` — required Windows path to .fsch, .fbrd, or .flbr file

**Note:** Creates a NEW local document via Document.newDesignFromLocal. Use fusion_save_to_cloud to persist afterward. For legacy EAGLE files use fusion_open_schematic (.sch), fusion_open_board (.brd), or fusion_open_lbr (.lbr).


### `fusion_list_text_commands`

List available EAGLE text commands in current context


### `fusion_open_board`

Open .brd in Board Layout editor

**Args:**
  - `filePath` — required


### `fusion_open_electronics`

Check if Electronics workspace is active


### `fusion_open_lbr`

Open .lbr library in Electronics Library editor

**Args:**
  - `filePath` — required


### `fusion_open_schematic`

Open .sch in Schematic Editor

**Args:**
  - `filePath` — required


### `fusion_show_2d_board`

Switch back to 2D board layout from 3D view

**Note:** EAGLE commands only work in 2D view


### `fusion_show_3d_board`

Switch to 3D PCB view (board needs outline on layer 20)

**Prerequisite:** Board must be open in PCB Editor


## lifecycle

### `fusion_activate_document`

Switch to an open document tab by name or type

**Args:**
  - `documentType` — optional: Electronics|PCB|FusionDesign|Drawing
  - `name` — optional substring match


### `fusion_close`

Close Fusion 360 gracefully


### `fusion_close_all_documents`

Close all open documents

**Args:**
  - `saveChanges` — optional bool (default: false)

**Note:** Call before force-killing Fusion to prevent recovery files


### `fusion_close_document`

Close a document without save dialog (avoids modal blocking)

**Args:**
  - `name` — optional (default: active)
  - `save` — optional bool (default: false)


### `fusion_close_window`

Close a specific Fusion dialog window by sending WM_CLOSE (equivalent to clicking its X button). Works on dialogs that Escape doesn't close — e.g. 'Recovered Documents'.

**Args:**
  - `hwnd` — required — HWND from fusion_window_info or fusion_dismiss_blocking_dialogs remaining[]

**Note:** Does NOT force-kill — the dialog can still prompt for confirmation. Use when fusion_dismiss_blocking_dialogs reports remaining dialogs that Escape couldn't clear.


### `fusion_dismiss_blocking_dialogs`

First-class blocking-dialog killer. Enumerates all Fusion Qt windows, matches them against a known list of blocking/picker patterns ('What do you want to design?', error toasts, recovery prompts, etc.), and sends Escape to each offending HWND until the add-in main thread reports responsive. Whenever any fusion_* command returns errorCode 'fusion_addin_not_responding', call this FIRST before retrying.

**Args:**
  - `extraPatterns` — optional array of case-insensitive title substrings to also treat as blocking
  - `maxAttempts` — optional int (default 5) — retry loop cap

**Returns:** dismissed[{hwnd,title,pattern}], remaining[], mainThreadResponsive, attempts

**Note:** Idempotent. Safe to call any time. Returns immediately with empty dismissed[] when no blocking dialogs are present.


### `fusion_document_info`

List all open document tabs with cloud metadata for active doc

**Returns:** openDocuments[], activeDoc cloud details (project, folder, version)


### `fusion_get_app_state`

Query open documents, active workspace, Electronics status

**Returns:** workspace, openDocuments[], electronicsActive


### `fusion_start`

First-class Fusion 360 startup. Discovers Fusion360.exe via glob (so version-indirected webdeploy hashes don't matter), verifies it exists BEFORE spawning (no 'Windows cannot find' GUI dialogs), launches it if not already running, waits for the AdomBridge add-in to come online, and auto-dismisses any blocking dialogs via fusion_dismiss_blocking_dialogs. Returns when Fusion is fully ready.

**Args:**
  - `dismissBlockingDialogs` — optional bool (default true) — auto-clear the 'What do you want to design?' picker, error toasts, and other known blocking modals
  - `timeoutSeconds` — optional int (default 120) — total wait for add-in + dialog dismissal

**Returns:** resolvedPath, pid (null if already running), addinReady, dialogsDismissed[], elapsedMs, alreadyRunning

**Note:** ALWAYS use this instead of launching Fusion by hand. It's idempotent — safe to call when Fusion is already running. Process-detection gate means it will NEVER trigger Autodesk's 'Multiple instances are not supported' dialog.


## manufacturing

> detect_layers -> set_design_rules -> DRC -> export_gerbers -> export_bom -> export_cpl -> pull_file

> Board must be open in PCB Editor (use fusion_open_board or fusion_show_2d_board)

### `fusion_detect_layers`

Auto-detect PCB copper layer count (2 or 4) using ULP + CAM comparison

**Returns:** layerCount, is4Layer, method, copperLayers[], nextSteps[]

**Note:** Run first — informs gerber CAM job selection and design rule choice


### `fusion_export_board_image`

Export PNG image with layer presets (top_copper, assembly_top, fabrication, etc.)

**Args:**
  - `dpi` — optional int (default: 300, max: 600)
  - `layers` — optional int[] — custom layer numbers (overrides preset)
  - `listPresets` — optional bool — returns preset list instead of exporting
  - `monochrome` — optional bool
  - `outputPath` — optional (default: C:/tmp/adom-board.png)
  - `preset` — optional: all|top_copper|bottom_copper|top_silkscreen|bottom_silkscreen|top_soldermask|bottom_soldermask|top_paste|bottom_paste|board_outline|drill|assembly_top|assembly_bottom|fabrication

**Returns:** outputPath, dpi, preset, fileSize, nextSteps[]


### `fusion_export_bom`

Export Bill of Materials as CSV (grouped by value+package)

**Args:**
  - `grouped` — optional bool (default: true) — false for one row per component
  - `outputPath` — optional (default: C:/tmp/adom-bom.csv)

**Returns:** outputPath, componentCount, uniquePartCount, nextSteps[]

**Note:** Format: Comment, Designator, Footprint, Quantity, Library


### `fusion_export_cpl`

Export Component Placement List (pick-and-place) as CSV

**Args:**
  - `outputPath` — optional (default: C:/tmp/adom-cpl.csv)
  - `side` — optional: all (default) | top | bottom

**Returns:** outputPath, totalPlacements, topCount, bottomCount, nextSteps[]

**Note:** Format: Designator, Mid X, Mid Y, Layer, Rotation (mm). Compatible with JLCPCB/PCBWay.


### `fusion_export_gerbers`

Export Gerber RS-274X + Excellon drill files as ZIP (auto-detects layers, selects CAM job)

**Args:**
  - `boardName` — optional (default: from active doc name)
  - `layers` — optional: auto | 2 | 4
  - `outputDir` — optional (default: C:/tmp/adom-gerbers/)

**Returns:** zipPath, zipSizeKB, layerCount, files[], nextSteps[]

**Note:** ZIP contains GTL, GBL, GTS, GBS, GTP, GBP, GTO, GBO, GKO, XLN. Ready for fab upload.


### `fusion_set_design_rules`

Apply Adom/JLCPCB design rules (.edru files) — auto-detects 2/4 layer

**Args:**
  - `action` — optional: apply (default) | export | show
  - `layers` — optional: auto (default) | 2 | 4
  - `outputPath` — optional, for export action

**Returns:** edruFile, layerCount, description, nextSteps[]

**Note:** Run DRC after applying rules to check for violations


## recovery

### `fusion_dismiss_recovery`

Dismiss recovery dialogs + relocate recovery files to ~/.adom/recovery/

**Note:** Handles both 'Recovered Documents' list and 'Open recovery instead?' prompts


### `fusion_relocate_recovery`

Move crash recovery files to ~/.adom/recovery/fusion/ (call before launch to prevent dialogs)

**Note:** Files preserved, not deleted. User can manually restore if needed.


## ui_interaction

### `fusion_click_fusion`

Click at coordinates in Fusion window or a specific dialog

**Args:**
  - `hwnd` — optional — target a specific dialog HWND instead of main window
  - `relative` — optional bool (default: true, 0.0-1.0)
  - `x` — required float
  - `y` — required float

**Note:** Relative coords (0.0-1.0) are scale-independent — estimate position as percentage from screenshot. Prefer fusion_send_key for dialogs (enter/escape/tab covers most cases).


### `fusion_screenshot_all`

Screenshot main window + list all dialog windows with HWNDs

**Note:** Use fusion_screenshot_fusion with dialog HWND, or desktop_screenshot_window


### `fusion_screenshot_fusion`

Capture Fusion main window or a specific dialog as PNG

**Args:**
  - `hwnd` — optional — dialog HWND to screenshot instead of main window

**Returns:** savedTo file path

**Note:** Image is downscaled to max 1568px. Use relative coords (0.0-1.0) for clicking — they map to actual window size regardless of image scale.


### `fusion_send_key`

Send keyboard input to Fusion or a specific dialog

**Args:**
  - `hwnd` — optional — target a specific dialog HWND
  - `key` — required string

**Note:** Preferred way to dismiss dialogs: 'enter' to confirm, 'escape' to cancel, 'tab' to cycle buttons. Use click only if tab order doesn't reach the right button.


### `fusion_window_info`

Get main window HWND, title, rect, and all Qt dialog windows

**Returns:** hwnd, title, rect, dialogs[{hwnd, title, className, rect}]

**Note:** Essential for detecting blocking dialogs after operations

