Получить параметры общие для элементов в коллекции
Главная › Форумы › Python › Помогите с питон кодом › Получить параметры общие для элементов в коллекции
- В этой теме 6 ответов, 3 участника, последнее обновление 6 лет, 5 месяцев назад сделано Alex Babinoff.
-
АвторСообщения
-
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)
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())
//..получить список параметров который применим ко всем этим элементам..//
мне думается это глупая затея.
в каком случае это нужно? приведи пример.Мне приходила похожая идея, когда хотел скрипт по очистке неиспользуемых параметров сделать. Но только хотел получить в обратной последовательности. Просто взять все параметры и получить от них все категории к которым они применены. Дальше пойти в категории, в элементы, проверить заполнен ли там параметр и если он не заполнен ни в одном элементе во всем проекте
doc.Delete(i.Id)
A.BalmУчастникLegantmar, Изначально хотелось сделать универсальный фильтр для выбора элементов без создания спецификаций и не перетыкивая поэлементно каждый и сохранить затем как фильтр выбора. Например, часто сталкиваюсь с задачей выбрать элементы из достаточно большого проекта на основе параметров таких как, предположим “марка содержит КМ”, “на уровнях 2, 3 и 10”, “все балки с высотой сечения от 250 до 350″ и ” колонны длиной менее 3000″ – это, конечно, пример взятый из головы логики тут искать не нужно, но сам принцип таков. Что делать с ними далее это другой вопрос…. пронумировать, заспецифицировать, скопировать, сделать выборку и выгрузить в excel.
Есть конечно сторонние приложения с закрытым кодом и не совсем нужным функционалом, к тому же хотелось бы самому разобраться.Alex Babinoff, у Вас получилось? Думаю можно было бы реализовать и это, ведь по сути задача та же. Только я так и не нашел как можно итерироваться по набору параметров., т.е как создать список параметров отдельно от элементов, по ID если только?
A.Balm, вот и я не нашёл, как от параметров пойти к категориям и дальше уже по иерархии. А идти к этой задачи, с другой стороны, от всех элементов проекта, как-то очень не захотелось.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.