Surface::convert_uv_from_step_to_nurbs / convert_uv_from_nurbs_to_step had no Torus arm,
so a torus took the base identity. Upstream SmTorus overrides both (SmTorus.h:184/:190);
the ported overrides (surface/torus.rs) were never dispatched. In BooleanPostProcess the
merge of two torus faces then united a NURBS domain with a STEP-degree domain and
re-trimmed the merged face in it: box ∩ tangent torus lost volume (seed 86: 23.57 against
C++ 104.84).
Difftest: boolean.api_brep gains a torus operand kind and a measured call (volume and face
areas), 8 issue383 cases and 12 torus_guard cases (radius boundaries, horn, huge scale).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJzQKZ9sjU1DhgS253e8J5
- topology::brep_data_write / geometry_write: write B-reps and geometry to the SMLib
database format; topology::part_file: read part files.
- difftest units topology.part_file and corpus.parity (whole upstream TestFiles corpus,
Rust vs C++), with their shims and FFI, plus the corpus example.
- Fixes found by the corpus in line, ellipse, plane, offset-surface, B-spline and
surface code.
- WR-449: one sphere_diff fillet face integrates 0.6 too much area upstream; its area and
volume are exempted in corpus.parity, cause under investigation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJzQKZ9sjU1DhgS253e8J5
Use SM_TYPE for the observed type, avoiding signed-to-unsigned
aggregate narrowing on Clang without a cast or warning suppression.
Exact-base syntax control fails; the one-field remedy passes with
identical flags and headers. No solver or observation values change.
Exact one-field scope released by original author @tdamsma:
https://github.com/tangency-labs/solidcore/pull/1127#issuecomment-6423035540
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Use SM_TYPE for the observed type, avoiding signed-to-unsigned
aggregate narrowing on Clang without a cast or warning suppression.
Exact-base syntax control fails; the one-field remedy passes with
identical flags and headers. No solver or observation values change.
Exact one-field scope released by original author @tdamsma:
https://github.com/tangency-labs/solidcore/pull/1127#issuecomment-6423035540
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
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>
Preserve immutable/self APIs and legacy fixture/generator streams.
Add independent native/Rust face construction and curve/point records.
Native production checks remain blocked by baseline Clang narrowing;
keep the feature draft pending those gates.
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Construct only the two verified fixed plane and creased inputs. Reuse the existing p10 graph and sampled-geometry observer with its full snapshot metadata, without changing existing operations.
Co-Authored-By: Codex <noreply@openai.com>
MakeAnalyticCornerSurface's SER / NER exits return TRUE without adding a
surface, so the MakeFaceBrep that follows sees m_vSurfaces unchanged (none in
the harness: it returns at once). The shim's pre-check treated every TRUE as a
surface added and refused the corners whose edge curve is NULL, although
upstream never copies those curves. Split P3A_TRUE into a surface exit and a
status exit; a planar corner's status exit after SetCurve(NULL) still refuses
when the corner already had one surface (MakeFaceBrep would copy the deleted
curve). Nine generated corner cases of blend.fillet_corner_p3 now compare
(rejected 28 -> 19), all passing.
Every remaining refused case was run natively with the pre-check bypassed:
each crashes in upstream (SIGSEGV), hangs in CreateExtendedSurface (HANG-9) or
calls a member through a null solver. Runner headers say so; the p2 header no
longer implies its rejections come from the find_concave refusal. HANG-9 gets
an addendum for the two side-face triggers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
The large-gap part of sm_RefineCCIToSurfaces (surf/surf/surf move, curve and
edge surface intersections, RefinePoint on both surface pairs and the bounded
recursion) now runs through refine_cci_to_surfaces_mut over ClassGeometryMut,
editing the classification curve, the edge and its UV trim curves. The
part-5 Access trait dispatches the refinement; curve_on_classify_mut inserts
edge solutions through a new intersect_edges_mut with the surface owner
cleared over the edge loop, as upstream.
Fixture route: topology.brep_p2 MergeSsi op (MergeCurvesOnSurface with UV
curves and pOptIntersectionSurface), the IntersectObject::FreeSurface handle
and p10 merge_curves_on_surface_through_surface. New fixture
refine_cci.json: CreatePlanarSectionCurves curves of Solids/nurb_fillet.smb
reaching parts 2a, 2b and 2d.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Adds a MergeBreps runner op (shim op 35, SmBrep::MergeBrep) that puts both
operands in the primary B-rep as SmMerge does, and merged_* cases that run
SetEditing, EdgeFace and FaceFace on faces of that one B-rep.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Adds a SetEditing script op (shim op 34, m_bEditingEnabled), a ChainFaces
marker that lets a FaceFace without input vertices follow a VertexFace or
EdgeFace (the FFI guard now allows exactly that), Vertexuse handles in the
runner's topology_entity, and crossing-plane fixtures. Existing cases are
unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
map_to_2d_on_curve evaluates the UV curve of a curve on this very surface
object (std::ptr::eq with the base surface) instead of returning Unported.
The surface_p9 analytic-surface stub was unreachable: the diagonal
SmCrvOnSurf already holds the analytic surface. Eight sphere and torus
diagonal cases (shim kinds 5 and 6) compare against C++.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
offset_executive_p2: tiny/far-translated boxes build as an empty B-rep and
merged/dropped-face sheets as a degenerate face; both are defined native
results (no crash, hang or UB) and are now built and compared on both sides.
Only a selection of the nonexistent face 0 stays rejected (nothing to run).
trans_sweep_geometry: a curve constructor failure status is compared with
Rust's instead of rejected; null curves are never passed to
CreateWireEdgeFromCurve.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Add a full-only radius_end form for the actual native and Rust public linear-law fillet APIs. Keep the constant wire and API path, share complete output records, and reject unsupported prefix or thumbweight combinations before construction.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
A runtime backtrace shows AdjustConcaveCornerTopology (SmFilletCorner.cpp:7185)
extending the side surface by 10 * dGapDist; with dGapDist == 0 the
CreateExtendedSurface halving loop (HANG-9) never ends. Add an addendum to HANG-9
and point the shim guard comment at it; the guard condition is unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Generated patch and calc_geom corner cases give the model's fillet geometries a base solver
with a cross-section generator, identically in the Rust runner and the shim, so the
analytic-corner fits that read the solver run instead of being refused. The shim now
follows MakeAnalyticCornerSurface past the solver reads (chamfer re-intersection, the
constant radius conversion's generator checks); solver-less geometries stay refused.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
A new classification kind 5 puts the model's side edge use on the first loop of a
target face, so the side face (and its radial's face) exist and
AdjustConcaveCornerTopology reaches the surface extension. Rejected cases 19 -> 7.
The shim also refuses coincident rail points with a zero tolerance, where
CreateExtendedSurface (by 10 * 0) does not return.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf