solidcore

Units / topology

topology.edge partial

Layer
40
Upstream lines
2,213
Functions
60
Rust module
topology::edge

Source: crates/solidcore/src/topology/edge.rs

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

Notes

PARTIAL: difftest 1787 cases (1771 fixture: 236 on prog_test my_test_topology's wire network (its SetCurve / SetInterval / SetOrientation calls and every other op), 140 on wire edges of real SmLines (my_test_reversed_line_join's lines, forward and inside-out, sub-intervals, 1e-6 and 1e6 scales), 1395 on 9 upstream .smb B-reps read by SmBrep::ReadFromFile with and without RebuildUVTrimCurves; 16 generated, 2000 more checked once), 1715 pass, 72 deferred (topology.edgeuse_p3 62, topology.brep_p1 5, topology.brep_p2 5; topology.vertex wired after merging main), max_rel_err 0; --perturb SENSITIVE. Ops: the queries (edge use/vertex use/vertex/face/shell/region collections with attribute and connection filters, start/end/other vertex, lamina/manifold/spine/closed/wire, IsConnectedTo every kind), end tangent, trimmed NURBS copy, SetTolerance, SetOrientation, ReverseOrientation, OrientEdgeSequence, ResetPrimaryEdgeuse, AddOrientedEUPair (new edge uses), InsertManifoldEdgeEnd, cached gap maxima (gap values exported), Notify, SetCurve, both FindRadialSector, GetUVTrimCurveOfSurface, both IsSeam, IsTopological, IsTangentEdge, GetBlendEdgeuse, SmODEEdgeLengthIFEO::Evaluate, SetInterval. Edges with an ellipse curve or faces of SmBSplineSurface subclasses other than SmPlane are imported as their B-spline part: ops evaluating them report inexact_geometry on both sides. Stubs: UNPORTED(topology.edgeuse_p3) SmEdgeuse::NormalizedEvaluate / EvaluateBinormal / GetOrCreateUVTrimCurve, UNPORTED(topology.brep_p2) SmBrep::Notify, UNPORTED(topology.brep_p1) SmBrep::GetInfiniteRegion, SmFace::CalculateUVDomainFromUVTrimCurves (wired by topology.face_p1, PR #148). Back-edges wired: SmSurface::CoverOtherCoincidentSurface (surface.surface_p5 PR #50; its CoverCoincidentSurface is surface.surface_p3, and no current case reaches it past the edgeuse_p3 deferrals), SmEdge::SetTolerance in topology::edgeuse::{p1,p2} and topology::vertex (RefreshTolerance), SmVertex::SetTolerance in topology::edge (merge with main), the SmEdge queries of geom::tools; the UNPORTED(topology.edge) markers left in intersect::point_class, intersect::curve_class::p1, topology::proto_topology::p1, geom::{object,solution_array,tol} are on opaque object handles with no B-rep to call into (dispatch gaps). Plan notes: 60 fns; largest: SmEdge::IsTopological, SmEdge::FindRadialSector, SmEdge::GetBlendEdgeuse, SmEdge::OrientEdgeSequence; cycle back-edges (call into later units; stub or co-port): heal.gap(12), topology.edgeuse_p3(3), query.edge(2), topology.brep_p2(2), blend.fillet_geom_p1(1), topology.brep_p1(1), topology.face_p1(1); unit-SCC #22 (220 units); 319 upstream test entry points reach this unit; CO-PORTED in topology.edgeuse_p1 (PR #55): SmEdge members m_pList (edge use list, primary first), m_vInterval, m_sZoneTol3d, m_pCurve -> topology::Edge::{edgeuses, interval, tolerance, curve}; SmEdge::GetPrimaryEdgeuse, IsLamina, GetBrep -> topology::edgeuse::p1::{primary_edgeuse, edge_is_lamina, edge_brep}; CO-PORTED in topology.vertexuse (PR #88): SmEdge::IsWire -> topology::vertexuse::edge_is_wire; CO-PORTED in query.edge (PR #89): SmEdge::GetVertices(SmTArray&, ULONG*) (no attribute filter), SmEdge::GetFaces (no attribute filter) -> query::edge::{edge_vertices, edge_faces}; CO-PORTED in topology.face_p2 (PR #91): SmEdge::GetEdgeuses without filters -> private topology::face::p2::edge_edgeuses; CO-PORTED in topology.vertex (PR #96): SmEdge::GetStartVertex, GetVertices(SmVertex*&, SmVertex*&), GetVertices(SmTArray&) (no attribute filter), GetEndTangent -> topology::vertex::{edge_start_vertex, edge_vertex_pair, edge_vertices, edge_end_tangent} Re-run (PR #52, after merging surface_p4/#49 and surface_p5/#50): is_topological takes &Kernel and &mut Brep (CoverCoincidentSurface expands the covering face surface in place); 1787 cases, 1715 pass, 72 deferred (topology.edgeuse_p3 62, topology.brep_p1 5, topology.brep_p2 5). Re-run in PR #154 (shell state export, SmBrep::GetEdges registered first so edge selectors pick different edges): same 1787 cases, 5 moved deferred -> pass (topology.edgeuse_p3 67 -> 62), 0 failed, --perturb SENSITIVE 1715/1715. PR #163 adds find_radial_sector_between for independent operand arenas; existing same-B-rep API delegates to it. Cross-operand C++ cases live in fixtures/boolean.merge_p1/review.json.

Difftest

Cases
1,787
Passed
1,715
Deferred
72
Failed
0
Both errored
186
Max rel. error
0.0
Tolerance
1e-09 rel.
Seeds
16

Blocked by

Unported unitDeferred cases
topology.edgeuse_p3 claimed62
topology.brep_p1 claimed5
topology.brep_p2 claimed5

Report JSON (per-case results)

Dependencies

Depends on: curve.curve_p2 green geom.a_object partial geom.extent1d green geom.extent2d green geom.object partial geom.tol green geom.vector3d green surface.surface_p2 partial surface.surface_p7 partial topology.edgeuse_p1 partial topology.edgeuse_p2 partial topology.face_p2 partial topology.proto_topology_p1 partial topology.topology green topology.vertexuse partial

Soft dependencies: geom.context green geom.vector2d green nurbs.b_spline_curve_n_lib green nurbs.b_spline_curve_p1 green surface.surface_p1 partial surface.surface_p5 green topology.loopuse partial topology.shell partial topology.vertex partial

Dependents: blend.fillet_corner_p1 todo blend.fillet_corner_p2 todo blend.fillet_corner_p3 todo blend.fillet_executive_p1 todo blend.fillet_executive_p2 todo blend.fillet_executive_p3 todo blend.fillet_geom_p1 claimed blend.fillet_geom_p2 todo blend.fillet_geom_p3 todo blend.fillet_geom_p4 todo blend.fillet_geom_p5 todo blend.fillet_geom_p6 todo blend.fillet_intersector claimed blend.fillet_solver_p1 claimed blend.fillet_solver_p2 todo blend.fillet_solver_p3 todo blend.fillet_solver_p4 claimed blend.fillet_solver_p5 claimed blend.fillet_standard_solver_p2 todo blend.hcr claimed boolean.merge_p1 partial boolean.merge_p2 todo boolean.merge_p4 todo boolean.merge_p5 partial boolean.topology_intersector_p1 partial boolean.topology_intersector_p2 claimed boolean.topology_intersector_p3 claimed heal.heal_data_p2 partial heal.heal_data_p3 partial heal.stitch_p1 claimed heal.stitch_p2 claimed mass.integrator partial offset.offset_executive_p1 claimed offset.offset_geometry_creation claimed primitive.primitive_creation_p1 claimed primitive.primitive_creation_p2 todo query.api_queries partial query.edge partial query.face_p1 claimed query.face_p3 claimed sweep.rotational_sweep_geometry partial sweep.topology_sweep claimed sweep.trans_sweep_geometry partial topology.brep_cache partial topology.brep_p1 claimed topology.brep_p10 claimed topology.brep_p2 claimed topology.brep_p3 claimed topology.brep_p4 claimed topology.brep_p5 claimed topology.brep_p6 claimed topology.brep_p7 claimed topology.brep_p9 claimed topology.edgeuse_p3 claimed topology.face_p3 claimed topology.proto_topology_p2 partial topology.proto_topology_p3 partial topology.topology_traverser partial

Soft dependents: blend.fillet_custom_solver partial blend.fillet_standard_solver_p1 claimed heal.gap partial offset.offset_executive_p2 claimed query.brep claimed query.face_p2 partial query.loop green topology.face_p1 partial topology.face_p4 claimed

Upstream functions

Upstream functionDefined atLinesRust (from the file header)
SmEdge::SmEdgeSmEdge.h:1049[Edge::new]
SmEdge::GetEdgeuseCountSmEdge.h:3251[edgeuse_count], [primary_edgeuse]
SmEdge::GetPrimaryEdgeuseSmEdge.h:3263[edgeuse_count], [primary_edgeuse]
SmEdge::GetIntervalSmEdge.h:3301[interval], [set_interval], [curve], [tolerance]
SmEdge::GetCurveSmEdge.h:3311[interval], [set_interval], [curve], [tolerance]
SmEdge::GetToleranceSmEdge.h:4291[interval], [set_interval], [curve], [tolerance]
SmEdge::SetIntervalSmEdge.h:4461[interval], [set_interval], [curve], [tolerance]
SmEdge::GetClassStringSmEdge.h:5711[TYPE], [TYPE_STRING], [CLASS_STRING], [is_kind_of]
SmEdge::GetTypeSmEdge.h:5711[TYPE], [TYPE_STRING], [CLASS_STRING], [is_kind_of]
SmEdge::GetTypeStringSmEdge.h:5711[TYPE], [TYPE_STRING], [CLASS_STRING], [is_kind_of]
SmEdge::~SmEdgeSmEdge.cpp:5943[crate::topology::Edge] (Drop)
SmODEEdgeLengthIFEO::SmODEEdgeLengthIFEOSmEdge.cpp:1158[OdeEdgeLength]
SmODEEdgeLengthIFEO::EvaluateSmEdge.cpp:13578[OdeEdgeLength]
SmEdge::GetEndTangentSmEdge.cpp:47617[end_tangent]
SmEdge::GetUVTrimCurveOfSurfaceSmEdge.cpp:52327[uv_trim_curve_of_surface]
SmEdge::IsClosedSmEdge.cpp:5566[is_closed], [is_wire]
SmEdge::IsWireSmEdge.cpp:5686[is_closed], [is_wire]
SmEdge::CreateTrimmedNURBSCurveSmEdge.cpp:58342[create_trimmed_nurbs_curve]
SmEdge::GetEdgeuseOfFaceSmEdge.cpp:63494[edgeuse_of_face], [upward_edgeuse_of_face]
SmEdge::GetUpwardEdgeuseOfFaceSmEdge.cpp:78034[edgeuse_of_face], [upward_edgeuse_of_face]
SmEdge::FindRadialSectorSmEdge.cpp:1789152[find_radial_sector], [find_radial_sector_between], [find_radial_sector_of_curve], [RadialSector]
SmEdge::FindRadialSectorOfCurveSmEdge.cpp:195367[find_radial_sector], [find_radial_sector_between], [find_radial_sector_of_curve], [RadialSector]
SmEdge::ResetPrimaryEdgeuseSmEdge.cpp:225426[reset_primary_edgeuse]
SmEdge::GetBrepSmEdge.cpp:234119[brep]
SmEdge::SetCurveSmEdge.cpp:249353[set_curve], [SetCurveOptions]
SmEdge::NotifySmEdge.cpp:352668[notify], [NotifyEnv]
SmEdge::SetOrientationSmEdge.cpp:360326[set_orientation], [reverse_orientation]
SmEdge::ReverseOrientationSmEdge.cpp:364032[set_orientation], [reverse_orientation]
SmEdge::OrientEdgeSequenceSmEdge.cpp:367999[orient_edge_sequence]
SmEdge::GetFacesSmEdge.cpp:390648[faces], [shells], [regions]
SmEdge::GetShellsSmEdge.cpp:396128[faces], [shells], [regions]
SmEdge::GetRegionsSmEdge.cpp:399628[faces], [shells], [regions]
SmEdge::GetMaxGap3dSmEdge.cpp:403033[max_gap_3d], [max_up_dim_gap_3d], [max_down_dim_gap_3d], [EdgeGap], [MaxGap]
SmEdge::GetVerticesSmEdge.cpp:406931[vertices], [vertexuses], [edgeuses], [AttributeFilter]
SmEdge::GetVertexusesSmEdge.cpp:410636[vertices], [vertexuses], [edgeuses], [AttributeFilter]
SmEdge::GetEdgeusesSmEdge.cpp:418167[vertices], [vertexuses], [edgeuses], [AttributeFilter]
SmEdge::GetNumberFaceOccurancesSmEdge.cpp:428931[number_face_occurances]
SmEdge::GetMaxUpDimGap3dSmEdge.cpp:432838[max_gap_3d], [max_up_dim_gap_3d], [max_down_dim_gap_3d], [EdgeGap], [MaxGap]
SmEdge::GetMaxDownDimGap3dSmEdge.cpp:437237[max_gap_3d], [max_up_dim_gap_3d], [max_down_dim_gap_3d], [EdgeGap], [MaxGap]
SmEdge::AddOrientedEUPairSmEdge.cpp:441761[add_oriented_eu_pair]
SmEdge::GetVertexSmEdge.cpp:44875[vertex], [start_vertex], [end_vertex], [other_vertex], [start_end_vertices]
SmEdge::GetStartVertexSmEdge.cpp:44987[vertex], [start_vertex], [end_vertex], [other_vertex], [start_end_vertices]
SmEdge::GetEndVertexSmEdge.cpp:45117[vertex], [start_vertex], [end_vertex], [other_vertex], [start_end_vertices]
SmEdge::GetOtherVertexSmEdge.cpp:452935[vertex], [start_vertex], [end_vertex], [other_vertex], [start_end_vertices]
SmEdge::GetVerticesSmEdge.cpp:457017[vertices], [vertexuses], [edgeuses], [AttributeFilter]
SmEdge::InsertManifoldEdgeEndSmEdge.cpp:460193[insert_manifold_edge_end]
SmEdge::IsLaminaSmEdge.cpp:470213[is_lamina], [is_manifold], [is_spine]
SmEdge::IsManifoldSmEdge.cpp:472221[is_lamina], [is_manifold], [is_spine]
SmEdge::IsSpineSmEdge.cpp:475110[is_lamina], [is_manifold], [is_spine]
SmEdge::IsSeamSmEdge.cpp:480123[is_seam], [is_seam_of_surface]
SmEdge::IsSeamSmEdge.cpp:483365[is_seam], [is_seam_of_surface]
sm_CoverOtherCoincidentFaceSmEdge.cpp:491752cover_other_coincident_face (private)
SmEdge::IsTopologicalSmEdge.cpp:4986233[is_topological], [Topological]
SmEdge::IsTangentEdgeSmEdge.cpp:557113[is_tangent_edge]
SmEdge::IsConnectedToFaceSmEdge.cpp:571417[is_connected_to_face], [is_connected_to]
SmEdge::IsConnectedToSmEdge.cpp:574454[is_connected_to_face], [is_connected_to]
SmEdge::SetToleranceSmEdge.cpp:604650[set_tolerance]
SmEdge::GetBlendEdgeuseSmEdge.cpp:6746132[blend_edgeuse]
SmEdge::GetSameOrientedEdgeuseSmEdge.cpp:78317[same_oriented_edgeuse]
SmEdge::IsKindOfSmEdge.cpp:78434[TYPE], [TYPE_STRING], [CLASS_STRING], [is_kind_of]
Module file-header table (35 rows)
RustUpstream
[TYPE], [TYPE_STRING], [CLASS_STRING], [is_kind_of]SmEdge::GetType, GetTypeString, GetClassString, IsKindOf
[Edge::new]SmEdge::SmEdge
[crate::topology::Edge] (Drop)SmEdge::~SmEdge
[edgeuse_count], [primary_edgeuse]SmEdge::GetEdgeuseCount, GetPrimaryEdgeuse
[interval], [set_interval], [curve], [tolerance]SmEdge::GetInterval, SetInterval, GetCurve, GetTolerance (SM_USE_OLDTOL)
[OdeEdgeLength]SmODEEdgeLengthIFEO (constructor, Evaluate)
[end_tangent]SmEdge::GetEndTangent
[uv_trim_curve_of_surface]SmEdge::GetUVTrimCurveOfSurface
[is_closed], [is_wire]SmEdge::IsClosed, IsWire
[create_trimmed_nurbs_curve]SmEdge::CreateTrimmedNURBSCurve
[edgeuse_of_face], [upward_edgeuse_of_face]SmEdge::GetEdgeuseOfFace, GetUpwardEdgeuseOfFace
[find_radial_sector], [find_radial_sector_between], [find_radial_sector_of_curve], [RadialSector]SmEdge::FindRadialSector, FindRadialSectorOfCurve
[reset_primary_edgeuse]SmEdge::ResetPrimaryEdgeuse
[brep]SmEdge::GetBrep
[set_curve], [SetCurveOptions]SmEdge::SetCurve
[notify], [NotifyEnv]SmEdge::Notify
[set_orientation], [reverse_orientation]SmEdge::SetOrientation, ReverseOrientation
[orient_edge_sequence]SmEdge::OrientEdgeSequence
[faces], [shells], [regions]SmEdge::GetFaces, GetShells, GetRegions
[vertices], [vertexuses], [edgeuses], [AttributeFilter]SmEdge::GetVertices(SmTArray&, ULONG*), GetVertexuses, GetEdgeuses
[max_gap_3d], [max_up_dim_gap_3d], [max_down_dim_gap_3d], [EdgeGap], [MaxGap]SmEdge::GetMaxGap3d, GetMaxUpDimGap3d, GetMaxDownDimGap3d
[number_face_occurances]SmEdge::GetNumberFaceOccurances
[add_oriented_eu_pair]SmEdge::AddOrientedEUPair
[vertex], [start_vertex], [end_vertex], [other_vertex], [start_end_vertices]SmEdge::GetVertex, GetStartVertex, GetEndVertex, GetOtherVertex, GetVertices(SmVertex*&, SmVertex*&)
[insert_manifold_edge_end]SmEdge::InsertManifoldEdgeEnd
[is_lamina], [is_manifold], [is_spine]SmEdge::IsLamina, IsManifold, IsSpine
[is_seam], [is_seam_of_surface]the two SmEdge::IsSeam
cover_other_coincident_face (private)sm_CoverOtherCoincidentFace (static)
[is_topological], [Topological]SmEdge::IsTopological
[is_tangent_edge]SmEdge::IsTangentEdge
[is_connected_to_face], [is_connected_to]SmEdge::IsConnectedToFace, IsConnectedTo
[set_tolerance]SmEdge::SetTolerance (SM_USE_OLDTOL)
[blend_edgeuse]SmEdge::GetBlendEdgeuse
[same_oriented_edgeuse]SmEdge::GetSameOrientedEdgeuse
loopuse_edges (private)SmLoopuse::GetEdges(SmTArray&) without filter (CO-PORTED, topology.loopuse)

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