Compose an occurrence's own property sets with those it inherits from its
IfcTypeProduct, the way IFC defines the inheritance: per property, not
per property set.
An occurrence and its type routinely both carry a set of the same name —
Pset_CoveringCommon holding IsExternal/Reference on the occurrence and
SurfaceSpreadOfFlame/Combustible on the type is a plain Revit export.
Dropping the whole inherited set on a name collision makes every type-only
property in it invisible, which is what made IDS report a present property as
missing (#1913). Where both define the same property name, the occurrence
wins — it is the more specific definition.
An occurrence may carry several sets of one name (one per
IfcRelDefinesByProperties; nothing dedupes them, and merged/federated
exports produce them). Inherited properties are merged into every one of
them, not just the first: IDS requires every set matching the facet's
propertySet constraint to satisfy it, so augmenting one and leaving its
twin bare would reintroduce the same false "not found" this rule exists to
prevent.
Neither input is mutated: a set that gains inherited properties is returned
as a new object, so cached extractor results stay intact.
Compose an occurrence's own property sets with those it inherits from its
IfcTypeProduct, the way IFC defines the inheritance: per property, not per property set.An occurrence and its type routinely both carry a set of the same name —
Pset_CoveringCommonholdingIsExternal/Referenceon the occurrence andSurfaceSpreadOfFlame/Combustibleon the type is a plain Revit export. Dropping the whole inherited set on a name collision makes every type-only property in it invisible, which is what made IDS report a present property as missing (#1913). Where both define the same property name, the occurrence wins — it is the more specific definition.An occurrence may carry several sets of one name (one per
IfcRelDefinesByProperties; nothing dedupes them, and merged/federated exports produce them). Inherited properties are merged into every one of them, not just the first: IDS requires every set matching the facet'spropertySetconstraint to satisfy it, so augmenting one and leaving its twin bare would reintroduce the same false "not found" this rule exists to prevent.Neither input is mutated: a set that gains inherited properties is returned as a new object, so cached extractor results stay intact.