如何使用Xbim.Essentials通过GlobalId查找未知类型IFC对象
完全可以在预先不知道对象类型的前提下,通过GlobalId在Xbim.Essentials中查找IFC目标对象。
所有带GlobalId属性的IFC实体都继承自IIfcRoot接口,不需要限定门、墙、构件等具体子类型,同时Xbim.Essentials内置了GlobalId索引,查询效率很高。
实现方式
方法1:内置索引查询(推荐,性能最优)
Xbim封装了直接按GlobalId取实例的方法,内部走预构建的索引,大体积IFC文件下查询速度远快于全量遍历:
var id = "2AswZfru1AdAiKfEdrNPnu"; // 无需指定对象类型,直接通过GlobalId取实例 var target = model.Instances.GetByGlobalId(id); if (target is IIfcRoot rootTarget) { Console.WriteLine($"实体GlobalId: {rootTarget.GlobalId}, 名称: {rootTarget.Name}, 实体类型: {rootTarget.ExpressType.Name}"); }
如果传入的GlobalId在文件中不存在,
GetByGlobalId会返回null,使用前需要做空校验避免报错。
方法2:基类检索(兼容所有版本)
如果使用的Xbim版本没有上述封装方法,直接将检索的泛型参数指定为公共基接口IIfcRoot即可,和你已知类型时的写法逻辑完全一致:
var id = "2AswZfru1AdAiKfEdrNPnu"; var target = model.Instances .OfType<IIfcRoot>() .FirstOrDefault(r => r.GlobalId == id); if (target != null) { Console.WriteLine($"实体GlobalId: {target.GlobalId}, 名称: {target.Name}, 实体类型: {target.GetType().Name}"); }
这种写法会覆盖所有带GlobalId属性的IFC实体,不管目标是门、窗、墙、楼层、构件还是其他根级实体,都能正常匹配到。
内容的提问来源于stack exchange,提问作者SONA
相关产品推荐
相关产品推荐

