使用ThatOpen库FragmentIfcLoader加载多模型后,如何处理实体属性等功能?
解决ThatOpen中FragmentIfcLoader加载多模型后属性/平面图/实体树仅生效第一个的问题
核心原因
FragmentIfcLoader加载每个IFC模型会生成独立的Fragment实例,包含自身的属性集、层级树和网格。如果只操作第一个Fragment的引用,自然无法访问后续模型的数据。
具体解决方案
1. 独立存储每个加载的Fragment实例
每次加载新模型时,将返回的Fragment对象存入数组或映射表,避免丢失引用:
const fragments = []; const loader = new FragmentIfcLoader(); // 加载第一个模型 const fragment1 = await loader.load(ifcUrl1); fragments.push(fragment1); scene.add(fragment1.mesh); // 加载第二个模型 const fragment2 = await loader.load(ifcUrl2); fragments.push(fragment2); scene.add(fragment2.mesh);
2. 属性查询时匹配对应Fragment
当需要获取选中实体的属性时,通过射线检测或对象UUID匹配所属的Fragment,再从对应Fragment的属性库中查询:
// 假设通过射线检测拿到选中的Three.js对象和实体ID const selectedObject = ...; const entityId = ...; // 遍历所有Fragment找到匹配的 const targetFragment = fragments.find(frag => frag.mesh.uuid === selectedObject.uuid); if (targetFragment) { const properties = targetFragment.getProperties(entityId); // 渲染属性到UI }
3. 让平面图(截面)对所有Fragment生效
创建SectionPlanes实例后,将所有Fragment的网格添加到截面器中,确保截面效果覆盖所有模型:
const sectionPlanes = new SectionPlanes(scene); // 遍历所有Fragment添加截面支持 fragments.forEach(frag => { sectionPlanes.add(frag.mesh); });
4. 合并多模型的实体树
每个Fragment自带tree属性(层级树结构),可以创建一个虚拟根节点,将所有Fragment的树作为子节点合并,再渲染到UI:
// 构建合并后的实体树 const mergedEntityTree = { type: "合并模型根节点", children: fragments.map(frag => frag.tree) }; // 将mergedEntityTree传给UI组件渲染层级结构
5. 关键注意事项
- 不要复用单个Fragment变量存储多个加载结果,必须用集合(数组/Map)跟踪每个模型的Fragment。
- 确保每个Fragment的
props(属性数据库)和tree(层级树)在加载完成后已正确初始化(FragmentIfcLoader加载时默认会处理这些)。
内容的提问来源于stack exchange,提问作者user3104364
相关产品推荐
相关产品推荐

