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

如何从Forge APS 2D Viewer获取Revit配色方案的房间颜色

获取2D图纸中Revit配色方案的房间颜色

问题描述

我尝试从2D Viewer的图纸(Sheet)中获取基于Revit配色方案(Color Scheme)的房间(Room)颜色,编写了以下代码获取房间及其材质:

const tree = model.getInstanceTree();
const frags = model.getFragmentList();

const getRoomsId = new Promise((resolve, reject) => {
    obj.model.search('Rooms', function (dbIds) {
        dbIds.some(dbId => {
            if (tree.getNodeName(dbId) === 'Rooms') {
                resolve(dbId)
                return true
            }
        })
    })
})

getRoomsId.then(function (roomsId) {
    tree.enumNodeChildren(roomsId,
      function (childId) {
        tree.enumNodeFragments(childId, function (fragid) {
            const material = frags.getMaterial(fragid);
            console.log('Room: ', childId, ' / ', tree.getNodeName(childId), ' Fragment: ', fragid, ' Material: ', material.uuid)
        })
       }
    )
})

但运行后发现所有房间材质UUID完全相同,且tree.enumNodeChildren(childId)没有返回任何内容,怀疑配色方案的颜色是通过图层(overlay)而非材质实现的,求解决方法。

解决方案

Revit的配色方案颜色在Viewer中并非绑定到房间的原始材质,而是作为**视图覆盖(View Overrides)**存在的——这是视图级别的显示设置,用来覆盖元素的默认外观。因此需要通过视图覆盖API来获取颜色,而非读取Fragment的材质。

步骤说明

  1. 定位当前图纸对应的内部视图ID:图纸本身是容器,实际的配色设置存储在图纸包含的视图对象中。
  2. 获取该视图的覆盖配置:使用Viewer API提取视图级别的元素外观覆盖规则。
  3. 遍历房间元素,查询每个房间在该视图下的颜色覆盖值。

修正后的代码示例

async function getRoomColorFromSheetView() {
    const model = obj.model;
    const tree = model.getInstanceTree();
    const viewer = obj.viewer; // 确保你持有Viewer实例

    // 1. 获取当前活跃的图纸节点
    const currentSheet = viewer.activeView?.nodeId;
    if (!currentSheet) {
        console.error('未找到活跃图纸');
        return;
    }

    // 2. 获取图纸包含的视图ID
    let targetViewId = null;
    await new Promise(resolve => {
        tree.enumNodeChildren(currentSheet, childId => {
            const nodeName = tree.getNodeName(childId);
            // 匹配图纸内的视图节点(名称通常包含"View"或具体视图名)
            if (nodeName.includes('View') || nodeName.includes('视图')) {
                targetViewId = childId;
                resolve();
            }
        });
    });

    if (!targetViewId) {
        console.error('图纸内未找到视图');
        return;
    }

    // 3. 获取该视图的覆盖设置
    const viewOverrides = model.getViewOverrides(targetViewId);
    if (!viewOverrides) {
        console.error('无法获取视图覆盖设置');
        return;
    }

    // 4. 获取所有房间的DBID
    const roomDbIds = await new Promise(resolve => {
        model.search('Room', dbIds => resolve(dbIds));
    });

    // 5. 遍历房间,输出对应颜色
    for (const dbId of roomDbIds) {
        const roomName = tree.getNodeName(dbId);
        const override = viewOverrides.getOverride(dbId);
        
        if (override?.color) {
            const { r, g, b } = override.color;
            console.log(`房间: ${roomName} (DBID: ${dbId}) - 颜色: RGB(${r}, ${g}, ${b})`);
        } else {
            console.log(`房间: ${roomName} (DBID: ${dbId}) - 无配色覆盖`);
        }
    }
}

// 调用函数
getRoomColorFromSheetView();

关键注意事项

  • 如果房间在2D视图中以**填充区域(Fill Region)**形式呈现,需要搜索Fill Region类型元素,再通过Revit参数(如Room Name)关联到对应房间,然后查询填充区域的视图覆盖颜色。
  • 确保使用的Viewer版本支持getViewOverrides API,旧版本可尝试viewer.getViewingContent().getViewOverrides(targetViewId)替代。
  • 视图覆盖不仅包含颜色,还可获取透明度、线型等其他显示设置,根据需求调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:15:01