master
John Lauer Add bounded obstacle planning and live calculations using the Adom activity palette e936bc3 1mo ago

Live Fusion trace routing

Development branch feature/per-net-trace-routing, based on wiki adom/fusion-bridge commit 3e27d7f04743fef7a864bbc84bc0abc7bbabbe86 (version 1.9.366). Initial runtime version: 1.10.0-dev.routing.1. The 24-net crossover extension uses 1.10.0-dev.routing.2.

This adds three bridge verbs that edit and inspect the live Fusion board. The caller supplies the paths. This is explicit copper creation, not an obstacle-avoiding autorouter or a production PCB design.

Verb Purpose
fusion_routing_state Fresh export: document creation ID, geometry revision, pad coordinates, net membership, traces, vias and remaining airwires. Requires expectDocument.
fusion_route_net Validate and add one net's explicit path(s). Requires expectDocument, boardId, expectedRevision, net, and points or paths. Returns verified copper and the new revision. dryRun:true does preflight only.
fusion_routing_drc Recompute airwires, run Autodesk DRC and read its native error objects through ULP. Reports errors, warnings, approved violations and airwires. Does not clear or approve errors.

Coordinates and dimensions are millimetres. Layers are 1 (top) and 16 (bottom). A waypoint is [x,y], {pad:"J1.1"} or {x,y,layer}. A layer marker changes the outgoing layer at that point and creates a through via. Defaults: 0.25 mm width, 0.6 mm via diameter, 0.3 mm drill, 0.2 mm clearance lower bound. Board and net-class minimums can make the required clearance larger.

Each call reads the board on Fusion's main thread, checks identity and revision, preflights all requested geometry, creates copper with complete EAGLE commands, recalculates airwires, repaints and exports again to verify the entire copper delta. Fusion can split an existing wire when a branch attaches to its middle; comparison uses occupied centerline intervals to tolerate that without accepting a different route. The test's 20 requested segments therefore become 21 stored segments when Fusion inserts the branch junction.

The Rust executable embeds rust/bridge/src/routing_script.py and sends it through the already installed add-in's script transport. Developing these verbs does not require restarting Fusion or replacing its loaded Python modules. The Python server has a compatibility handler for source-based installations.

Current limits

The conservative geometric preflight supports two-layer boards with rectangular outlines, straight copper, through vias and embedded pads/SMDs. It refuses polygons, curved copper, restrict/copper artwork, milling and footprint holes it cannot model. Pad obstacles use bounding circles, so some legal routes are conservatively rejected. This is not a complete implementation of Autodesk's rules; use native DRC to establish the final result. Arbitrary bend preferences may change the route generated by LINE; exact read-back rejects that result. The verified demo uses horizontal and vertical segments.

A call is not an atomic transaction. A via and its drill change can occupy two native Undo steps. On execution failure or read-back mismatch, copper may already exist; the result reports that and the caller must inspect state before retrying. There is no blind retry, automatic rollback, file rewrite, fake canvas or simulated animation. The exported schematic accompanies the board fixture but the live test opens the local board directly; it does not claim a cloud-linked schematic/project was created.

Build and test

python3 demo/routing/make_fixture.py demo/routing/fixture
python3 -m unittest discover -s tests -p test_routing.py -v
cargo test --manifest-path rust/Cargo.toml -p adom-fusion-bridge routing::tests
cargo build --manifest-path rust/Cargo.toml -p adom-fusion-bridge \
  --target x86_64-pc-windows-gnu --release

For development installation, stage the compiled exe on the host, pin fusion360 with bridge_dev_mode, pause the bridge's routing, stop only its service, and run tools/install-routing-dev.ps1 -Cache <cache> -Staged <exe>. It requires the pin, backs up the current exe and manifest, preserves unrelated manifest fields, and verifies the copied executable's hash. Resume the bridge, wait for it to answer, and verify the actual bridgeVersion returned by a new routing verb. The host application's documents stay open. Keep the pin until the development build is deliberately retired.

Reproduce the demo

Stage both fixture files to a fresh host directory. Open fusion-routing.brd with fusion_open_board and verify the PCB Editor, three elements and 13 pads. Do not overwrite an open file. The original source fixture contains no copper. Resolve the real Fusion HWND with desktop_list_windows. Foreground only if the user asked to watch; window capture also works in the background.

python3 demo/routing/run_demo.py --target AdomLapper --hwnd <Fusion HWND> \
  --record --output demo/routing/evidence/new-take

The script refuses pre-existing copper and preflights the complete plan before recording. It commits one trace or via per request and runs native DRC after each net. --per-net exercises a whole net per request instead. It captures only the Fusion window, finalizes even on a failure, and stores every call's arguments, elapsed time and response. There is a deliberate 0.2-second pause between traces to keep changes readable. Geometry comes from the accompanying explicit plan, adapted from the KiCad Astra test coupon. It is not a claim that Astra independently solved a congested board during this take.

Live acceptance — AdomLapper, 2026-09-05

The recorded per-trace run connected six nets and 13 pads with 21 stored copper segments and two vias. Native Autodesk DRC returned zero errors, zero warnings, zero airwires. Wrong-net, wrong-board, stale-revision and crossing-clearance rejections passed without mutation; dry-run left the revision unchanged. Native Undo removed the last segment and restored one airwire; Redo restored exactly the final geometry revision.

Whole-net mode also passed with the same final counts and a clean native DRC.

The original MP4 is retained locally in videos/ (excluded from the branch); the recorder reported 806 frames at 2564 x 1540. Detailed acceptance is in evidence/final-take/result.json; per-call evidence is in the same directory. The native and EAGLE board exports are in evidence/boards/ and on the host under C:/Users/john/Documents/fusion-routing-dev/.

Autodesk's primary references: LINE, VIA, DRC, UL_ERROR.

The final take explicitly repaints the unrouted board before recording. The share copy videos/fusion-live-trace-routing.mp4 is resized to 1920 pixels wide and H.264-compressed with original timestamps; there are no editorial cuts or playback-speed changes. Raw recorder elapsed time and encoded duration are reported separately in evidence/final-video-recording.json and evidence/final-video-probe.json. The first and final video frames were inspected and the full share copy decoded successfully.

The shareable video is also saved on AdomLapper at C:/Users/john/Documents/fusion-routing-dev/fusion-live-trace-routing.mp4.

Captioned showcase

python3 demo/routing/render_showcase.py creates videos/fusion-routing-showcase-3x.mp4 from the preserved final raw take. It keeps the full sequence, plays routing at a labeled 3x speed, and adds a five-second final hold. No idle intervals are removed from this already short take. ASS captions identify Codex Astra in Adom Hydrogen, explicit planned waypoints, the Fusion verbs and this board's measured DRC result.

The adjacent .ass and .edit.json preserve captions and edit provenance. The renderer checks the output dimensions and duration and fully decodes it; results are in evidence/showcase-video-validation.json. Delivery target: C:/Users/john/Documents/Adom Routing Demos/fusion-routing-showcase-3x.mp4.

Obstacle-aware planning extension

Development build 1.10.0-dev.routing.4 adds fusion_plan_route, a bounded read-only orthogonal A* planner using the same two-layer clearance model. It calculates waypoints from live pads and existing copper. See obstacles/README.md for inputs, limits, native insertion regression and the three-case live demonstration. This extends the explicit-route APIs above.