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 function | Defined at | Lines | Rust (from the file header) |
|---|---|---|---|
SmOffsetSurface::SmOffsetSurface | SmOffsetSurface.h:64 | 1 | [OffsetSurface], [OffsetSurface::new] |
SmOffsetSurface::GetOffsetDistance | SmOffsetSurface.h:135 | 1 | [OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree] |
SmOffsetSurface::GetBaseSurface | SmOffsetSurface.h:136 | 1 | [OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree] |
SmOffsetSurface::GetExtendedBaseSurface | SmOffsetSurface.h:138 | 1 | [OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree] |
SmOffsetSurface::GetMaxAnalyticDomain | SmOffsetSurface.h:139 | 1 | [OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree] |
SmOffsetSurface::GetDegree | SmOffsetSurface.h:140 | 1 | [OffsetSurface::offset_distance], [OffsetSurface::base_surface], [OffsetSurface::extended_base_surface], [OffsetSurface::max_analytic_domain], [OffsetSurface::degree] |
SmOffsetSurface::SetOffsetDistance | SmOffsetSurface.h:151 | 1 | [OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context] |
SmOffsetSurface::SetAllowExtension | SmOffsetSurface.h:152 | 1 | [OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context] |
SmOffsetSurface::SetContext | SmOffsetSurface.h:164 | 3 | [OffsetSurface::set_offset_distance], [OffsetSurface::set_allow_extension], [OffsetSurface::set_context] |
SmOffsetSurface::GetClassString | SmOffsetSurface.h:293 | 1 | [OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string] |
SmOffsetSurface::GetType | SmOffsetSurface.h:293 | 1 | [OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string] |
SmOffsetSurface::GetTypeString | SmOffsetSurface.h:293 | 1 | [OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string] |
SmOffsetSurface::SmOffsetSurface | SmOffsetSurface.cpp:40 | 38 | [OffsetSurface], [OffsetSurface::new] |
SmOffsetSurface::~SmOffsetSurface | SmOffsetSurface.cpp:115 | 6 | [OffsetSurface], [OffsetSurface::new] |
SmOffsetSurface::operator== | SmOffsetSurface.cpp:128 | 30 | [OffsetSurface::approx_eq] |
SmOffsetSurface::Copy | SmOffsetSurface.cpp:164 | 45 | [OffsetSurface::copy] |
SmOffsetSurface::CreateExtendedSurface | SmOffsetSurface.cpp:254 | 14 | [OffsetSurface::create_extended_surface], [OffsetSurface::create_extended_surface_dir] |
SmOffsetSurface::CreateExtendedSurface | SmOffsetSurface.cpp:276 | 21 | [OffsetSurface::create_extended_surface], [OffsetSurface::create_extended_surface_dir] |
SmOffsetSurface::CalculateBoundingBox | SmOffsetSurface.cpp:315 | 137 | [OffsetSurface::calculate_bounding_box] |
sm_ExtendSurface | SmOffsetSurface.cpp:463 | 107 | extend_surface (private) |
SmOffsetSurface::GetKnots | SmOffsetSurface.cpp:578 | 18 | [OffsetSurface::knots] |
SmOffsetSurface::EvaluateNormal | SmOffsetSurface.cpp:602 | 28 | [OffsetSurface::evaluate_normal], [OffsetSurface::evaluate_normal_extending] |
SmOffsetSurface::EvaluatePoint | SmOffsetSurface.cpp:644 | 103 | [OffsetSurface::evaluate_point], [OffsetSurface::evaluate_point_extending] |
SmOffsetSurface::Evaluate | SmOffsetSurface.cpp:754 | 42 | [OffsetSurface::evaluate], [OffsetSurface::evaluate_extending] |
SmOffsetSurface::EvaluateSimple | SmOffsetSurface.cpp:804 | 33 | [OffsetSurface::evaluate_simple], [OffsetSurface::evaluate_simple_extending] |
SmOffsetSurface::GetNaturalUVDomain | SmOffsetSurface.cpp:843 | 9 | [OffsetSurface::natural_uv_domain] |
sm_FindNonsingularStepoff | SmOffsetSurface.cpp:858 | 86 | find_nonsingular_stepoff (private) |
SmOffsetSurface::EvaluatePlainOrSimple | SmOffsetSurface.cpp:960 | 673 | plain_or_simple (private) |
SmOffsetSurface::Reverse | SmOffsetSurface.cpp:1639 | 7 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::SplitAt | SmOffsetSurface.cpp:1652 | 49 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::STEPInversion | SmOffsetSurface.cpp:1713 | 43 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::SwapUV | SmOffsetSurface.cpp:1762 | 19 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::Transform | SmOffsetSurface.cpp:1789 | 44 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::TrimWithDomain | SmOffsetSurface.cpp:1846 | 102 | [OffsetSurface::reverse], [OffsetSurface::split_at], [OffsetSurface::step_inversion] (and _extending), [OffsetSurface::swap_uv], [OffsetSurface::transform], [OffsetSurface::trim_with_domain] |
SmOffsetSurface::CreateOffsetSurface | SmOffsetSurface.cpp:1960 | 38 | [OffsetSurface::create_offset_surface] |
SmOffsetSurface::ReadFromDB | SmOffsetSurface.cpp:2197 | 77 | [OffsetSurface::read_from_db] |
SmOffsetSurface::IsKindOf | SmOffsetSurface.cpp:2279 | 4 | [OffsetSurface::is_kind_of], [OffsetSurface::type_code], [OffsetSurface::type_string], [OffsetSurface::class_string] |
Module file-header table (24 rows)
| Rust | Upstream |
|---|---|
[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