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

如何通过Revit API为项目中所有房间添加新参数?

解决方案

要给Revit项目中的房间添加无默认值的文本类型参数,你需要先创建参数定义并绑定到Room类别,之后才能为房间实例赋值。以下是修改后的完整代码:

using (Transaction t = new Transaction(doc, "Update room parameters"))
{
    t.Start();

    // 共享参数文件路径,替换为你的实际路径
    string sharedParamFilePath = @"C:\YourSharedParameters.txt";
    DefinitionFile defFile = null;

    try
    {
        // 打开或创建共享参数文件
        defFile = doc.Application.OpenSharedParameterFile();
        if (defFile == null)
        {
            defFile = doc.Application.CreateSharedParameterFile(sharedParamFilePath);
        }
    }
    catch (Exception ex)
    {
        // 处理共享参数文件操作异常
        TaskDialog.Show("Error", $"Failed to access shared parameter file: {ex.Message}");
        t.RollBack();
        return;
    }

    foreach (var model in roomDataModels)
    {
        Room room = model.Room;
        if (room == null) continue;

        try
        {
            Autodesk.Revit.DB.Parameter parameter = room.LookupParameter("Sample new parameter");
            if (parameter == null)
            {
                // 1. 获取或创建参数组
                DefinitionGroup defGroup = defFile.Groups.get_Item("Room Parameters");
                if (defGroup == null)
                {
                    defGroup = defFile.Groups.Create("Room Parameters");
                }

                // 2. 创建文本类型参数定义
                Definition def = defGroup.Definitions.get_Item("Sample new parameter");
                if (def == null)
                {
                    ExternalDefinitionCreationOptions options = new ExternalDefinitionCreationOptions(
                        "Sample new parameter", 
                        ParameterType.Text);
                    options.UserModifiable = true;
                    def = defGroup.Definitions.Create(options);
                }

                // 3. 将参数绑定到Room类别
                Category roomCat = Category.GetCategory(doc, BuiltInCategory.OST_Rooms);
                InstanceBinding binding = doc.Application.Create.NewInstanceBinding();
                binding.Categories.Insert(roomCat);

                // 检查参数是否已绑定,避免重复绑定
                bool isParameterBound = false;
                foreach (ElementId defId in doc.ParameterBindings)
                {
                    Definition existingDef = doc.ParameterBindings.get_Item(defId);
                    if (existingDef.Name == "Sample new parameter")
                    {
                        isParameterBound = true;
                        break;
                    }
                }

                if (!isParameterBound)
                {
                    doc.ParameterBindings.Insert(def, binding, BuiltInParameterGroup.PG_TEXT);
                }

                // 4. 获取新参数并赋值(如果需要)
                parameter = room.LookupParameter("Sample new parameter");
                if (parameter != null && !parameter.HasValue)
                {
                    parameter.Set(model.SampleNewParameter);
                }
            }
            else if (!parameter.HasValue)
            {
                parameter.Set(model.SampleNewParameter);
            }
        }
        catch (Exception e)
        {
            // 记录异常而非忽略,便于调试
            TaskDialog.Show("Warning", $"Failed to update room {room.Name}: {e.Message}");
        }
    }

    t.Commit();
}

关键注意事项

  • 共享参数文件路径:必须替换为你实际的共享参数文件路径,如果文件不存在,代码会自动创建一个。
  • 参数绑定:确保参数绑定到OST_Rooms类别,这样所有房间实例都会拥有该参数。
  • 异常处理:原代码忽略了异常,建议改为记录异常信息,方便调试问题。
  • 重复绑定检查:避免多次绑定同一个参数,防止Revit报错。

内容的提问来源于stack exchange,提问作者Santiago Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:22:20