2017-06-29 45 views
0

现在我一直在寻找一种方法来按照家人过滤元素。例如,我想要所有家庭接线盒的元件 - 负载。我对Revit API有点新鲜,我也知道类别过滤器和甚至是家族实例过滤器。但我不明白我如何获得接线盒的家庭符号 - 例如,加载家庭。有没有这样做的好方法?或者我最好过滤家庭中的特定类型?如果是这样,我将如何去做这件事?由Revit API中的家族过滤

谢谢!!!!

顺便说一下,我在C编程#

回答

0

雅各布,

杰里米的答案是正确的。下面是一个可以用来获得一定的家族名称的所有家庭实例的代码示例:

杰里米提到的是使用的参数过滤器的有效途径:

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"); 

我知道杰里米提到第二种方法效率不高,但我个人不完全确定。​​是一个慢速过滤器,它扩展了内存中的所有元素。事件虽然它与两个快速筛选器FamilyFamilyInstance选择相结合,但这仍然是一个相当大的开销,而不是使用LINQ可以采取的更直接的方法。

你还问能选择FamilySymbol

var famType = new FilteredElementCollector(m_doc) 
     .OfClass(typeof(FamilySymbol)) 
     .FirstOrDefault(x => x.Name == "YourFamilyTypeName"); 
+0

谢谢你的彻底例子。你能解释一下哪个更具体吗?否则,我可以使用API​​数据库来查找所有使用的方法。另外,where(...)方法与ToElements()的做法是一样的,还是在将结果用作过滤器之前仍然需要这样做? –

+0

下面是一个链接,更详细地解释了这一点:http://thebuildingcoder.typepad.com/blog/2010/06/parameter-filter.html – konrad

0

欢迎来到Revit编程!

使用Revit API开始学习和编程(包括安装和使用SDK)的最有效方法是完成入门材料,特别是DevTV和My提供的分步说明首先的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后处理或LINQ

有关Retrieving Elements Using FilteredElementCollector的主题组中的The Building Coder大量提供了更多详细信息。

+0

非常感谢你对你的回应。我目前正在浏览Revit API和Autodesk的教程。我确实有过编程经验,但Revit API是一个全新的世界。我将在制作加载项时继续阅读您的教程。再次感谢你! –