能否通过APS及Forge Viewer API获取Revit材料提取所用数据?
能否通过Forge Viewer API获取Revit材料提取的分层数据?
可以实现,但默认情况下Forge Viewer无法直接获取Revit材料提取所用的分层体积这类明细数据——因为导出到Forge的SVF格式模型做了轻量化处理,很多Revit原生的分层参数和计算逻辑会被简化或剥离。以下是几个可行的工作流:
方法1:提前在Revit中绑定分层参数到构件
这是最直接的方案,核心是把分层体积数据提前写入构件的共享参数,让这些数据跟随模型进入Forge:
- 在Revit中给墙体创建对应图层的共享参数(比如
Layer1_Volume、Layer2_Volume) - 通过Revit API手动计算每个图层的体积(利用
WallLayer.Volume结合墙体长度),并赋值给这些共享参数 - 上传模型到Forge后,在Viewer中通过属性数据库获取这些参数:
// 获取指定构件的分层体积参数 viewer.model.getPropertyDb().getProperties(dbId, (props) => { const layerVolumeProps = props.filter(p => p.displayName.includes('Layer') && p.displayName.includes('Volume') ); layerVolumeProps.forEach(prop => { console.log(`${prop.displayName}: ${prop.displayValue}`); }); });
方法2:用Forge Design Automation调用Revit引擎计算
如果不想提前修改Revit模型,可以通过Design Automation远程调用Revit核心来提取分层数据:
- 编写一个简单的Revit插件,用Revit API遍历墙体、提取每个图层的体积:
public void ExtractWallLayerVolumes(Document doc) { var wallLayerData = new List<Dictionary<string, object>>(); foreach (Wall wall in new FilteredElementCollector(doc).OfClass(typeof(Wall))) { var wallType = wall.WallType; var compoundLayers = wallType.GetCompoundStructure().GetLayers(); var wallLength = wall.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble(); foreach (var layer in compoundLayers) { // 计算图层体积并转换为常用单位(比如立方米) var volume = UnitUtils.ConvertFromInternalUnits( layer.Volume * wallLength, DisplayUnitType.DUT_CUBIC_METERS ); wallLayerData.Add(new Dictionary<string, object> { {"WallId", wall.Id.IntegerValue}, {"LayerName", layer.Material?.Name ?? "Unnamed Layer"}, {"Volume", volume} }); } } // 将结果写入输出JSON文件,返回给前端 File.WriteAllText("wall_layer_volumes.json", JsonConvert.SerializeObject(wallLayerData)); } - 通过Forge Design Automation API触发这个插件运行,获取输出的JSON数据后,在Viewer中关联构件ID展示对应的分层体积。
方法3:尝试请求Model Derivative的原生参数(不推荐)
你可以在调用Model Derivative API导出模型时,添加advanced参数请求保留更多Revit原生属性,但大概率还是拿不到分层体积——因为SVF的轻量化逻辑会优先剔除这类计算型明细数据,所以这个方案可靠性很低,不推荐作为主要方案。
内容的提问来源于stack exchange,提问作者M R
相关产品推荐
相关产品推荐

