pub fn propagate_voids_via_aggregates(
void_index: &mut FxHashMap<u32, Vec<u32>>,
aggregate_children: &FxHashMap<u32, Vec<u32>>,
)Expand description
Propagate openings from hosts that aggregate parts to every aggregated descendant — any depth, any type (IfcWallElementedCase panels, IfcRoof → IfcSlab skylights, nested assemblies, …).
The IFC4 spec allows an opening on a host whose geometry is distributed across aggregated parts; without propagation the cut runs against an empty host mesh and produces a “silent no-op” while the parts cover what should be the window/door hole.
Single shared kernel for all three pipelines (server process_geometry,
wasm buildPrePassOnce, wasm buildPrePassStreaming) so they cannot
drift on which descendants receive the cut.
Propagation is an iterative worklist walk with a per-host visited set
(AGENTS.md “Bounding walks over file-supplied references”: no recursion
to overflow, and a cycle or fan-in in IfcRelAggregates is visited once
per host). Existing void entries for a part are extended (deduplicated)
so an authored direct void is never overwritten.