如何通过C# Revit API在明细表中获取Element ID?代码异常排查
问题分析与修复方案
你的代码里第三列没显示的核心问题是错误地把类别ID转换成了参数ID,完全没用到Element ID对应的内置参数。
具体错误点:
- 你用
BuiltInCategory.OST_Windows的ID强转成BuiltInParameter,这两个ID属于不同的枚举范围,得到的参数ID是无效的,自然找不到对应的可调度字段。 - 另外你给窗户明细表加了
CASEWORK_WIDTH/HEIGHT(家具的宽高参数),虽然你说前两列显示了,但更规范的做法应该用窗户对应的内置参数WINDOW_WIDTH和WINDOW_HEIGHT。
修正后的完整代码:
using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System.Linq; using Nice3point.Revit.Toolkit.External; namespace Ecoworx { [Transaction(TransactionMode.Manual)] public class CreateScheduleCommandHandler : ExternalEventHandler { public override void Execute(UIApplication uiapp) { CreateSchedule(uiapp); } public static void CreateSchedule(UIApplication uiapp) { Document doc = uiapp.ActiveUIDocument.Document; using (Transaction t = new Transaction(doc, "创建窗户明细表")) { t.Start(); // 创建窗户类别明细表 ViewSchedule vs = ViewSchedule.CreateSchedule(doc, new ElementId(BuiltInCategory.OST_Windows)); // 添加字段:窗户宽度、高度、Element ID AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.WINDOW_WIDTH)); AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.WINDOW_HEIGHT)); AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.ELEM_ID)); t.Commit(); } } public static void AddRegularFieldToSchedule(ViewSchedule schedule, ElementId paramId) { ScheduleDefinition definition = schedule.Definition; // 查找匹配的可调度字段 SchedulableField schedulableField = definition.GetSchedulableFields() .FirstOrDefault(sf => sf.ParameterId == paramId); if (schedulableField != null) { definition.AddField(schedulableField); } } } }
关键修正说明:
- 替换Element ID参数:用
BuiltInParameter.ELEM_ID直接获取元素ID对应的内置参数,这才是明细表中显示Element ID的正确参数。 - 替换宽高参数:把家具的
CASEWORK_WIDTH/HEIGHT换成窗户专用的WINDOW_WIDTH/HEIGHT,避免参数不匹配的潜在问题。 - 冗余代码清理:删掉了无用的
doc.Regenerate()和错误的类别转参数代码,简化逻辑。
这样修改后,明细表就能正常显示三列:窗户宽度、高度和Element ID了。
内容的提问来源于stack exchange,提问作者Alena Karle
相关产品推荐
相关产品推荐

