pub fn thicken_trimmed_sheet(
surface: &NurbsSurface,
loops: &[Vec<NurbsCurve>],
thickness: f64,
symmetric: bool,
) -> Result<BrepSolid, String>Expand description
§5.9 THICKEN a TRIMMED sheet region into a closed solid.
loops are parameter-space curves on surface exactly as FaceRecord
loops store them: the outer loop first, running counter-clockwise in
(u, v), followed by optional hole loops running clockwise (the
same_sense = true convention of validate_uv_wire). Each loop’s
pcurves must chain tip-to-tail and close; a loop may also be a single
closed pcurve (e.g. a rational circle).
symmetric = false: the solid occupies the space between the sheet and its offset at signedthicknessalong the sheet normal n = Su × Sv (negative thickness grows the solid on the −n side).symmetric = true: the material splits evenly, |thickness|/2 on each side of the sheet (the sheet becomes the mid-surface).
The caps are the bottom/top offset sheets trimmed by the SAME pcurve
loops (the offset shares the sheet’s basis, so pcurves transfer
verbatim); every boundary pcurve contributes one ruled side wall between
its bottom and top 3D images, ruled pointwise at equal pcurve parameter —
for an offset pair that ruling runs along the surface normal, so walls
are exact wherever the full-domain walls were. Hole loops produce inner
wall tubes and each adds one handle: genus = loops.len() - 1.
Every boundary edge is a single EdgeRecord shared by exactly two coedges (cap + wall); wall-to-wall junction edges are likewise shared. Refuses (Err) on: zero/non-finite thickness, closed sheets, open or misoriented loops, pinched loops, general (non-iso) pcurves on curved sheets, and offsets through the evolute.