C# 将墙实例Id设置为参数墙Id
我想将墙ID放入墙的属性中 代码将生成但不会将墙id放入所有墙的参数墙id中 我试过不做交易也不做交易。我的印象是必须使用它们来执行,但我没有得到正确的结果(或任何结果) public void InsertWallID() {C# 将墙实例Id设置为参数墙Id,c#,revit-api,C#,Revit Api,我想将墙ID放入墙的属性中 代码将生成但不会将墙id放入所有墙的参数墙id中 我试过不做交易也不做交易。我的印象是必须使用它们来执行,但我没有得到正确的结果(或任何结果) public void InsertWallID() { Document doc = this.ActiveUIDocument.Document; FilteredElementCollector collector = new FilteredElementCollector(d
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();
}
}
}
Document doc=this.ActiveUIDocument.Document;
FilteredElementCollector=新的FilteredElementCollector(单据);
ICollection Walls=类别(内置类别.OST_Walls).ToElements()的类别(类型(家族立场))的收集器;
使用(交易记录=新交易记录(单据,“更改墙参数值”))
{
trans.Start();
int-WallIDValue;
foreach(墙中的元素墙)
{
ElementId WallId=WallEl.Id;
WallIDValue=WallId.IntegerValue;
if(waller.LookupParameter(“WallID”)==null)
{
参数wallparam=WallEl.LookupParameter(“WallID”)作为参数;
wallparam.Set(WallIDValue);
}
}
trans.Commit();
}
}
}
}
预期结果:
每个实例的参数中都有自己的id。这样我就可以安排墙和它们的墙ID了
实际结果:
参数WallID仍然为空,因此没有更改。您应该在调试器中逐步检查代码,并逐行观察发生的情况。然后您将看到出现了什么问题:过滤元素收集器找不到任何墙 在编写任何东西之前,您应该使用和其他数据库探索工具来确保您正在寻找正确的东西 如果你窥探一堵墙,你会发现它不是一个
FamilyInstance
元素
对于墙,有一个专用的Wall
类
如果您只是过滤类(typeof(Wall))的,
您将得到它们
另外,调用ToElements
也是浪费时间和内存空间。只需删除它
我经常在网上讨论这个问题
如果只想迭代过滤元素收集器的结果,则无需使用ToElements
您可以直接在收集器本身上进行迭代
使用ToElements
创建信息的副本,并无故使用时间和空间,参见