Получение элементов модели

Автор Тема: Получение элементов модели  (Прочитано 3320 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Здравствуйте.
Подскажите пожалуйста, как получить все элементы модели (например в виде List<Element> или List<ElementId>)?
Лучше в виде List<ElementId>.
То есть элементы, имеющие геометрию и отображаемые на виде {3D}.
Спасибо за ответы.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Получение элементов модели
« Ответ #1 : 10-10-2019, 16:48:39 »
Ну во-первых, поиск чего угодно осуществляется с помощью FilteredElementCollector-а. Вопрос, насколько понимаю, состоит в том, чтобы задать условия для поиска.

На самом деле, вопрос не совсем корректный, так что отвечаю исходя из следующего - нужны элементы модельных категории. Тогда из Document.Setting.Categories фильтруем перечень категорий, у которых свойство CategoryType == CategoryType.Model. Из этого перечня собираем ElementMulticategoryFilter, комбинируем его с помощью LogicalAndFilter c инвертированным ElementIsElementTypeFilter, скармливаем FilteredElementCollector-у, получаем искомый список элементов.

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Re: Получение элементов модели
« Ответ #2 : 10-10-2019, 17:35:00 »
Спасибо.
Логику примерно понял. А вот по реализации не очень.
Можно пример кода?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Получение элементов модели
« Ответ #3 : 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, вроде то, что нужно, потому как некоторые лишние категории в перечень попадают, потестируйте, может, взамен просто указывать, что категория не в некотором перечне "запрещенных"