有一段时间我一直在寻找一种方法来过滤他们家人的元素。例如,我想要所有家族接线盒的元素 - 加载。我对Revit API有点新,我知道类别过滤器甚至家庭实例过滤器。但我不明白如何获得Junction Box的家族符号 - 例如Load家族。有没有一个好方法这样做?或者我最好过滤家庭中的特定类型?如果是这样,我该怎么做呢?
谢谢!!!!
顺便说一下,我正在用C#编程
答案 0 :(得分:0)
欢迎使用Revit编程!
使用Revit API开始学习和编程的最有效方法,包括安装和使用SDK,是通过入门材料,特别是DevTV和My First提供的分步说明。 Revit插件视频教程:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#2
要回答您的问题:您使用过滤元素收集器从Revit数据库中检索元素:
http://www.revitapidocs.com/2017/263cf06b-98be-6f91-c4da-fb47d01688f3.htm
您可以对它们应用许多过滤器。在您的情况下,您可以直接过滤FamilySymbol
个实例。
有两种方法可以进一步限制搜索,只检索您感兴趣的内容,名为"Junction Boxes - Load"
:
The Building Coder上的主题组Retrieving Elements Using FilteredElementCollector
提供了更多详细信息。
答案 1 :(得分:0)
雅各
杰里米的答案是对的。以下是可用于获取某些姓氏的所有家庭实例的代码示例:
Jeremy提到的有效方法是使用参数过滤器:
var famType = new FilteredElementCollector(m_doc)
.OfClass(typeof(Family)) // This is called a class filter
.FirstOrDefault(x => x.Name == "YourFamilyName");
if (famType != null)
{
const BuiltInParameter testParam = BuiltInParameter.ELEM_FAMILY_PARAM;
var pvp = new ParameterValueProvider(new ElementId((int)testParam));
var fnrv = new FilterNumericEquals();
var ruleValId = famType.Id;
var paramFr = new FilterElementIdRule(pvp, fnrv, ruleValId);
var epf = new ElementParameterFilter(paramFr);
var results = new FilteredElementCollector(m_doc)
.OfClass(typeof(FamilyInstance))
.WherePasses(epf)
.ToElements();
}
这样做的效率较低:
var result = new FilteredElementCollector(m_doc)
.OfClass(typeof(FamilyInstance))
.Cast<FamilyInstance>()
.Where(x => x.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == "YourFamilyName");
我知道Jeremy提到第二种方法效率较低,但我个人并不完全确定。 ElementParameterFilter
是一个慢过滤器,它可以扩展内存中的所有元素。事件虽然它与Family
和FamilyInstance
选择的两个快速过滤器相结合,但这仍然是一个相当大的开销,而不是使用LINQ可以采取更直接的方法。
您还询问了是否可以选择FamilySymbol
var famType = new FilteredElementCollector(m_doc)
.OfClass(typeof(FamilySymbol))
.FirstOrDefault(x => x.Name == "YourFamilyTypeName");