【问题标题】:Set Wall Instance Id into Parameter Wall Id将墙实例 ID 设置为参数墙 ID
【发布时间】:2019-06-21 02:22:33
【问题描述】:

我想将墙 ID 放入墙的属性中。

代码会构建,但不会将墙 id 放入所有墙的参数 wall id。

我试过没有交易和有交易。我的印象是必须使用它们来执行,但我没有得到正确的结果(或任何结果)。

public void InsertWallID() {

        Document doc = this.ActiveUIDocument.Document; 

        FilteredElementCollector collector =    new FilteredElementCollector(doc);

        ICollection<Element> WallEls =  collector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Walls).ToElements();


using (Transaction trans = new Transaction(doc, "Change wall parameters values"))
{
    trans.Start();

        int WallIDValue;

    foreach(Element WallEl in WallEls)
        {           
        ElementId WallId = WallEl.Id;
        WallIDValue = WallId.IntegerValue;
        if(WallEl.LookupParameter("WallID")==null)
        {


        Parameter wallparam = WallEl.LookupParameter("WallID") as Parameter;
            wallparam.Set(WallIDValue);
        }
            }
          trans.Commit();
        }
    }
}

}

预期结果: 每个实例的参数中都有自己的 id。这将让我安排墙壁和他们的墙壁 ID

实际结果: 参数 WallID 没有更改,因为它仍然为空。

【问题讨论】:

    标签: c# revit-api


    【解决方案1】:

    您应该在调试器中单步执行您的代码,并逐行观察发生的情况。然后你会看到出了什么问题:你的过滤元素收集器没有找到墙壁。

    在进行任何编程之前,您应该使用RevitLookup 和其他数据库探索工具来确保您正在寻找正确的东西。

    如果你窥探一堵墙,你会发现它不是 FamilyInstance 元素。

    有一个专门的Wall 类用于墙。

    如果你只过滤OfClass(typeof(Wall)),你就会得到它们。

    另外,对ToElements 的调用是对时间和内存空间的浪费。直接删除即可。

    我在The Building Coder 上经常讨论这个问题。

    如果您只想迭代过滤元素收集器的结果,则无需使用ToElements

    您可以直接遍历收集器本身。

    使用ToElements 创建信息副本并无缘无故地使用时间和空间,参见FindElement and collector optimisation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多