create_curve_sweep_from_faces sweeps only the faces' edge curves, so a box
face swept along a line with default options (bCapEndsArg false upstream)
is the open 4-face tube of volume 0, as the C++ reference gives. Document
that cap_ends is needed for the 6-face prism.
Add sweep.api_brep fixture op from_box_face (shim op 12): one face of an
SmApiCreateBox B-rep through SmApiCreateCurveSweepFromFaces, compared by
counts, face lists and SmApiBrepComputeVolume. 22 fixture cases (every
face, NULL/uncapped/capped options, oblique and curved paths,
translational, tiny offset box) agree with C++ exactly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
PrimitiveModel keeps one attribute store for all its B-reps, keyed per
B-rep, and every edit (single and two-B-rep edits, the HCR scene copy,
merge stages, the sweep stitch, RemoveFaces / RemoveAllTopology) renames
the touched B-reps' lists in place to the identities it notifies, so the
non-manifold sweeps carry a B-rep's attributes as upstream's
notifications do, reference sharing included. SM_AI_TAG tags of a
tagging sweep live there too and stay on the result. SweepStore moves
an inserted or adopted body's attributes into its shared store and
hands a taken body its lists back.
Difftest: attributed non-manifold sweeps in boolean.api_brep and
attributed curve sweeps from faces / edges in sweep.api_brep; the shims
count only topology users of an attribute (the port keeps none on
geometry). Regression test: tests/issue_1462_sweep_attributes.rs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Keep legacy outputs and generator draws unchanged. Add default-off
linear observations and targeted geometry/query sensitivity controls.
Retain draft status pending full native build and regression gates.
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
125 shims carried private copies of the same small helpers (put_vec, st,
nl_status, Rd, dump_crv, read_nurb, ...). Move the most common, byte-identical
form of each into three headers grouped by the upstream API they need, and have
those shims pull them in with `using sc::<name>;`. Shims with a different
variant keep their own copy; files touched by open PRs are left alone.
`the_context()` stays per shim (its function-local SmContext must not be shared).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FBLgPenT24P1dunqnZR1Dj
Ports the 12 SmApiBrep.cpp functions of the unit: input validation and the
consuming-sweep curve copies match upstream; the SmPrimitiveCreation calls
are UNPORTED stubs (primitive.primitive_creation_p2/p3). Co-ports
SmSweepOptions as primitive::primitive_creation::SweepOptions. Adds the C++
shim, FFI wrapper, difftest runner and upstream-test fixtures, and records
UB-107, UB-108 and HANG-13 found by the C++ reference run.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm