n3xd_ocp.measure: every face's area and centroid in one call
BRepGProp.SurfaceProperties is the hottest kernel call the app makes — 94 % of face_candidate_anchors, 0.99 s of 1.05 s for 690 faces — not because the kernel is slow but because it is reached once per face from Python, so a rebuild pays the round-trip hundreds of times per feature over a growing shape. face_surface_props(shape, *, parallel=True, eps=None) runs the whole scan C++-side with the GIL released, optionally over OSD_Parallel, and returns (areas[F], centroids[F,3]) in MapShapes(FACE) order — the face identity the topology layer already keys on, so a caller indexes straight into it. A face OCCT cannot integrate reports zeros, matching what the app's own try/except substitutes. Tested against the same stock-recorded per-face reference the Inc 1 gate uses, and against the one-call-per-face loop it replaces. Parallel and serial are compared with array_equal rather than approx: the parallel path shares one TopoDS_Shape across threads, so an exact match is the evidence that nothing reachable from it gets mutated while measuring. Backend adoption comes after the cutover, so this changes nothing yet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DfriM8XUkn7uYf5Dwe2xo6
This commit is contained in:
@@ -18,8 +18,10 @@ namespace nb = nanobind;
|
||||
|
||||
void register_ext_bintools();
|
||||
void register_ext_debug();
|
||||
void register_ext_measure();
|
||||
|
||||
void register_ext(nb::module_ &) {
|
||||
register_ext_bintools();
|
||||
register_ext_debug();
|
||||
register_ext_measure();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user