Как получить все элементы определенной категории, типа и семейства в Revit

У меня есть функция, в которой я хотел бы получить все элементы, принадлежащие к определенной категории, типу и семейству. У меня есть их имена в виде строк, и я хотел бы получить фактические элементы, соответствующие критериям.

Я пробовал немного со следующим:

    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 не принимает категорию в качестве аргумента (она работает для встроенной категории), а WhereElementIsElementType, похоже, не принимает никаких аргументов.

Возможным входом для этой функции будет document, "Doors" , "M_Single-Flush" , "0915 x 2134mm"


person Thijser    schedule 30.09.2016    source источник
comment
Обратите внимание, что это вопрос, который в основном потребует знания Revit API, а не С#, также это должно работать для Revit 2014-2017.   -  person Thijser    schedule 30.09.2016


Ответы (2)


Вам следует взглянуть на Revit SDK, http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=16777469 и просмотрите пример кода. Вы также можете посмотреть страницу Джереми: http://thebuildingcoder.typepad.com и страницу Гарри: https://boostyourbim.wordpress.com для получения дополнительных примеров кода.

Вы должны использовать класс FilteredElementCollector, чтобы найти все элементы, которые вы ищете:

FilteredElementCollector allInstances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)‌​).Where(q => (q as FamilyInstance).Symbol.Name == symbname);
person Anthony Tiefenbach    schedule 30.09.2016
comment
Чтобы найти все размещенные экземпляры определенного FamilySymbol: FilteredElementCollector allInstances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Where(q => q.Symbol.Name == symbname); - person Anthony Tiefenbach; 30.09.2016
comment
Энтони дает полный и идеальный ответ выше в сочетании с его последующим комментарием. +1 от меня. Энтони, можете ли вы отредактировать свой исходный ответ, чтобы включить предложение из комментария в основной текст? Спасибо! - person Jeremy Tammik; 30.09.2016

Вы можете получить все элементы, принадлежащие к определенной категории, используя класс 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();
person Mah Noor    schedule 17.04.2019
comment
Я предпочитаю это решение, поскольку оно позволяет расширить сборщик фильтрованных элементов, например, с помощью ElementIntersectsSolidFilter(). Я бы расширил первую строку с помощью .FirstOrDefault(), чтобы заменить строку 4 - person Hacky; 10.06.2021