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

如何跳过displayFacility直接调用setCurrentView及检测视图加载完成?

Autodesk Tandem自定义开发问题解答

问题1:跳过displayFacility步骤后修复DtFacility.viewer为undefined的问题

displayFacility内部会自动将viewer实例绑定到DtFacility的viewer属性上,跳过该步骤后需要手动完成绑定,同时要确保视图关联的模型已加载(若之前未加载)。修改后的代码如下:

private async displayFacilityView(sTwin: string, sViewId: string): Promise<void> {
  const app = this.oApp;
  const viewer = this.oViewer;

  try {
    const facilitiesSharedWithMe: Autodesk.Tandem.DtFacility[] = await app.getCurrentTeamsFacilities();
    const myFacilities: Autodesk.Tandem.DtFacility[] = await app.getUsersFacilities();
    const aFacilities: Autodesk.Tandem.DtFacility[] = [...facilitiesSharedWithMe, ...myFacilities];
    const matchingFacility = aFacilities.find(facility => facility.twinId === sTwin);
    if (!matchingFacility) throw new Error('Facility not found');

    // 手动绑定viewer到DtFacility,替代displayFacility的内部逻辑
    matchingFacility.viewer = viewer;

    const aViews = await app.views.fetchFacilityViews(matchingFacility);
    const matchingView = aViews.find(v => v.id === sViewId);
    if (!matchingView) throw new Error('View not found');

    // 检查视图关联的模型是否已加载,未加载则手动加载
    const modelIds = new Set(matchingView?.facets?.filters?.models);
    if (modelIds && modelIds.size > 0) {
      const loadedModelIds = new Set(viewer.modelRegistry.models.map(m => m.id));
      const missingModels = [...modelIds].filter(id => !loadedModelIds.has(id));
      if (missingModels.length > 0) {
        await app.loadModels(matchingFacility, missingModels, viewer);
      }
    }

    // 直接调用setCurrentView应用视图
    await app.views.setCurrentView(matchingFacility, matchingView);
  } catch (error) {
    console.error('Error displaying facility view:', error);
    throw error;
  }
}

关键修改点:

  • 手动给matchingFacility.viewer赋值当前viewer实例,满足setCurrentView对设施绑定viewer的要求
  • 增加模型加载检查逻辑,避免视图应用后无内容显示

问题2:监听视图加载完成事件并调用viewer.getVisibleDbIds()

监听Tandem的app.views.EVENT_VIEW_APPLIED事件,该事件会在视图设置并应用到viewer后触发,是最精准的时机。实现代码如下:

// 注册视图应用完成事件监听(建议在应用初始化时注册,避免重复绑定)
app.views.addEventListener(Autodesk.Tandem.Views.EVENT_VIEW_APPLIED, async (event) => {
  // 可选:校验当前应用的是目标视图
  if (event.view.id === sViewId && event.facility.twinId === sTwin) {
    // 等待viewer渲染完成,确保可见DB IDs已更新
    await viewer.waitForLoadDone();
    const visibleDbIds = viewer.getVisibleDbIds();
    console.log('Visible DB IDs:', visibleDbIds);
    // 执行后续业务逻辑
  }
});

// 调用修改后的视图加载方法
await this.displayFacilityView(sTwin, sViewId);

若无需区分具体视图,也可监听viewer的Autodesk.Viewing.GEOMETRY_LOADED_EVENT,但EVENT_VIEW_APPLIED更贴合视图设置完成的场景。


内容的提问来源于stack exchange,提问作者Peter Kolbe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:52:46