Upstream's CopyFaces notifies SM_NO_COPY on each copied face, edge and vertex
(SmMerge::MakeFaceuse), so attributes reach the copies as their behaviours say.
The port's copies ran with an empty attribute store.
- topology::brep::p2::CopyNotifyState: notification state for a copy between
two B-reps, holding both B-reps' own attributes (source objects under tagged
copy_source_ref identities) and giving each B-rep its own back.
- topology::brep::p7::copy_faces_from: copy_faces with distinct source
identities (copy_faces delegates to it unchanged).
- SmFeatureExecutive: PartitionFeature and RestoreFeature copy with the
attributes. The patch path does not yet: its merges still differ from SMLib
(finding addendum).
- Shim, FFI and runner: optional SmLongAttribute inputs, plus per-id face and
edge counts of every B-rep in the record; 4 attribute cases (3 pass; the
extrusion case fails until the patch path carries).
- Unit test: copy and reference attributes reach the feature B-rep, temporary
ones do not.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Preserve all existing state observations and add copied-curve interval/evaluation, vertex and tolerance comparisons. Cover tagged decoding and geometry-only mutations; keep the two empty controls. Record-contract docs and the existing FFI prefix test follow the appended graph.
Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
Co-Authored-By: GPT-6.1 Sol Fast <noreply@openai.com>
- ValidatePatch keeps upstream's GetClassType() comparison, which never fails
(WR-new record); the two LShape/Platte prog_test cases now pass.
- The shim refuses DoDefeature scripts that crash upstream: a NULL extended
surface in ExtSurfaceRebuild (-995) and loop edges an applied patch's stitch
deleted (-996). Each script runs in a fresh child process (60 s), so other
native crashes and hangs are reported as rejected (UB-new/HANG-new records).
- 123 generated cases: every face of seven fixtures, rebuild-type matrix,
extension distances, empty/non-bisecting inputs, restore and re-defeature
sequences, fillet-face groups.
- Unit tests for fix_edge_chain_list (closed edges), edge_number_in_brep and
an empty AddFeature; CO-PORTED notes on topology.edge and
topology.topology_traverser.
- Unit blocked: 8 generated cases disagree in ExtSurfaceRebuild patches
(plan/findings/blend.feature_executive--ext-surface-patch-faces-differ.md).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
First cut of SmFeatureExecutive/SmFeature/SmFeatureLoop (AddFeature x3,
DoDefeature, RestoreFeatures, DefeatureAndRebuild, ValidatePatch,
PlanarCapRebuild, ExtSurfaceRebuild, sm_TrimPatches), with co-ported
SmTopologyTraverser::FixEdgeChainList and SmEdge::GetEdgeNumberInBrep.
The shim drives the real executive from a script; fixtures are the
prog_test smFeatureTest cases.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Rebased step 1 + harness onto main; the 14 one-int graph mismatches close
with #1786's arena record removal. CO-PORTED notes cite PR #1821.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds op 24 (`Scale`) to the extent2d shim, calling the real
SmExtent2d::Scale with a NULL or non-NULL pOptScaleV, its solidcore-ffi
selector, and a `scale` runner op. The scale cases are kept apart from the
main generator, so its existing cases keep their inputs: 20 named edge cases
(both factors and None, negative and zero factors, -0, every sentinel end,
values one ulp off a sentinel, huge and tiny factors, an inverted and an
Init extent) and 400 generated ones on their own seeds. The Extent2d::scale
doc now notes that a negative factor leaves the extent inverted, as upstream.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
Resolve topology.assert_valid.toml notes: main's #1631 copy_ops text and
this PR's #1702 WP3b text both kept in place.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Conflicts in the fillet_executive_p3 runner and shim resolved keeping both
forms (attributed and two_offset_chamfer); has_other_form also covers
two_offset_chamfer.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>