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

如何通过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);
            }
        }
    }
}

关键修正说明:

  1. 替换Element ID参数:用BuiltInParameter.ELEM_ID直接获取元素ID对应的内置参数,这才是明细表中显示Element ID的正确参数。
  2. 替换宽高参数:把家具的CASEWORK_WIDTH/HEIGHT换成窗户专用的WINDOW_WIDTH/HEIGHT,避免参数不匹配的潜在问题。
  3. 冗余代码清理:删掉了无用的doc.Regenerate()和错误的类别转参数代码,简化逻辑。

这样修改后,明细表就能正常显示三列:窗户宽度、高度和Element ID了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:30:27