app
Adom Desktop - Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Desktop: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
"""Handler for open_design command.
Opens a design file (.f3d, .step, .iges, etc.) in Fusion 360.
Launches Fusion if it's not already running.
Imports files via the AdomBridge add-in API when available.
"""
import json
import urllib.request
import urllib.error
from pathlib import Path
from fusion_detect import ensure_fusion_running, _is_fusion_running
ADDIN_PORT = 8774
SUPPORTED_EXTENSIONS = {
".f3d", ".f3z",
".step", ".stp",
".iges", ".igs",
".sat",
".stl",
".3mf",
".obj",
}
def _import_via_addin(file_path: str, timeout: int = 30) -> dict:
"""Import a file via the AdomBridge add-in running inside Fusion."""
body = json.dumps({"command": "import_file", "args": {"filePath": file_path}}).encode("utf-8")
req = urllib.request.Request(
f"http://127.0.0.1:{ADDIN_PORT}/command",
data=body,
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=timeout) as resp:
return json.loads(resp.read())
except urllib.error.URLError as e:
return {
"success": False,
"error": f"AdomBridge add-in not responding (port {ADDIN_PORT}): {e}. "
"The add-in is not responding - fix it YOURSELF (never ask the user): fusion_stop + fusion_start reloads it (installed to all add-in dirs incl. FusionAddins).",
}
except Exception as e:
return {"success": False, "error": f"Import request failed: {e}"}
def handle_open_design(fusion_info: dict, args: dict) -> dict:
"""Open a design file in Fusion 360, or just launch Fusion.
Args:
fusion_info: Fusion 360 detection info dict.
args: Dict with:
- filePath: Path to the file to open (optional).
If omitted or empty, just ensures Fusion is running.
"""
file_path = args.get("filePath", "")
# Check if Fusion is installed
if not fusion_info.get("installed"):
return {
"success": False,
"error": "Fusion 360 is not installed on this machine.",
"errorCode": "fusion_not_installed",
"_hint": "Fusion 360 cannot be installed programmatically. Report this to the user and ask them to install it from https://www.autodesk.com/products/fusion-360, then retry.",
}
# Check if Fusion is running (live process check — never auto-launch)
if not _is_fusion_running():
return {
"success": False,
"error": "Fusion 360 is installed but not running.",
"errorCode": "fusion_not_running",
"_hint": "Call fusion_start to start Fusion 360 and wait for the add-in to be ready, then retry this command.",
}
# Launch-only mode: no file specified, Fusion is already running
if not file_path:
return {"success": True, "output": "Fusion 360 is running."}
path = Path(file_path)
if not path.exists():
return {
"success": False,
"error": f"File not found: {file_path}",
"errorCode": "file_not_found",
"_hint": "Verify the path with `ls` or check if the file is in the cloud instead of local — use fusion_walk_cloud_tree to find cloud files, then fusion_open_cloud_file to open them.",
}
ext = path.suffix.lower()
if ext not in SUPPORTED_EXTENSIONS:
return {
"success": False,
"error": f"Unsupported file type: {ext}. Supported: {', '.join(sorted(SUPPORTED_EXTENSIONS))}",
"errorCode": "unsupported_extension",
"_hint": "Use a supported extension, or for electronics files (.fsch/.fbrd/.flbr) use fusion_import_electronics instead.",
}
# Fusion is running — ensure add-in is ready (needed for import)
err = ensure_fusion_running(fusion_info, wait_addin=True)
if err:
return err
# Import the file via the AdomBridge add-in (runs inside Fusion)
return _import_via_addin(str(path))