在 Revit 中按族过滤 API
Filtering by a Family in Revit API
一段时间以来,我一直在寻找一种按家人过滤元素的方法。例如,我想要 Junction Boxes - Load 系列的所有元素。我是 Revit API 的新手,我知道类别过滤器甚至族实例过滤器。但是我不明白我是如何获得接线盒的系列符号的 - 例如负载系列。甚至有这样做的好方法吗?还是我最好过滤家庭中的特定类型?如果是这样,我该怎么做?
欢迎使用 Revit 编程!
开始使用 Revit API 学习和编程(包括安装和使用 SDK)的最有效方法是完成入门 material,尤其是循序渐进DevTV 和我的第一个 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"
:
- 高效:使用参数过滤器
- 简单:使用 .NET post-processing 或 LINQ
The Building Coder in the topic group on Retrieving Elements Using FilteredElementCollector
提供了更多详细信息。
雅各布,
Jeremy 的回答是正确的。下面是一个代码示例,可用于获取某个家族名称的所有家族实例:
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
selection 的两个快速过滤器相结合,但与您可以使用 LINQ 采取的更直接的方法相比,这仍然是一个相当大的开销。
您还询问了能够 select FamilySymbol
var famType = new FilteredElementCollector(m_doc)
.OfClass(typeof(FamilySymbol))
.FirstOrDefault(x => x.Name == "YourFamilyTypeName");
一段时间以来,我一直在寻找一种按家人过滤元素的方法。例如,我想要 Junction Boxes - Load 系列的所有元素。我是 Revit API 的新手,我知道类别过滤器甚至族实例过滤器。但是我不明白我是如何获得接线盒的系列符号的 - 例如负载系列。甚至有这样做的好方法吗?还是我最好过滤家庭中的特定类型?如果是这样,我该怎么做?
欢迎使用 Revit 编程!
开始使用 Revit API 学习和编程(包括安装和使用 SDK)的最有效方法是完成入门 material,尤其是循序渐进DevTV 和我的第一个 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"
:
- 高效:使用参数过滤器
- 简单:使用 .NET post-processing 或 LINQ
The Building Coder in the topic group on Retrieving Elements Using FilteredElementCollector
提供了更多详细信息。
雅各布,
Jeremy 的回答是正确的。下面是一个代码示例,可用于获取某个家族名称的所有家族实例:
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
selection 的两个快速过滤器相结合,但与您可以使用 LINQ 采取的更直接的方法相比,这仍然是一个相当大的开销。
您还询问了能够 select FamilySymbol
var famType = new FilteredElementCollector(m_doc)
.OfClass(typeof(FamilySymbol))
.FirstOrDefault(x => x.Name == "YourFamilyTypeName");