#220 adopted the rule "follow the authoring witness where a recorded edge shows its choice" and applied it to four mappings (IFCWALL, IFCSPACE, IFCDOOR, IFCWINDOW). A fifth row on the same recorded artifact shows the same shape and was deliberately left alone in that PR, because category_map.rs carries an explicit prior decision for it that predates the rule:
IfcShadingDevice declares no PredefinedType value rvt-rs can decode, so none is written ($, not an invented .NOTDEFINED.).
Measured on IFC Exports/2024_Core_Interior_slim.ifc (sha256 bfdf36ffb0bb768f3409d818403990e64d4c262c6780603be87f8077387ad86d) with IfcOpenShell:
| Entity |
Revit writes |
rvt-rs writes |
count |
| IfcShadingDevice |
.NOTDEFINED. |
$ |
20 |
Under the #220 rule this is not an invention — .NOTDEFINED. is the witness's own recorded answer for exactly these twenty OST_Floors instances, the same argument that moved IFCWALL off .STANDARD.. Applying it would make per-type PredefinedType agreement with the export exact for every type rvt-rs emits.
The reason to raise it rather than fold it into #220: the existing $ is a decision written down in a comment, and flipping a documented decision deserves its own verdict rather than riding along in another PR. Deciding it either way should also update the EXPORT_OVERRIDE_TARGETS comment and, if changed, add IfcShadingDevice to WITNESS_PREDEFINED_TYPES in tools/ci/ifc_schema_arity.py.
Separately visible in the same measurement and not part of this question, because it is a per-element decode rather than a mapping default: Revit splits its 80 slabs into 78 .FLOOR. + 2 .ROOF., where rvt-rs writes .FLOOR. for all 80. The witness-agreement gate accepts {FLOOR, ROOF} for IfcSlab for that reason.
Found while implementing #220 / #232.
#220 adopted the rule "follow the authoring witness where a recorded edge shows its choice" and applied it to four mappings (IFCWALL, IFCSPACE, IFCDOOR, IFCWINDOW). A fifth row on the same recorded artifact shows the same shape and was deliberately left alone in that PR, because
category_map.rscarries an explicit prior decision for it that predates the rule:Measured on
IFC Exports/2024_Core_Interior_slim.ifc(sha256bfdf36ffb0bb768f3409d818403990e64d4c262c6780603be87f8077387ad86d) with IfcOpenShell:.NOTDEFINED.$Under the #220 rule this is not an invention —
.NOTDEFINED.is the witness's own recorded answer for exactly these twentyOST_Floorsinstances, the same argument that moved IFCWALL off.STANDARD.. Applying it would make per-typePredefinedTypeagreement with the export exact for every type rvt-rs emits.The reason to raise it rather than fold it into #220: the existing
$is a decision written down in a comment, and flipping a documented decision deserves its own verdict rather than riding along in another PR. Deciding it either way should also update theEXPORT_OVERRIDE_TARGETScomment and, if changed, addIfcShadingDevicetoWITNESS_PREDEFINED_TYPESintools/ci/ifc_schema_arity.py.Separately visible in the same measurement and not part of this question, because it is a per-element decode rather than a mapping default: Revit splits its 80 slabs into 78
.FLOOR.+ 2.ROOF., where rvt-rs writes.FLOOR.for all 80. The witness-agreement gate accepts{FLOOR, ROOF}forIfcSlabfor that reason.Found while implementing #220 / #232.