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.249
3 files changed
+9−12
.release-page-head+1−1@@ -1 +1 @@-3ba3cb5c112857e34f6bd6ebbd3a78ee78f63dd3+e65a1f36d5b2b0f68cf57ec11c28ca7df4b52160
dashboard/ui/quick-actions.html+1−1@@ -204,7 +204,7 @@ function probe(){return Promise.all(PORTS.map(function(p){return fetch('http://1 function cmd(command,args,opts){opts=opts||{};if(!bridge){return Promise.reject(new Error('not connected'))}var t0=performance.now();var body=JSON.stringify({command:command,args:args||{}});var short=body.length>300?body.slice(0,300)+'...':body;return fetch('http://127.0.0.1:'+bridge.port+'/command',{method:'POST',headers:{'Content-Type':'application/json'},body:body,signal:timeout(opts.timeoutMs||135000)}).then(function(r){return r.json().catch(function(){return{}}).then(function(j){return{status:r.status,j:j}})}).then(function(x){var ms=Math.round(performance.now()-t0);var d=x.j||{};var data=d.data&&typeof d.data==='object'?d.data:d;var ok=x.status===200&&d.success!==false&&data.success!==false&&!d.errorCode;logLine('<span class="t">'+new Date().toLocaleTimeString()+'</span> <span class="v">'+esc(command)+'</span> '+esc(short.slice(0,220))+' <span class="'+(ok?'ok':'err')+'">'+(ok?'ok':'FAIL')+'</span> '+ms+'ms '+esc(summarize(data.result||data))+(d._hint?'\n hint: '+esc(String(d._hint).slice(0,200)):''));if(!ok){var e=new Error(data.error||d.error||d.errorCode||data.errorCode||('HTTP '+x.status));e.code=d.errorCode||data.errorCode||(x.status===403?'web_denied':null);e.payload=data;throw e}return data}).catch(function(e){if(!e.payload)logLine('<span class="t">'+new Date().toLocaleTimeString()+'</span> <span class="v">'+esc(command)+'</span> <span class="err">unreachable: '+esc(e.message)+'</span>');throw e})} // ---- connection ---------------------------------------------------------------------function connect(){status($('connStatus'),'probing 127.0.0.1:24680-24689...');$('connNote').textContent='allow local network access if your browser asks';$('led').className='led';return probe().then(function(b){bridge=b;if(!b){status($('connStatus'),'Adom Bridge not detected','bad');$('led').className='led bad';$('conn').textContent='not connected';$('meta').textContent='is Adom Bridge running?';toast('Adom Bridge not found on 24680-24689. Is ab running on this machine?','err');return null}var wc=b.raw.webControl||{};var m=b.raw.machine||{};var name=m.clientName||m.hostname||'this machine';$('led').className='led '+(wc.enabled?'on':'warn');$('conn').textContent=name+' :'+b.port;$('meta').textContent='ab '+(b.raw.version||'?')+' · web control '+(wc.enabled?'on':'OFF')+' · gate '+(wc.commandGate||'?');$('bpAb').textContent=(b.raw.version||'?')+' on '+name;status($('connStatus'),wc.enabled?'connected, web control enabled':'connected, web control is OFF in ab Settings',wc.enabled?'ok':'warn');$('connNote').textContent='';kv($('connKv'),{machine:name,'ab version':b.raw.version||'?',endpoint:'http://127.0.0.1:'+b.port,'web control':wc.enabled?'enabled':'disabled','command gate':wc.commandGate||'?','handshake required':wc.requireHandshake?'yes':'no','grants':(wc.grants||[]).map(function(g){return g.origin+' ('+g.mode+')'}).join(', ')||'none'});toast('Connected to Adom Bridge on '+name,'ok');$('btnConnect').textContent='Reconnect';return b})}+function connect(){status($('connStatus'),'probing 127.0.0.1:24680-24689...');$('connNote').textContent='allow local network access if your browser asks';$('led').className='led';return probe().then(function(b){bridge=b;if(!b){status($('connStatus'),'Adom Bridge not detected','bad');$('led').className='led bad';$('conn').textContent='not connected';$('meta').textContent='is Adom Bridge running?';toast('Adom Bridge not found on 24680-24689. Is ab running on this machine?','err');return null}var wc=b.raw.webControl||{};var m=b.raw.machine;var name=(m&&typeof m==='object')?(m.clientName||m.hostname||'this machine'):(m||'this machine');$('led').className='led '+(wc.enabled?'on':'warn');$('conn').textContent=name+' :'+b.port;$('meta').textContent='ab '+(b.raw.version||'?')+' · web control '+(wc.enabled?'on':'OFF')+(wc.grantedForYou?' · this page is granted':(wc.promptExpected?' · ab will ask you per command':''));$('bpAb').textContent=(b.raw.version||'?')+' on '+name;status($('connStatus'),wc.enabled?'connected, web control enabled':'connected, web control is OFF in ab Settings',wc.enabled?'ok':'warn');$('connNote').textContent='';kv($('connKv'),{machine:name,'ab version':b.raw.version||'?',endpoint:'http://127.0.0.1:'+b.port,'web control':wc.enabled?'enabled':'disabled','this page':wc.grantedForYou?'granted (no prompts)':(wc.promptExpected?'ab asks you once per command (Allow once / Allow 1 hr / Deny)':'unknown'),'handshake required':wc.requireHandshake?'yes':'no'});toast('Connected to Adom Bridge on '+name,'ok');$('btnConnect').textContent='Reconnect';return b})} // ---- part files ---------------------------------------------------------------------- function resolvePart(){var ref=$('partRef').value.trim().replace(/^\/+|\/+$/g,'');if(!ref)return;status($('partStatus'),'resolving...');part=null;$('btnImport').disabled=true;return fetch('https://wiki.adom.inc/api/v1/pages/'+ref+'/files',{signal:timeout(15000)}).then(function(r){if(!r.ok)throw new Error('wiki answered '+r.status);return r.json()}).then(function(j){var files=j.files||[];var lbr=files.filter(function(f){return /\.lbr$/i.test(f.name)});var steps=files.filter(function(f){return /\.(step|stp)$/i.test(f.name)});if(!lbr.length)throw new Error('this page publishes no .lbr');var base='https://wiki.adom.inc/api/v1/pages/'+ref+'/files/';part={ref:ref,name:ref.split('/').pop(),lbr:{name:lbr[0].name,url:base+lbr[0].name,size:lbr[0].size},steps:steps.map(function(f){return{name:f.name,url:base+f.name,size:f.size}})};kv($('partKv'),{page:'https://wiki.adom.inc/'+ref,library:part.lbr.name+' ('+part.lbr.size+' B)',models:part.steps.map(function(s){return s.name+' ('+s.size+' B)'}).join(', ')||'none (the import will be an unbound library)'});status($('partStatus'),'ready','ok');$('btnImport').disabled=false;$('importNote').textContent=part.steps.length?'one call, then the page polls':'no STEP on this page: nothing to bind';toast('Resolved '+part.lbr.name+(part.steps.length?' + '+part.steps.length+' model(s)':''),'ok')}).catch(function(e){status($('partStatus'),e.message,'bad');toast('Could not resolve the part: '+e.message,'err')})}
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]"+ }+}