PrintFrame.from_bed took x = n x ref, so a bed on the XY plane gave print x = world
+Y, y = world -X. The engine isn't the same under a turn about z: the headset got 95
walls / 144 tines in Fusion, 93 / 140 on the site and CLI. x is now ref projected onto
the bed, so an XY bed is the identity frame. Chairs, lampshade, bunny, gree, bear,
zombie, lighthouse and the headset now match the CLI.
Chairs read "3 fins" where the site makes 6 walls; the lampshade "26 fins" for 74.
The headline now counts walls the way the site does (braces + props) and names the
body count beside it when it differs: "6 walls (3 bodies), ...".
The dialog re-synced only on the Tines toggle, so ticking Add sway braces left
Grip from / spacing / depth greyed out (already so on main). The earlier-run note
says support bodies (braces are counted there too); README names Sway brace N.
The split test now runs on a part with fins, braces AND a pad and checks the fin
and pad blocks are byte-identical to the braces-off run; host_report's brace
wording is pinned.
The entry's soup was fins+braces | pad, split only by finTriangles, so Fusion built
a braced 150 mm post as 4 'Support fin' bodies and headlined 4 fins. Now
finTriangles is fins only and swayTriangles follows it (fins | braces | pad); Fusion
splits three ways and counts fins from fins alone. Readouts (host_report) name sway
braces apart from walls. Fusion's Grip from / Brace tine spacing now need Tines too,
as on the site. Fusion add-in 0.6.1.
The braces reach the engine through #127; this is the dialog for them. Off by
default, in their own group with Grip from / Brace tine spacing / Brace depth,
enabled only while the checkbox is on. The readout counts them apart from the
fins -- they hold a tall part's sides, not an overhang, so folding them in
would claim overhangs are served that nothing is under -- and says why none
could stand when they were asked for, including on the "No fins" path, which a
tall part with no overhangs takes.
engine_host.DEFAULTS needed `sway` too: it is an allow-list and drops anything
not in it, so the option would have died there even with the entry point
fixed. That is the same trap twice, now covered by a test on each side.
Tests: 38 pass against the built bundle (34 before). A tall post gets braces
and no fins, brace tine spacing and "grip from" change the result, a 20mm post
reports why it got none, and the checkbox maps onto the engine option while the
fields are ignored with it off.
Manifest 0.5.0 -> 0.6.0. Not yet run inside Fusion.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
v0.5.0 ran in Fusion 2705.1.25 on Apple silicon, so the README's install
section, the release notes and plugins.yml no longer call macOS untested.
Intel Macs still are.
On top of the palette engine host. Since the add-in no longer carries anything
native, packaging is one zip for Windows and macOS.
- build.py --zip writes build/SupportFins.zip (the add-in folder with the
engine bundle; no settings.json, caches or editor files).
- plugins.yml: a fusion job builds the bundle and the zip, runs the tests
(Node runs the engine) and uploads the zip; publish adds it to
plugins-latest, noted as run on Windows and untested on macOS.
- README: install from the zip.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Fusion add-in, cut down to Insert Support Fins and moved off mini-racer.
mini-racer crashes Fusion on macOS (Fusion ships its own libv8 and macOS merges
V8's weak symbols across the two copies), so the website's engine now runs in
Fusion's own browser, in a hidden palette, as the engine-test spike on #83
showed. Nothing native ships: one folder for Windows and macOS.
Python never waits on the palette (its JavaScript runs on Fusion's main
thread). The palette pulls the latest job ('next'), runs computeFinsB64 and
posts the answer ('result'); a newer job replaces one not yet picked up, and a
late answer for an old one is dropped. Python nudges it with
sendInfoToHTML('wake'); the palette also polls (100 ms with the dialog open,
1 s without). When an answer lands, a custom event refreshes the readout and
calls doExecutePreview(), as sway_command did for picks.
- engine_host.py: PaletteEngine, encode_job/decode_result; compute_fins()
keeps its signature and runs the same bundle under Node, for the tests. The
mini-racer vendoring, first-run download and SHA pins are gone.
- palette/engine.html + engine.js: the hidden page (a status line if shown).
Its URL is a file:/// URI: on Windows a bare path reached the browser as
file:///C:%5CUsers... and the page never loaded.
- fins_command.py: _compute is asynchronous (pending, then _finish);
Insert stays disabled until the fins are in.
- sway_core/ and Insert Sway Brace are dropped, since sway braces are moving
onto the shared engine; bodies tagged as braces by 0.4.x still count as
supports.
- build.py only bundles the engine here; packaging and CI follow separately.
Run in Fusion on Windows (2705.1.25): palette ready while hidden; L-bracket at
35 deg gets 4 fins / 20 tines / bed pad with a live preview, a settings change
re-runs it, Insert adds the tagged bodies. Not yet run on a Mac.
Tests: 34 pass (palette protocol, asynchronous dialog, engine under Node).
The sphere test now checks the pad is its own body: since the small-tube and
raster-wall work the engine may add walls under a sphere too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>