Shim: Reverse/Rebuild report SM_ERR when no NURB can be made (upstream
dereferences NULL); side_free_copy keeps a degenerate placement exactly.
ffi: reject |n|^2 < 1e-24 normals (uninitialised axes upstream) and
non-positive extension distances (endless loop upstream). New Extend op
(both CreateExtendedSurface overloads), generated and in extend.json; the
reviewer's adversarial cases in zz_adv.json minus the zero normal and the
lazy-NURB sequences.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
Plane kind of Surface with constructors, evaluation, projection, MakeNurb,
DropPointFast, GlobalLineIntersect, TrimPlaneLineToPlaneDomain,
CreateIsoParametricCurve, DropCurve, CoincidenceCheck, Reparameterize,
ToggleSwapUVBit, RebuildSTEPFromNURBParameters and the re-dispatched
SmBSplineSurface methods; C++ shim, ffi binding, difftest runner and
fixtures. Wires the UNPORTED(surface.plane_p1) stubs in
nurbs.b_spline_surface_p1/p2.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero