将 Wall Instance Id 设置为参数 Wall Id

Set Wall Instance Id into Parameter Wall Id

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

代码构建但没有将墙 id 放入所有墙的参数墙 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 没有变化,因为它仍然是空的。

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

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

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

有专门的 Wall class 墙。

如果您只过滤 OfClass(typeof(Wall)),您将得到它们。

此外,调用 ToElements 是浪费时间和内存 space。干脆删了。

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

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

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

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