You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:07:53