mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
7734ba2300
* claim: #6226 * Offset Face: split a face off its seam and try again, as booleans do (#6226) A hole's wall arrives from a STEP file as one whole turn bounded by one wire that runs along its seam twice, where SolidCraft builds the same wall as two halves. Offset Face heals the body before it moves anything, and healing such a face fails inside truck with `This wire is not simple`, so the panic guard turned the whole operation into a kernel internal error. Since importing is how a part with a hole usually arrives, Offset Face did not work on imported parts with holes at all. `seam_faces` already answers this for booleans: split every such face in two along a plane through its axis, run the operation, and compose the history back over the body as it was given. This gives the offset path the same retry. - `seam_faces::one_body` is `boolean`'s answer for an operation that takes one body, with `needed_one` beside `needed`. - `offset_faces` now does its healing, its face picking and its offset inside one closure, so the retry runs the whole of it on the split body; the first attempt is guarded, so the failure is an error the retry can act on rather than an unwind. The faces are picked per body, because the pieces are numbered differently once a face is split — the points do not move, so they pick the same surface either way. The regression test is in `seam_faces_tests.rs`, beside the boolean ones: a 20 x 20 x 10 block with a 6 mm hole, read back from STEP, whose top moves 2 mm and lands on the same volume as moving the built body's top, with its history intact. Checked against `main` before and after: the three kernel tests that fail here (`blend::…seam_twice`, `step_in::…parallel_body_preparation`, `tests::a_box_cut_round_a_small_hole…`) fail the same way without this change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: CarlosKeese <dudukeese@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>