【问题标题】:How do I get all elements of a certain category, type and familiy in revit如何在 revit 中获取某个类别、类型和族的所有元素
【发布时间】:2020-05-18 22:49:51
【问题描述】:

我有一个函数,我想获取属于某个类别、类型和系列的所有元素。我将它们的名称作为字符串,并希望获得符合条件的实际元素。

我尝试了以下方法:

    internal static void getElemetWithId(Document doc,string catName, string famname, string symbname)
    {

        Category category=null;
        foreach (var cat in  doc.Settings.Categories){
            if (((Category)cat).Name.Contains(catName))
            {
                category = (Category)cat;
                break;
            }
        }
        HashSet<Element> elements = new HashSet<Element>();
        elements.AddRange(GetFilteredElementCollector(doc, new ElementRetrievalOptions())
          .OfCategory(category).WhereElementIsElementType(famname).ToElements());
            }

但这不起作用,因为 OfCategory 不接受 Category 作为参数(它确实适用于 builtInCategory),并且 WhereElementIsElementType 似乎不接受任何参数。

此函数的可能输入是document, "Doors" , "M_Single-Flush" , "0915 x 2134mm"

【问题讨论】:

  • 请注意,这是一个主要需要了解 revit api 而不是 c# 的问题,这也适用于 revit 2014-2017。

标签: c# revit-api revit


【解决方案1】:

您应该查看 Revit SDK,http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=16777469,并查看一些示例代码。您还可以查看 Jeremy 的页面:http://thebuildingcoder.typepad.com,以及 Harry 的页面:https://boostyourbim.wordpress.com,了解更多示例代码。

您应该使用 FilteredElementCollector 类来查找您要查找的所有元素:

FilteredElementCollector allInstances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)‌​).Where(q => (q as FamilyInstance).Symbol.Name == symbname);

【讨论】:

  • 查找特定 FamilySymbol 的所有已放置实例:FilteredElementCollector allInstances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Where(q =&gt; q.Symbol.Name == symbname);
  • Anthony 结合他随后的评论提供了上述完整而完美的答案。 +1 来自我。安东尼,您可以编辑原始答案以在正文中包含评论中的建议吗?谢谢!
【解决方案2】:

您可以使用 FilteredElementCollector 类获取属于某个类别的所有元素。在查询中传递特定姓氏的名称,您将获得所需家族和类型的所有元素。我最近在 Revit 2019 上试过这个。

List<Element> listOfElements = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).WhereElementIsElementType()
                .ToElements().Where(e => e.Name == elementName).ToList<Element>();

        ElementId symbolId = listOfElements[0].Id;

        FamilyInstanceFilter familyInstanceFilter= new FamilyInstanceFilter(doc, symbolId);
        IList<Element> familyInstances = new FilteredElementCollector(doc).WherePasses(familyInstanceFilter).ToElements();

【讨论】:

  • 我更喜欢这种解决方案,因为它允许过滤元素收集器使用 ElementIntersectsSolidFilter() 进行扩展。我会用 .FirstOrDefault() 扩展第一行以替换第 4 行
猜你喜欢
  • 2020-06-30
  • 2021-02-21
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2012-12-26
相关资源
最近更新 更多