From 05824d14e861d4e052c8cccfde88518c95d9b54b Mon Sep 17 00:00:00 2001 From: alexgavs Date: Tue, 3 Nov 2026 02:19:49 +0200 Subject: [PATCH] docs(reverse): correct scan-to-cad guide on parametric wall thickness inner (loft) and inset.by (sketch) do take a number directly, but the guide implied that was the only way, when exprs.inner and exprs.inset already drive the same wall from a named parameter. Fixes #59. Co-Authored-By: Claude Sonnet 5 --- plugins/reverse/guides/scan-to-cad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/reverse/guides/scan-to-cad.md b/plugins/reverse/guides/scan-to-cad.md index 5e68f2e6..5e3f68d0 100644 --- a/plugins/reverse/guides/scan-to-cad.md +++ b/plugins/reverse/guides/scan-to-cad.md @@ -143,7 +143,7 @@ Build as the model guide's §2 says; what the scan adds: - **Freeform thin shell** (covers, lamp housings, fairings, bezels). Two took 35 min and a three-copy hack to make hollow; the third shelled at 3.4 mm in 29 s from analytic pieces. Choose the route to the thickness before building. - **A decomposition that shells** (the scooter cover, 81 % of the outer skin within ±0.4): the plan as a drafted prism, ∩ (a torus ∪ a fitted B-spline slab), ∩ a visor extrusion, − a rim wedge. The shroud tube is a circle revolved about a far axis, carrying bow and tilt in one; the wing top a `surface` thickened 45 mm down and mirrored; the concave shoulder round goes on the torus ∪ slab union **before** the intersection with the plan prism — on the final body its chain ran on into the plan rounds and failed. - **Form from the outer skin only:** `skin: "outer"` (and `within` to leave the rim out) on every section fit, stack and sketch `fit`; the inner skin carries ribs and bosses — a form fitted on it came out R321 for R587. Compare with `skin: "outer"` until the model is hollow. - - **Thickness, one of three:** (a) **one skin, trimmed, then thickened.** Fit the outer skin oversize: a Patch network's sheet, a `surface` (region by query, `fit.robust`, `expandPct` past every edge) or a sheet. Trim the sheet to the part: `boolean { op: "intersect", body: , tool: }` keeps what lies inside the prism (`cut`, what lies outside) — the prism stays a body, for the next sheet — and `split { body: , tools: [], keep: "scan" }` drops what has no scan behind it (a lip's overshoot past its tip, a sheet's run past another sheet). Then `thicken { sheet, thickness, side }`. It names a face that bends tighter than the wall, and answers the wall reached along the sheet's edge. Trimmed first, the wall's ends stand square to it and round further than a slab cut at a slant. Cut after the thicken (the prism through the slab), the ends run along the cut: take that where the scan's edge runs along the pull. (b) Outer and inner skins both fitted, then `split { body: , tools: [outer, inner], keep: "between" }` — the wall follows the part, no offset. Skins that meet inside the body are refused in a second, saying where: model one skin and thicken it. (c) Inner lofts through inset stations — stations in one call: fit station 1 ("Wing 1") with `fit: { skin: "outer", within, accept: { sigmas: 2, kinds: ["tangent"] } }`, close it with a line across the wall ends at least 2 × the wall below the base (`reverse_sketch_edit`), then one `loft { name: "Wing", sections: [{ sketch: "Wing 1" }, …], fit: { like: "Wing 1", skin: "outer", within }, inner: 2.4, ruled: false }` — `inner` and `inset.by` take the wall as a number, not a parameter's name. Read each of `stations` (`fit` residuals, `reversed`); cut "Wing inner" from the outer after the joins and the mirror; edit stations later with `reverse_feature_update { features }`. One inner twin alone: a sketch with `inset: { by: 2.4, of: "Wing 1" }`. `like` maps pieces at the same [u, v]: parallel planes, or radial ones — not tilted planes that are not parallel. + - **Thickness, one of three:** (a) **one skin, trimmed, then thickened.** Fit the outer skin oversize: a Patch network's sheet, a `surface` (region by query, `fit.robust`, `expandPct` past every edge) or a sheet. Trim the sheet to the part: `boolean { op: "intersect", body: , tool: }` keeps what lies inside the prism (`cut`, what lies outside) — the prism stays a body, for the next sheet — and `split { body: , tools: [], keep: "scan" }` drops what has no scan behind it (a lip's overshoot past its tip, a sheet's run past another sheet). Then `thicken { sheet, thickness, side }`. It names a face that bends tighter than the wall, and answers the wall reached along the sheet's edge. Trimmed first, the wall's ends stand square to it and round further than a slab cut at a slant. Cut after the thicken (the prism through the slab), the ends run along the cut: take that where the scan's edge runs along the pull. (b) Outer and inner skins both fitted, then `split { body: , tools: [outer, inner], keep: "between" }` — the wall follows the part, no offset. Skins that meet inside the body are refused in a second, saying where: model one skin and thicken it. (c) Inner lofts through inset stations — stations in one call: fit station 1 ("Wing 1") with `fit: { skin: "outer", within, accept: { sigmas: 2, kinds: ["tangent"] } }`, close it with a line across the wall ends at least 2 × the wall below the base (`reverse_sketch_edit`), then one `loft { name: "Wing", sections: [{ sketch: "Wing 1" }, …], fit: { like: "Wing 1", skin: "outer", within }, inner: 2.4, ruled: false }` — `inner` and `inset.by` take the wall as a number; drive it from a parameter instead with `exprs: { inner: "" }` on the loft (moves every inner station's `inset` together) or `exprs: { inset: "" }` on one inset sketch — each is taken again from its station when the parameter changes. Read each of `stations` (`fit` residuals, `reversed`); cut "Wing inner" from the outer after the joins and the mirror; edit stations later with `reverse_feature_update { features }`. One inner twin alone: a sketch with `inset: { by: 2.4, of: "Wing 1" }`. `like` maps pieces at the same [u, v]: parallel planes, or radial ones — not tilted planes that are not parallel. - **A skin that turns** (a flange into a curled lip, a cover into its skirt) is two sheets, each fitted along its own direction: 1. Split each by the other, `keep: "scan"`. 2. Join them: `boolean { op: "join", body: A, tool: B }` sews two sheets into one.