C# 在Revit API中按族过滤
一段时间以来,我一直在寻找一种方法,通过他们的家庭过滤元素。例如,我希望所有属于族接线盒的图元-载入。我对Revit API有点陌生,我确实知道类别过滤器,甚至是族实例过滤器。但我不明白如何获得接线盒的族符号-例如,Load族。有什么好办法吗?还是我最好过滤家族中的特定类型?如果是,我将如何执行此操作?欢迎使用Revit编程 开始学习和编程Revit API(包括安装和使用SDK)的最有效方法是阅读入门资料,特别是DevTV和我的第一个Revit插件视频教程提供的分步说明: 回答您的问题:使用过滤的图元收集器从Revit数据库检索图元: 您可以对它们应用许多过滤器。在您的情况下,可以直接筛选C# 在Revit API中按族过滤,c#,revit-api,revit,C#,Revit Api,Revit,一段时间以来,我一直在寻找一种方法,通过他们的家庭过滤元素。例如,我希望所有属于族接线盒的图元-载入。我对Revit API有点陌生,我确实知道类别过滤器,甚至是族实例过滤器。但我不明白如何获得接线盒的族符号-例如,Load族。有什么好办法吗?还是我最好过滤家族中的特定类型?如果是,我将如何执行此操作?欢迎使用Revit编程 开始学习和编程Revit API(包括安装和使用SDK)的最有效方法是阅读入门资料,特别是DevTV和我的第一个Revit插件视频教程提供的分步说明: 回答您的问题:使用
FamilySymbol
实例
有两种方法可以将搜索进一步限制为仅检索您感兴趣的对象,即“接线盒-加载”
:
- 高效:使用参数过滤器
- 简单:使用.NET后处理或LINQ
主题组中的提供了大量详细信息。欢迎使用Revit编程 开始学习和编程Revit API(包括安装和使用SDK)的最有效方法是阅读入门资料,特别是DevTV和我的第一个Revit插件视频教程提供的分步说明: 回答您的问题:使用过滤的图元收集器从Revit数据库检索图元: 您可以对它们应用许多过滤器。在您的情况下,可以直接筛选
FamilySymbol
实例
有两种方法可以将搜索进一步限制为仅检索您感兴趣的对象,即“接线盒-加载”
:
- 高效:使用参数过滤器
- 简单:使用.NET后处理或LINQ
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提到的有效方法是使用参数过滤器:
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");
非常感谢您的回复。我目前正在阅读您和Autodesk关于Revit API的教程。我以前确实有编程经验,但Revit API是一个全新的世界。在制作外接程序时,我将继续阅读您的教程。再次感谢你!非常感谢您的回复。我目前正在阅读您和Autodesk关于Revit API的教程。我以前确实有编程经验,但Revit API是一个全新的世界。在制作外接程序时,我将继续阅读您的教程。再次感谢你!谢谢你提供了详尽的例子。你能更具体地解释一下它们各自的作用吗?否则,我可以使用API数据库查找所有使用的方法。此外,where(…)方法是否与ToElements()方法相同,或者在将结果用作筛选器之前,我是否仍需要这样做?下面的链接将更详细地解释这一点:感谢您提供了完整的示例。你能更具体地解释一下它们各自的作用吗?否则,我可以使用API数据库查找所有使用的方法。此外,where(…)方法是否与ToElements()方法相同,或者在将结果用作筛选器之前,我是否仍需要这样做?下面的链接对此进行了更详细的解释: