← Commit history

Publish 1.9.245

John Lauer ·1894456d66 ·1mo ago ·parent 9a5ad34
3 files changed +19−12
.release-page-head+1−1
@@ -1 +1 @@-d43a384ff56772a655266e58a5d401f68268e13e\ No newline at end of file+9a5ad34cbb1ed7b751dd42ba27a62d8daad77797\ No newline at end of file
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]"+  }+}\ No newline at end of file
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"})