如何从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的材质。
步骤说明
- 定位当前图纸对应的内部视图ID:图纸本身是容器,实际的配色设置存储在图纸包含的视图对象中。
- 获取该视图的覆盖配置:使用Viewer API提取视图级别的元素外观覆盖规则。
- 遍历房间元素,查询每个房间在该视图下的颜色覆盖值。
修正后的代码示例
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版本支持
getViewOverridesAPI,旧版本可尝试viewer.getViewingContent().getViewOverrides(targetViewId)替代。 - 视图覆盖不仅包含颜色,还可获取透明度、线型等其他显示设置,根据需求调整即可。
内容的提问来源于stack exchange,提问作者Duzmac
相关产品推荐
相关产品推荐

