Revit二次开发:使用C#创建明细表时无法添加计算值
在Revit中用C#创建明细表并添加计算值
核心实现流程与问题解决
要实现带计算值的明细表创建,核心是正确调用ScheduleCalculatedField类,并严格在Revit事务内执行所有修改操作。以下是完整的可运行逻辑:
- 开启事务
Revit API所有修改操作必须包裹在事务中,先初始化事务容器:
using (Transaction trans = new Transaction(doc, "创建带计算值的明细表")) { trans.Start(); // 所有明细表操作写在此区域 trans.Commit(); }
- 创建明细表基础定义
指定目标构件类别(示例为墙),生成ScheduleDefinition实例:
ElementCategoryId wallCategory = new ElementCategoryId(BuiltInCategory.OST_Walls); ScheduleDefinition scheduleDef = ScheduleDefinition.Create(doc, wallCategory); scheduleDef.Name = "墙明细表(含计算值)";
- 添加常规字段
先配置基础展示字段(如类型名称、构件面积):
// 添加类型名字段 ScheduleField typeNameField = scheduleDef.AddField(ScheduleFieldType.Instance); typeNameField.FieldId = new ElementId(BuiltInParameter.ALL_MODEL_TYPE_NAME); // 添加系统计算的面积字段 ScheduleField areaField = scheduleDef.AddField(ScheduleFieldType.Instance); areaField.FieldId = new ElementId(BuiltInParameter.HOST_AREA_COMPUTED);
- 添加自定义计算值字段
这是容易出错的环节,需注意公式语法、字段类型与单位匹配:
// 创建计算字段:将平方米面积转换为平方英尺 ScheduleCalculatedField calcField = ScheduleCalculatedField.Create(scheduleDef, ScheduleFieldType.Instance); calcField.Name = "面积(平方英尺)"; // 公式遵循Revit语法,可直接引用字段内部名称或用[字段索引]调用 calcField.Formula = "Area * 10.7639"; // 指定计算结果的显示单位 calcField.DisplayUnitType = DisplayUnitType.DUT_SQUARE_FEET;
- 生成最终明细表视图
将定义转换为可在项目中显示的明细表视图,还可附加排序、过滤规则:
ViewSchedule scheduleView = ViewSchedule.CreateSchedule(doc, scheduleDef); // 按面积降序排序 scheduleView.SortFields.Add(new ScheduleSortField(areaField.FieldId, SortOrder.Descending));
常见问题排查
- 公式执行报错:确保公式内的字段名称为Revit认可的内部名称,或用
[字段索引]格式引用(如[1]代表明细表第一个字段) - API权限异常:所有修改操作必须在
Transaction块内执行,否则会触发权限错误 - 计算值类型不匹配:避免在数值计算中引用文本类字段,确保公式返回值与字段类型一致
内容的提问来源于stack exchange,提问作者Islam Heakal
相关产品推荐
相关产品推荐

