mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 05:10:53 +00:00
66bcddc277
ifcopenshell.geom.create_shape constructs a geometry kernel, converter and mapping on every call and discards them afterwards. For hybrid kernels the construction alone rescans the plugin directory per component, which #9417 addresses on the C++ side by caching the resolved component ids. This prototypes the alternative aothms suggested in the #9417 review: reuse the constructed kernel itself from Python. The wrapper gains a geometry_kernel class holding the converter (and through it the kernel, mapping and conversion caches) built once per (geometry_library, file, settings) triple, with create_shape(instance[, representation]) delegating to the same helper the free create_shape uses, now split so both paths share one body. Python gains ifcopenshell.geom.kernel(settings, file, geometry_library) mirroring the iterator constructor signature. The binding is fixed at construction: settings are copied the way converter already copies them, and a guard rejects instances from a different file because the mapping is file-bound. On PGSuper_Import_Model.ifc (322 products, single-threaded, arm64 Linux), hybrid-cgal-simple-opencascade drops from 71.97 ms/call with per-call create_shape to 23.35 ms/call through the reused kernel, matching the iterator (22.74 ms/call) without needing the #9417 cache; plain opencascade is unaffected (23.30 vs 22.28 ms/call).