如何结合MultiViewerFactory与AggregatedView初始化Autodesk Viewer并获取关联模型房间
解决方案:联合模型中房间查询与Viewer初始化优化
一、正确结合MultiViewerFactory与AggregatedView初始化Viewer
你的初始化代码参数传递有误,MultiViewerFactory.createViewer的第三个参数应为Viewer构造函数,而非实例。正确做法是先创建AggregatedView实例,再将其作为第四个参数传入,调整后的代码如下:
function auxinitViewer(factory, container, config = {}) { // 创建AggregatedView实例 const aggregatedView = new Autodesk.Viewing.AggregatedView(); // 传入Viewer构造函数与AggregatedView实例 const viewer = factory.createViewer( container, config, Autodesk.Viewing.GuiViewer3D, aggregatedView ); viewer.start(); viewer.setTheme("light-theme"); return viewer; } export function initViewer(container) { return new Promise(function (resolve, reject) { Autodesk.Viewing.Initializer( { // 填入你的Forge Client ID等配置项 }, function () { window.factory = new Autodesk.Viewing.MultiViewerFactory(); window.viewer1 = auxinitViewer(window.factory, container, { extensions: [ // 你的扩展列表 ], }); resolve(window.viewer1); } ); }); }
核心说明:
MultiViewerFactory.createViewer的第四个参数才是AggregatedView实例,第三个参数必须传入Viewer构造函数(如GuiViewer3D)- 初始化完成后加载联合模型,子模型的房间会自动在主视图中聚合显示
二、联合模型的房间统一查询方案
要实现跨子模型的房间统一查询,需遍历所有加载的子模型收集房间数据,再统一进行距离计算:
1. 批量获取所有子模型的房间数据
async function getAllRoomsFromAggregatedModel(viewer) { const allRooms = []; // 获取所有已加载的子模型 const models = viewer.impl.modelQueue().getModels(); for (const model of models) { try { // 针对每个子模型提取房间信息 const info = new Autodesk.DataVisualization.Core.ModelStructureInfo(model); const levelRoomsMap = await info.getLevelRoomsMap(); // 将房间数据存入全局列表,附加模型ID用于区分 for (const [_, rooms] of levelRoomsMap) { rooms.forEach(room => allRooms.push({ ...room, modelId: model.id })); } } catch (err) { console.warn(`无法获取模型${model.id}的房间数据:`, err); } } return allRooms; }
2. 根据给定位置查找最近房间
function findNearestRoom(targetPosition, allRooms) { let nearestRoom = null; let minDistance = Infinity; allRooms.forEach(room => { // 获取房间中心点坐标 const roomCenter = room.boundingBox.center(); // 计算目标位置与房间中心的欧氏距离 const distance = targetPosition.distanceTo(roomCenter); if (distance < minDistance) { minDistance = distance; nearestRoom = room; } }); return nearestRoom; }
3. 调用示例
// 需等待所有子模型加载完成后调用,可通过OBJECT_TREE_CREATED_EVENT监听 async function runRoomQuery(targetPos) { const allRooms = await getAllRoomsFromAggregatedModel(window.viewer1); const nearestRoom = findNearestRoom(targetPos, allRooms); if (nearestRoom) { console.log("最近房间:", nearestRoom.name, "所属模型ID:", nearestRoom.modelId); // 可选:高亮选中该房间 window.viewer1.select([nearestRoom.dbId], nearestRoom.modelId); } else { console.log("未找到任何房间"); } } // 使用示例:传入Three.js Vector3格式的目标位置 runRoomQuery(new THREE.Vector3(10, 0, 5));
核心说明:
- 需等待所有子模型加载完成后执行查询,可通过
viewer.addEventListener(Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 回调函数)监听加载完成事件 - 房间的
boundingBox为Three.js的Box3对象,可直接用于坐标计算 - 通过
modelId可区分房间所属子模型,方便后续选中或操作
内容的提问来源于stack exchange,提问作者Gustavo da Costa e Silva
相关产品推荐
相关产品推荐

