solidcore

Units / surface

surface.offset_surface green

Layer
31
Upstream lines
1,787
Functions
37
Rust module
surface::offset_surface

Source: crates/solidcore/src/surface/offset_surface.rs

Upstream: source/SMLib/inc/SmOffsetSurface.h, source/SMLib/src/SmOffsetSurface.cpp

Notes

GREEN (PR #62): 3077 difftest cases (77 fixtures + 3000 generated), 3077 pass bit-identical, 0 failed, 0 deferred, max_rel_err 0. Extended 100,000-seed run: 100,076 cases, 100,076 pass, 0 failed, 0 deferred, no crash or hang. Promotes intersect.surface_drop_lib_p2 and nurbs.b_spline_surface_p1 to green (their last deferrals were this unit). Adds SurfaceKind::OffsetSurface, kernel-aware copy/split/extension/planarity dispatch, state-preserving STEP inversion and database dispatch; Surface::create_offset_surface dispatches to the plane, revolution (with approx_tol_3d) and offset overrides; an owning offset is its base's owner (BASE_OWNER, upstream m_pSurface->SetOwner(this)) and hands down the face its own owner chain reaches, so the base's GetFace-based tolerances follow upstream (a face-owned offset's expanded box returns Unported(topology.face_p2) instead of the default zone tolerance; LocalPointSolve_1 on the base takes GetZoneTol3d(GetOwner()) as its loose tolerance), and a non-owning offset's base keeps its caller's owner (Surface::clone_keeping_owner); SmSurface::IsPeriodic ignores Evaluate statuses as upstream (Surface::evaluate_ignoring_status; curve-bounded and STEP surfaces pass the array on to their basis); step_inversion_extending stores the extension an offset base's inversion makes. Wires the offset base into the point solver and the intersector kind test. Constructor nesting bounded at 64, JSON bit-roundtrips preserved. The C++ reference runs in process: the shim guards UB-171, UB-172, UB-173 (boxes and IsPlanar's natural-domain box at every level of the offset chain) and HANG-21 on the actual surfaces as the script runs, without changing valid upstream numerics, and CreateExtendedSurface steps are refused (UB-107, HANG-6 and HANG-22 cannot be guarded outside NLib; the per-case worker process that compared them was split out of this PR for a maintainer-reviewed one); the static FFI checks are otherwise well-formedness (no coordinate cap, scale floor or order cap below 64; a revolution base keeps surface.surf_of_revolution_p1's 1e-6 minimum sizes); generated cases cover magnitudes 1e-9 to 1e150, zero/negative scales and orders up to 8; a BaseOffset op compares the CreateOffsetSurface dispatch through SmSurface* over every base kind (distances relative to the base size: a degenerate generator offset copies an uninitialised dMaxGap3d upstream). Candidates the shim refuses are discarded at generation, never counted as passes. The generator keeps reflection extensions of degree-1 NURBs to C-max (UB-32, as nlib.srf_adv_p1). WR-160..WR-165 intentionally retained (WR-166 fixed in nlib.srf_nurb / nlib.srf_adv_p1). Dispatch gaps: the surface cache box callback of an offset (no kernel, no forwarded basis guesses; unreached); SetOffsetDistance through the intersector's shared surfaces waits on blend.fillet_executive_p1. 37 fns; largest: SmOffsetSurface::EvaluatePlainOrSimple, SmOffsetSurface::CalculateBoundingBox, sm_ExtendSurface, SmOffsetSurface::EvaluatePoint; unit-SCC #22 (220 units); 319 upstream test entry points reach this unit. Back-edges wired (PR #62): the SmOffsetSurface CO-PORTED in blend.fillet_custom_solver (PR #78) is now solidcore::surface::offset_surface::OffsetSurface plus the base-pointer SurfaceId; its evaluation stubs call the port, storing extensions (OffsetSurface::with_evaluator runs inherited SmSurface bodies on the offset), and rpSurface2->LocalPointSolve runs SmSurface::LocalPointSolve on the offset; topology.face_p2's thick-face SmOffsetSurface::EvaluateSimple (PR #91) is wired. No UNPORTED(surface.offset_surface) sites remain. Re-runs: blend.fillet_custom_solver 448 cases, 401 pass, 0 failed, 47 deferred (blend.fillet_standard_solver_p2); topology.face_p2 2692 cases, 2322 pass, 0 failed, 370 deferred (offset deferrals 112 -> 0); mass.integrator 1528 cases, 1521 pass, 0 failed, 7 deferred.; CO-PORTED in intersect.surface_drop_lib_p2 (PR #112): the SmOffsetSurface(d, *this, FALSE, lSingularities) DropCurve hands to SmDropPt -> solidcore::intersect::surface_drop_lib::p2::DropOffset (distance and singularities); wired in PR #62: its DropVectors / EvaluateDirectionalDerivs build the ported OffsetSurface over a copy of the drop surface and run the SmSurface bodies (intersect.surface_drop_lib_p2: 1531 cases, 1531 pass, 0 failed, 0 deferred: green)

Difftest

Cases
3,077
Passed
3,077
Deferred
0
Failed
0
Both errored
0
Max rel. error
0.0
Tolerance
1e-09 rel.
Seeds
16

Blocked by

Nothing: no deferred cases.

Report JSON (per-case results)

Dependencies

Depends on: geom.extent1d green geom.extent2d green geom.extent3d green geom.object partial geom.polar_box green geom.pseudo_box green geom.vector2d green geom.vector3d green nurbs.b_spline_surface_p1 green surface.surface_p1 partial surface.surface_p2 partial surface.surface_p3 green surface.surface_p7 partial topology.database_io green

Soft dependencies: geom.axis2_placement green geom.tol green nlib.srf_adv_p1 green nlib.srf_basic green

Dependents: blend.fillet_geom_p1 claimed blend.fillet_geom_p2 todo blend.fillet_geom_p3 todo blend.fillet_solver_p1 claimed blend.fillet_solver_p3 todo blend.fillet_solver_p4 claimed blend.fillet_solver_p5 claimed blend.fillet_standard_solver_p1 claimed blend.fillet_standard_solver_p2 todo intersect.surface_drop_lib_p3 claimed offset.offset_executive_p1 claimed offset.offset_geometry_creation claimed topology.brep_p2 claimed topology.face_p2 partial

Soft dependents: blend.fillet_corner_p2 todo blend.fillet_custom_solver partial blend.fillet_executive_p2 todo blend.fillet_geom_p5 todo blend.fillet_geom_p6 todo blend.fillet_solver_p2 todo intersect.surface_drop_lib_p2 green intersect.surface_intersector_p1 partial surface.surface_point_solve_p1 green topology.brep_data partial topology.brep_p3 claimed

Upstream functions

Upstream functionDefined atLinesRust (from the file header)
SmOffsetSurface::SmOffsetSurfaceSmOffsetSurface.h:641[OffsetSurface], [OffsetSurface::new]
SmOffsetSurface::GetOffsetDistanceSmOffsetSurface.h:1351[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]
SmOffsetSurface::GetBaseSurfaceSmOffsetSurface.h:1361[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]
SmOffsetSurface::GetExtendedBaseSurfaceSmOffsetSurface.h:1381[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]
SmOffsetSurface::GetMaxAnalyticDomainSmOffsetSurface.h:1391[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]
SmOffsetSurface::GetDegreeSmOffsetSurface.h:1401[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]
SmOffsetSurface::SetOffsetDistanceSmOffsetSurface.h:1511[OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context]
SmOffsetSurface::SetAllowExtensionSmOffsetSurface.h:1521[OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context]
SmOffsetSurface::SetContextSmOffsetSurface.h:1643[OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context]
SmOffsetSurface::GetClassStringSmOffsetSurface.h:2931[OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string]
SmOffsetSurface::GetTypeSmOffsetSurface.h:2931[OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string]
SmOffsetSurface::GetTypeStringSmOffsetSurface.h:2931[OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string]
SmOffsetSurface::SmOffsetSurfaceSmOffsetSurface.cpp:4038[OffsetSurface], [OffsetSurface::new]
SmOffsetSurface::~SmOffsetSurfaceSmOffsetSurface.cpp:1156[OffsetSurface], [OffsetSurface::new]
SmOffsetSurface::operator==SmOffsetSurface.cpp:12830[OffsetSurface::approx_eq]
SmOffsetSurface::CopySmOffsetSurface.cpp:16445[OffsetSurface::copy]
SmOffsetSurface::CreateExtendedSurfaceSmOffsetSurface.cpp:25414[OffsetSurface::create_extended_surface], [OffsetSurface::create_extended_surface_dir]
SmOffsetSurface::CreateExtendedSurfaceSmOffsetSurface.cpp:27621[OffsetSurface::create_extended_surface], [OffsetSurface::create_extended_surface_dir]
SmOffsetSurface::CalculateBoundingBoxSmOffsetSurface.cpp:315137[OffsetSurface::calculate_bounding_box]
sm_ExtendSurfaceSmOffsetSurface.cpp:463107extend_surface (private)
SmOffsetSurface::GetKnotsSmOffsetSurface.cpp:57818[OffsetSurface::knots]
SmOffsetSurface::EvaluateNormalSmOffsetSurface.cpp:60228[OffsetSurface::evaluate_normal], [OffsetSurface::evaluate_normal_extending]
SmOffsetSurface::EvaluatePointSmOffsetSurface.cpp:644103[OffsetSurface::evaluate_point], [OffsetSurface::evaluate_point_extending]
SmOffsetSurface::EvaluateSmOffsetSurface.cpp:75442[OffsetSurface::evaluate], [OffsetSurface::evaluate_extending]
SmOffsetSurface::EvaluateSimpleSmOffsetSurface.cpp:80433[OffsetSurface::evaluate_simple], [OffsetSurface::evaluate_simple_extending]
SmOffsetSurface::GetNaturalUVDomainSmOffsetSurface.cpp:8439[OffsetSurface::natural_uv_domain]
sm_FindNonsingularStepoffSmOffsetSurface.cpp:85886find_nonsingular_stepoff (private)
SmOffsetSurface::EvaluatePlainOrSimpleSmOffsetSurface.cpp:960673plain_or_simple (private)
SmOffsetSurface::ReverseSmOffsetSurface.cpp:16397[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::SplitAtSmOffsetSurface.cpp:165249[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::STEPInversionSmOffsetSurface.cpp:171343[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::SwapUVSmOffsetSurface.cpp:176219[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::TransformSmOffsetSurface.cpp:178944[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::TrimWithDomainSmOffsetSurface.cpp:1846102[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]
SmOffsetSurface::CreateOffsetSurfaceSmOffsetSurface.cpp:196038[OffsetSurface::create_offset_surface]
SmOffsetSurface::ReadFromDBSmOffsetSurface.cpp:219777[OffsetSurface::read_from_db]
SmOffsetSurface::IsKindOfSmOffsetSurface.cpp:22794[OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string]
Module file-header table (24 rows)
RustUpstream
[OffsetSurface], [OffsetSurface::new]SmOffsetSurface, SmOffsetSurface(d, rSurface, bOwnsSurface, lSingularities), ~SmOffsetSurface (Drop)
[OffsetSurface::copy]Copy
[OffsetSurface::approx_eq]operator==
[OffsetSurface::create_extended_surface], [OffsetSurface::create_extended_surface_dir]CreateExtendedSurface (both)
[OffsetSurface::calculate_bounding_box]CalculateBoundingBox
extend_surface (private)sm_ExtendSurface (static)
[OffsetSurface::knots]GetKnots
[OffsetSurface::evaluate_normal], [OffsetSurface::evaluate_normal_extending]EvaluateNormal
[OffsetSurface::evaluate_point], [OffsetSurface::evaluate_point_extending]EvaluatePoint
[OffsetSurface::evaluate], [OffsetSurface::evaluate_extending]Evaluate
[OffsetSurface::evaluate_simple], [OffsetSurface::evaluate_simple_extending]EvaluateSimple
plain_or_simple (private)EvaluatePlainOrSimple
find_nonsingular_stepoff (private)sm_FindNonsingularStepoff (static)
[OffsetSurface::natural_uv_domain]GetNaturalUVDomain
[OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain]Reverse, SplitAt, STEPInversion, SwapUV, Transform, TrimWithDomain
[OffsetSurface::create_offset_surface]CreateOffsetSurface
[OffsetSurface::read_from_db]ReadFromDB
[OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string]IsKindOf, GetType, GetTypeString, GetClassString (SM_COMMON)
[OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree]GetOffsetDistance, GetBaseSurface, GetExtendedBaseSurface, GetMaxAnalyticDomain, GetDegree
[OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context]SetOffsetDistance, SetAllowExtension, SetContext
[SS_UNKNOWN], [MAX_DERIVS]SM_SS_UNKNOWN (SmTypes.h), MAX_DERIVS (local of EvaluatePlainOrSimple)
[MAX_STEPOFF_DEPTH]no counterpart (recursion bound)
[BASE_OWNER]the owner m_pSurface->SetOwner(this) gives an owned base
[OffsetSurface::with_evaluator], [OffsetEval]the offset as an SmSurface for inherited bodies (Evaluate1stDerivatives, ComputeInwardVector, ...)

Upstream tests reaching this unit

prog_test:my_test_extent3d, prog_test:my_test_vector2d, prog_test:my_test_surface_closest_point, prog_test:my_test_drop_point, prog_test:my_test_matrix, prog_test:my_test_reversed_line_join