Xbim Library无法读取IFC2X3文件中全部属性问题咨询
IFC2X3提取「Typical-code」属性的问题解决方案
原代码仅遍历了实例直接关联的IIfcPropertySet中的单一值属性,但「Typical-code」可能存在于嵌套属性集或类型对象的属性集中,导致无法捕获。以下是修正后的实现思路和代码:
核心问题分析
- 嵌套属性集:IFC2X3中部分属性会被封装在
IIfcComplexProperty(复杂属性)中,原代码未递归遍历这类嵌套结构。 - 类型继承属性:BIM软件常将通用属性(如Typical-code)定义在类型对象(如IfcDoorType)的属性集里,实例通过
IsTypedBy关联类型,需从类型对象提取继承属性。
修正代码实现
1. 递归提取所有单一值属性的辅助方法
private IEnumerable<IIfcPropertySingleValue> GetAllSingleValueProperties(IIfcProperty prop) { if (prop is IIfcPropertySingleValue singleValueProp) { yield return singleValueProp; } else if (prop is IIfcComplexProperty complexProp) { foreach (var subProp in complexProp.HasProperties) { foreach (var singleSubProp in GetAllSingleValueProperties(subProp)) { yield return singleSubProp; } } } }
2. 主逻辑:同时获取实例自身与类型继承的属性
// 目标实例ID var id = "2c$4fosk5BCvGtDFpkXAUc"; // 获取目标产品实例 var prd = _ifcModel.Instances .OfType<IIfcProduct>() .FirstOrDefault(ro => ro.GlobalId.Equals(id)); if (prd == null) { // 实例不存在时的处理逻辑 return; } // 1. 提取实例自身关联的所有属性集属性 var instanceProps = prd.IsDefinedBy .Where(r => r.RelatingPropertyDefinition is IIfcPropertySet) .SelectMany(r => ((IIfcPropertySet)r.RelatingPropertyDefinition).HasProperties) .SelectMany(GetAllSingleValueProperties); // 2. 提取类型对象关联的属性集属性(处理继承属性) var typeProps = Enumerable.Empty<IIfcPropertySingleValue>(); if (prd is IIfcElement element && element.IsTypedBy.Any()) { var elementType = element.IsTypedBy.First().RelatingType; typeProps = elementType.IsDefinedBy .Where(r => r.RelatingPropertyDefinition is IIfcPropertySet) .SelectMany(r => ((IIfcPropertySet)r.RelatingPropertyDefinition).HasProperties) .SelectMany(GetAllSingleValueProperties); } // 合并所有属性并查找「Typical-code」 var allProps = instanceProps.Concat(typeProps); var typicalCode = allProps.FirstOrDefault(p => p.Name.Value.Equals("Typical-code", StringComparison.OrdinalIgnoreCase)); if (typicalCode != null) { // 获取属性值,根据实际类型转换(如IfcLabel、IfcText等) var propValue = typicalCode.NominalValue; // 后续处理逻辑 }
补充说明
如果上述方法仍未找到属性,可检查IFC文件中属性的存储结构:
- 是否通过
IfcRelDefinesByTemplate关联了属性模板 - 属性名称是否存在大小写或拼写差异(建议用忽略大小写的匹配方式)
内容的提问来源于stack exchange,提问作者Meindert
相关产品推荐
相关产品推荐

