Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Vladislav от 10-10-2019, 15:53:36

Название: Получение элементов модели
Отправлено: Vladislav от 10-10-2019, 15:53:36
Здравствуйте.
Подскажите пожалуйста, как получить все элементы модели (например в виде List<Element> или List<ElementId>)?
Лучше в виде List<ElementId>.
То есть элементы, имеющие геометрию и отображаемые на виде {3D}.
Спасибо за ответы.
Название: Re: Получение элементов модели
Отправлено: Александр Игнатович от 10-10-2019, 16:48:39
Ну во-первых, поиск чего угодно осуществляется с помощью FilteredElementCollector-а. Вопрос, насколько понимаю, состоит в том, чтобы задать условия для поиска.

На самом деле, вопрос не совсем корректный, так что отвечаю исходя из следующего - нужны элементы модельных категории. Тогда из Document.Setting.Categories фильтруем перечень категорий, у которых свойство CategoryType == CategoryType.Model. Из этого перечня собираем ElementMulticategoryFilter, комбинируем его с помощью LogicalAndFilter c инвертированным ElementIsElementTypeFilter, скармливаем FilteredElementCollector-у, получаем искомый список элементов.
Название: Re: Получение элементов модели
Отправлено: Vladislav от 10-10-2019, 17:35:00
Спасибо.
Логику примерно понял. А вот по реализации не очень.
Можно пример кода?
Название: Re: Получение элементов модели
Отправлено: Александр Игнатович от 10-10-2019, 17:42:30
По быстрому на Iron Python Shell-е накидал:

Код - Python [Выбрать]
  1. collector = FilteredElementCollector(doc)
  2.  
  3. categories = doc.Settings.Categories.Cast[Category]().Where(lambda x: x.CategoryType == CategoryType.Model and x.HasMaterialQuantities).Select(lambda x: x.Id).ToList[ElementId]()
  4.  
  5. filter = LogicalAndFilter(ElementMulticategoryFilter(categories), ElementIsElementTypeFilter(True))
  6.  
  7. elements = collector.WherePasses(filter).ToElements()
  8.  
  9. lookup(elements)

Добавил еще проверку свойства HasMaterialQuantities, вроде то, что нужно, потому как некоторые лишние категории в перечень попадают, потестируйте, может, взамен просто указывать, что категория не в некотором перечне "запрещенных"