Brings in intersect.topology_solver_p1 (PR #30).
- topology_solver sm_GetFaceSilhouettes: wire the UNPORTED(surface.surface_p1)
stub. It now builds the cache with smsurf_GetSurfaceCache (the 3-argument
port), checks HasCachedCurves(SM_AS_TRIMMED_SILHOUETTE, 10 * tol, 20 deg,
view vector, FALSE), and calls CreateSilhouetteCurves over the face's UV
domain (a non-B-spline surface, a NULL SM_CAST_PTR upstream, is an
error). It then stops at UNPORTED(topology.face_p2):
SmFace::CreateCurvesByTrimming.
- Renumber this unit's upstream issues UB-80/UB-81 to UB-83/UB-84. Main's
surf_of_extrusion_p1 and topology_solver_p1 entries already use UB-80/81.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
- StepSurface::knots: ContainsValue's default tolerance is 0, not SM_EFF_ZERO.
- A plane's polar box comes from SmPlane::EvaluateNormal (plane_bounding_box),
also for the surface caches (their plane stub is gone).
- UB-81: SmSurface::CalculateBoundingBox recurses without bound on a polar box of a
curve-bounded or STEP surface; the base body and the cache dispatch refuse it
(InvalidInput), the FFI never asks the C++ for it; the cache's other boxes of
those kinds defer on CalculateContinuities.
- The remaining stubs on this unit become DISPATCH GAPs (iso curve and crv-on-surf
readers, ApproximateSize, the grid, p7's sm_IsNodeValid and solver patch reads).
- FFI: IsOnBoundary / IsInDomain accept points up to a side outside the domain for
planes and clamping B-splines; BBox prints the polar box of B-splines and planes.
- Generators: STEP knot intervals just inside the domain ends, outside points.
- Fixtures: the review's cases. is_planar checks the face owner first; comments on
the hard-coded face state and the B-spline zone tolerance.
difftest: 806 cases, 764 pass, 0 fail, 42 deferred; --perturb 764/764.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- solidcore-ffi: surface_surface_p1 (22 ops, matching the shim's codes 0-21) with
input validation; the shim reads SmPseudoBox::GetBasis and guards
GetDomainWithContinuity without a surface cache (upstream NULL dereference, UB-75).
- difftest: surface_surface_p1 runner (800 generated cases over B-spline, plane and
curve-bounded surfaces, optionally STEP-wrapped): 758 pass bit-identical, 42
deferred, --perturb 758/758.
- Wire SmBSplineSurface's IsDegenerateCurve / IsDegeneratePoint / first-derivative
back-edges and its bounding box zone tolerance (Surface handles a face owner);
retag LocalPointSolve (surface_p5), GlobalPointSolve (surface_p4) and
CreateOffsetSurface (surface.offset_surface).
- trim_srf_cache runner: face cases defer on SmBrep::CreateFaceFromSurface.
- Step arms in the cpp-only runners; clippy fixes; unit tests assert the wired
behaviour.
- plan: surface.surface_p1 partial; findings and upstream-issues entries; reports of
the touched units (all improved, none regressed).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RsMto2bEoBSCSCJku4nT4u