Main now carries its own SurfOfRevolution arms (taken). surface.surf_of_extrusion_p2
took WR-66, so this unit's upstream issues become WR-67 (GetControlPolygon
weights) and WR-68 (IsNurbSurfaceSurfOfRevolution status as TRUE).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
The shared revolution-dispatch fixes are now in main through PR #57. Preserve
its equivalent match arms and the upstream defect records from both branches.
All required local gates pass: 141 units, 88 green, 53 partial and zero failed;
the three topology reports match the full run byte for byte.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Surface::global_surface_intersect dispatches to both overrides (#40's SmPlane
arm and this unit's SmSurfOfRevolution arm), base_global_surface_intersect kept
once. SurfOfRevolution::intersect_with_plane now takes the kernel. Main does not
build (SurfOfRevolution arms missing in surface_point_solve_p1 and
surface_intersector_p3), so the fix from PR #68 is applied verbatim.
surf_of_revolution_p2: 1099 pass, 68 deferred.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Conflicts:
- surface::surface::p2 read_from_db: keep main's PLANE_TYPE reader and
this PR's SURF_OF_EXTRUSION_TYPE dispatch-gap arm.
- plan/STATUS.md, plan/upstream-issues.md: keep both sides. This PR's
issues renumbered past main's: UB-85..UB-89 -> UB-91..UB-95,
WR-63 -> WR-66 (references in modules.toml and findings.md updated).
Wiring: surface.plane_p2 is partial on main, so the
UNPORTED(surface.plane_p2) SmPlane::TrimCurveToPlaneDomain stub in
SurfOfExtrusion::intersect_with_plane is now the real call. difftest
surface.surf_of_extrusion_p2: 1359 cases, 1048 pass (was 971), 0 failed,
311 deferred (plane_p2 133, adv_surface_intersector 97, curve_p9 81).
Main build fix: main did not compile (CI red since the
surface_intersector_p3 / surface_point_solve_p1 merges): four matches
lacked the SurfaceKind::SurfOfRevolution arm. Dispatched as upstream:
IsSingularity and IsOnSeam have no SmSurfOfRevolution/SmBSplineSurface
override (base SmSurface, unported arm); SmSurfacePointSolve's
SM_CAST_PTR(SmBSplineSurface) succeeds for a surface of revolution
(its base); DropToIsoCurve calls the SmSurfOfRevolution override of
CreateIsoParametricCurve.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Preserve both current main findings and the topology contribution's coverage
notes. Main's four missing revolution dispatch arms are addressed by the
maintainer's PR #68; integrate that existing fix before final validation.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Compare 1304 of 1349 part-2 cases exactly, with 45 explicit foreign-callee
deferrals and no failures. Include all request modes, accepted/rejected operation
enums, zero/tiny tolerances and all five solution-node slots.
Resolve shape topology keys to edge curves and face surfaces, with a regression
distinguishing their handles. Document all owned functions and coverage limits;
keep the PR draft until latest-main integration and all final gates pass.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
#41 ported the base SmSurface::GlobalSurfaceIntersect body inline; it now lives in
base_global_surface_intersect, which Surface::global_surface_intersect calls for
every kind except SurfOfRevolution (its override falls back to it). The 34
fall-back cases now defer on intersect.surface_intersector_p5.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Add real shell-vertex B-rep fixtures for the five static entrypoints, plus face
membership and missing-callee cases using native face/wire-edge construction.
Part 2 compares 899 of 942 cases exactly, with zero failures and 43 explicit
deferrals. Workspace tests, native fixture preflights and strict C++ Clippy pass.
Guard the upstream EdgeVertex wrong-class operand without invoking its undefined
cast. A native runtime-type probe and a Rust class-guard regression cover it.
Keep the contribution draft pending final coverage, main integration and gates.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Resolve conflicts in geom/tol.rs (keep surface.surface_p1's CO-PORTED note and
this unit's classification mappings) and plan/findings.md (keep both).
Handle the new SurfaceKind::SurfOfRevolution (SmBSplineSurface base flag) and
Step variants in out_of_bounds. Wire SmTol::GetZoneTol3d(SmSurface),
smsurf_GetSurfaceCache and SmSurface::ApproximateSize to surface.surface_p1:
2088 cases, 1908 pass, 0 fail, 180 deferred (52 moved to surface.surface_p6).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
All local gates pass against the updated main. Full differential validation
evaluates 134 units: 87 green, 47 partial and zero failed. The three part-9/cache
reports remain byte-identical to their focused and committed reports.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Conflicts: Surface::read_from_db now reads SmSurfOfRevolution records (main) and keeps
the SmSurfOfExtrusion record read as a DISPATCH GAP naming this unit (was a self-tagged
UNPORTED stub; review item); plan/findings.md keeps both sections.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
surface.volume_p2 took WR-65, so this unit's upstream issues are renumbered
WR-65 -> WR-66 (GetControlPolygon weights) and WR-66 -> WR-67
(IsNurbSurfaceSurfOfRevolution status as TRUE), with the findings reference.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Keep both sides' SurfaceKind arms (Plane overrides from this unit; the
SurfOfRevolution and Step kinds from main). Add the SmPlane::GlobalSurfaceIntersect
SurfOfRevolution case (orders and UV curves swapped, as upstream), which needs
&Kernel on Surface::global_surface_intersect / intersect_with_plane. Wire the
plane box zone tolerance to Surface::face (surface.surface_p1 is partial):
a plane with a face now defers on SmFace::GetTolerance (topology.face_p2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Use the newly ported revolution surface's virtual iso constructor and B-spline
base. Add 18 direct canonical-cylinder comparisons against the real C++ class.
Refresh cache reports after the upstream dispatch changes and retain explicit
CSI and classification deferrals.
All required local gates pass; full differential validation covers 133 units
with 85 green, 48 partial and zero failed. Part 9 compares 727/778 cases exactly.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Preserve the existing face-silhouette implementation and make it available to
part 2 with the kernel context now required by surface cache construction.
Keep the range-endpoint checkout bridge explicit: an owned cache copy cannot
disable point testing in the shared cache consumed by the point solver.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Remove the duplicate CSI state, preserve the existing part-1 constructor and
wire its surface/node/point validity helpers. Add 16 real-plane fixtures without
diagonals and refresh differential reports after the main integration.
Part 9 compares 709/760 cases, cache part 2 808/905 and cache part 3 450/600;
all compared values are identical and all remaining deferrals name their owner.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep this unit draft while the remaining face and brep entrypoint fixtures and
latest-main integration are completed. Compare 779 cases exactly against C++,
with three explicit topology.edge deferrals; exercise point-node storage and
surface-tree handle mapping without changing numerical tolerances.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Wires the plane/projected-generator box test of IntersectWithPlane now that
surface.surface_p1 provides SmSurface::GetFace; adds disjoint-box fixtures,
the plan status (partial: 923 pass, 373 deferred), findings and upstream
issues UB-85..UB-89, WR-63.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Edge use and face use queries, mate/radial, UV trim curve slot,
gap entry points, face use collections and the SmEdgeuse.cpp statics.
Co-ports the minimal use records (Region, Faceuse, Loopuse, Edgeuse,
Vertexuse) and gap data into the Brep skeleton; difftest imports
real SmBreps (upstream .smb files, wire edges, faces, the
my_test_topology network) exported by the shim.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Resolve against surface.surface_p1 (#43) and surface.cone_p1 (#31): keep both
SurfaceKind variants (SurfOfRevolution, Step) in every match, give the
surface of revolution its SmSurface dispatch in surface::surface::p1
(EvaluateSTEP override, inherited SmBSplineSurface bodies), share one
ConvertDomainFromNURBSToSTEP body, and wire the cone's SmSurfOfRevolution
Transform/ReadFromDB back-edges. surface.torus becomes green.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm