将墙实例ID设置为参数墙ID

时间:2019-06-20 11:36:02

标签: c# revit-api

我想将墙壁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,因为它仍然为空。

1 个答案:

答案 0 :(得分:1)

您应该在调试器中逐步执行代码,并逐行观察发生了什么。然后,您会发现出了什么问题:过滤后的元素收集器未发现任何壁垒。

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

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

有专门的Wall墙类。

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

此外,对ToElements的调用浪费了时间和存储空间。只需删除它即可。

我经常在The Building Coder上进行过讨论。

如果只想遍历已过滤元素收集器的结果,则无需使用ToElements

您可以直接在收集器本身上进行迭代。

使用ToElements创建信息的副本,并无故使用时间和空间,例如FindElement and collector optimisation