如何跳过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
相关产品推荐
相关产品推荐

