我想将墙壁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,因为它仍然为空。
答案 0 :(得分:1)
您应该在调试器中逐步执行代码,并逐行观察发生了什么。然后,您会发现出了什么问题:过滤后的元素收集器未发现任何壁垒。
在进行任何编程之前,您应该使用RevitLookup和其他数据库浏览工具来确保您正在寻找正确的东西。
如果窥探一堵墙,您会发现它不是FamilyInstance
元素。
有专门的Wall
墙类。
如果仅过滤OfClass(typeof(Wall))
,就会得到它们。
此外,对ToElements
的调用浪费了时间和存储空间。只需删除它即可。
我经常在The Building Coder上进行过讨论。
如果只想遍历已过滤元素收集器的结果,则无需使用ToElements
。
您可以直接在收集器本身上进行迭代。
使用ToElements
创建信息的副本,并无故使用时间和空间,例如FindElement and collector optimisation。