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
Publish 1.9.245
3 files changed
+19−12
.release-page-head+1−1@@ -1 +1 @@-d43a384ff56772a655266e58a5d401f68268e13e+9a5ad34cbb1ed7b751dd42ba27a62d8daad77797
page.json+7−10@@ -11,10 +11,6 @@ "uninstall": "./uninstall.sh" }, "tags": [- "ab",- "bridge",- "fusion",- "desktop-app", "fusion360", "autodesk", "cad",@@ -79,10 +75,7 @@ "build a basic parts library", "add a 3d model to a component", "make a fusion 360 library with 3d",- "set up the fusion bridge",- "fusion dashboard",- "fusion status page",- "open the fusion launch page"+ "set up the fusion bridge" ], "discovery_pitch": "Use the Adom Bridge Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Bridge. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).", "brief": "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.",@@ -111,5 +104,9 @@ "label": "Part volume", "prompt": "How much material does each printed part in this assembly use?" }- ]-}+ ],+ "author": {+ "name": "John Lauer",+ "email": "[email protected]"+ }+}
tools/live_feed_drain.py+11−1@@ -8,6 +8,7 @@ Publishes each frame with a kind tag so a viewer never confuses them: [popup #n.m] each owned dialog/panel over it, tied to its tick Proof frames are NOT here; they come from fusion_prove_result evidence[] (kind:proof). """+print = __import__("functools").partial(print, flush=True) import argparse, json, subprocess, sys, time, os, base64 def ab(target, verb, args):@@ -28,10 +29,17 @@ def main(): o = a.parse_args() st = ab(o.target, "fusion_live_feed", {"action": "start", "intervalSec": o.interval, "maxSec": o.max_sec}) print("feed:", "started" if st.get("started") else ("already running" if st.get("alreadyRunning") else st))- since, t0, pushed = 0, time.time(), 0+ since, t0, pushed, spins = 0, time.time(), 0, 0 os.makedirs("/tmp/live_feed", exist_ok=True) while time.time() - t0 < o.max_sec: r = ab(o.target, "fusion_live_feed", {"action": "frames", "since": since})+ if r.get("error") or r.get("errorCode"):+ print("feed call failed:", r.get("error") or r.get("errorCode"), (r.get("_hint") or "")[:120])+ # HONESTY: the box tells us when it is spinning without capturing. Say it, do not hide it.+ if r.get("healthy") is False:+ spins += 1+ if spins in (1, 10) or spins % 60 == 0:+ print("FEED NOT LIVE (tick %s, captured %s): %s" % (r.get("tick"), r.get("captured"), r.get("_honesty"))) for f in r.get("frames") or []: since = max(since, f["tick"]) rf = ab(o.target, "read_file", {"path": f["path"], "encoding": "base64"})@@ -45,6 +53,8 @@ def main(): subprocess.run(["adom-shotlog", "inject", "-c", o.channel, "-d", desc, "-s", "desktop_screenshot_window", "--native", local], capture_output=True, text=True, timeout=30) pushed += 1+ if pushed in (1, 10) or pushed % 100 == 0:+ print("pushed %d frame(s); latest tick %d" % (pushed, since)) if not r.get("running") and since: print("feed ended; pushed", pushed); break time.sleep(o.interval) ab(o.target, "fusion_live_feed", {"action": "stop"})