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

如何结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:03:22