Получить параметры общие для элементов в коллекции

Главная Форумы Python Помогите с питон кодом Получить параметры общие для элементов в коллекции

Помечено: ,

В этой теме 6 ответов, 3 участника, последнее обновление  Alex Babinoff 4 мес. назад.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • #8235 Score: 0

    A.Balm
    Участник

    Доброго времени суток, коллеги!

    Не так давно стал изучать способы автоматизации revit. Сейчас хотелось бы разобраться больше с принципами работы API и для начала с фильтрами.

    Имеется коллекция полученная из FIlteredElementCollection в которую входят совершенно разные элементы: стены, полы и колонны, к примеру… Задача из всей этой коллекции получить список параметров который применим ко всем этим элементам, а затем фильтровать по ним, например оставить в коллекции только элементы которые располагаются на 2 ом этаже и в поле марка имеют значение “ololo”.Подскажите как это можно реализовать?

    uidoc = __revit__.ActiveUIDocument
    doc = uidoc.Document
    
    collector = FilteredElementCollector(doc)
    
    list_of_categories = [
        ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns),
        ElementCategoryFilter(BuiltInCategory.OST_Walls),
        ElementCategoryFilter(BuiltInCategory.OST_Floors)
    ]
    
    logical_filter = LogicalOrFilter(list_of_categories)
    collector.WherePasses(logical_filter)
    #8237 Score: 1

    Legantmar
    Хранитель
    451 pts

    Только в цикле проверяя равняется ли значение параметра элемента == “ololo”, если да, то складывать в новый список.
    Точно также с расположением на втором этаже, но тут уже нужно проверять либо уровень либо базовую зависимость.

    из моего старого, даже с голосом, наслаждайся (см. до конца)

    #8241 Score: 0

    A.Balm
    Участник

    Спасибо огромное за наводку!

    Задача стояла чуть шире.. см. код ниже)) Но твое видео навело на интересную мысль: просто найти все параметры а потом сделать пересечение данных множеств и получить множество параметров которые принадлежат всей коллекции. Хорошо бы теперь все это оформить с помощью хотя бы SlowFilter, а не перебора нерасторопным питоном в лоб))

    Уровни слишком специфичный параметр что бы по на его основе фильтровать.. тем >, что для разных семейств он представлен по разному: стены – зависимость снизу  и сверху, familySymbol – уровень плюс смещение, и.т.д

    import clr
    clr.AddReference('RevitAPI')
    clr.AddReference('RevitAPIUI')
    from Autodesk.Revit.DB import *
    
    clr.AddReference("System.Core")
    from System.Collections.Generic import List
    
    import System
    clr.ImportExtensions(System.Linq)
    
    """ Function region """
    def set_of_string(set_string):
        name = ' '
        for i in set_string:
            name += ' ' + str(i)
        return name
    
    """ Main region """
    uidoc = __revit__.ActiveUIDocument
    doc = uidoc.Document
    
    collector = FilteredElementCollector(doc)
    collector.WhereElementIsNotElementType() # only Instances pass the collector
    
    list_of_categories = [
        ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns),
        ElementCategoryFilter(BuiltInCategory.OST_Walls),
        # ElementCategoryFilter(BuiltInCategory.OST_Floors)
    ]
    
    logical_filter = LogicalOrFilter(list_of_categories)
    collector.WherePasses(logical_filter)
    
    parameter_sets = []
    trigger = 0
    for element in collector:
        try:
            parameter_set = set()
            for parameter in element.Parameters:
                parameter_set.add(parameter.Id)
            parameter_sets.append(parameter_set)
            print('ok! ' + set_of_string(parameter_set))  
        except:
            print('Error...')
            continue
    
    a = set.intersection(*parameter_sets)
    print(len(a))
    
    for id in a:
        print(id.Value.ToString())
    #8247 Score: 0

    Legantmar
    Хранитель
    451 pts

    //..получить список параметров который применим ко всем этим элементам..//
    мне думается это глупая затея.
    в каком случае это нужно? приведи пример.

    #8252 Score: 0

    Alex Babinoff
    Модератор
    14 pts

    Мне приходила похожая идея, когда хотел скрипт по очистке неиспользуемых параметров сделать. Но только хотел получить в обратной последовательности. Просто взять все параметры и получить от них все категории к которым они применены. Дальше пойти в категории, в элементы, проверить заполнен ли там параметр и если он не заполнен ни в одном элементе во всем проекте doc.Delete(i.Id)

    #8254 Score: 0

    A.Balm
    Участник

    Legantmar, Изначально хотелось сделать универсальный фильтр для выбора элементов без создания спецификаций и не перетыкивая поэлементно каждый и сохранить затем как фильтр выбора. Например, часто сталкиваюсь с задачей выбрать элементы из достаточно большого проекта на основе параметров таких как, предположим “марка содержит КМ”, “на уровнях 2, 3 и 10”, “все балки с высотой сечения от 250 до 350″ и ” колонны длиной менее 3000″ – это, конечно, пример взятый из головы логики тут искать не нужно, но сам принцип таков. Что делать с ними далее это другой вопрос…. пронумировать, заспецифицировать, скопировать, сделать выборку и выгрузить в excel.
    Есть конечно сторонние приложения с закрытым кодом и не совсем нужным функционалом, к тому же хотелось бы самому разобраться.

    Alex Babinoff, у Вас получилось? Думаю можно было бы реализовать и это, ведь по сути задача та же. Только я так и не нашел как можно итерироваться по набору параметров., т.е как создать список параметров отдельно от элементов, по ID если только?

    #8255 Score: 0

    Alex Babinoff
    Модератор
    14 pts

    A.Balm, вот и я не нашёл, как от параметров пойти к категориям и дальше уже по иерархии. А идти к этой задачи, с другой стороны, от всех элементов проекта, как-то очень не захотелось.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)

Для ответа в этой теме необходимо авторизоваться.