Как подсчитать количество экземпляров семейства в проекте?

Автор Тема: Как подсчитать количество экземпляров семейства в проекте?  (Прочитано 23476 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Доброе утро!

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

Цель: перебрать все экземпляры (и их параметры) семейств и сформировать на базе этой информации отчеты.

P.S.: Пробовал перебрать все FamilyInstance, но затруднения вызвало то, что не все экземпляры определяются.

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Евгений,
 var famInstances = new FilteredElementCollector(doc).OfClass(typeof (FamilyInstance)).ToList();
вот так не все экземпляры возвращает?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Сейчас опробую )


К сожалению, тоже самое!!!

Крыши как не видел, так и не видит.

Попробую видео быстренько сварганить...

Отмечено как Решение Пашин Евгений 07-12-2015, 10:49:36

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Евгений, через FilteredElementEollector в любом случае.
Код - C# [Выбрать]
  1.                         var collector = new FilteredElementCollector(ActiveUIDocument.Document);
  2.                        
  3.                         ElementId familyId = new ElementId(12345);
  4.                        
  5.                         var instances =
  6.                                 collector
  7.                                 .OfClass(typeof(FamilyInstance))
  8.                                 .OfType<FamilyInstance>()
  9.                                 .Where(fi=>fi.Symbol.Family.Id == familyId);
  10.                        

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Крыши как не видел, так и не видит.
Крыши это системное семейство. Для них другой алгоритм.

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Крыши это случайно не класс RoofBase?
Тогда их нужно иначе искать.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Каждое системное семейство в API представлено своим классом. В общем виде не получится извлечь. Для крыш будет так:
Код - C# [Выбрать]
  1.                         var collector = new FilteredElementCollector(ActiveUIDocument.Document);
  2.                                                                
  3.                         var roofs =
  4.                                 collector
  5.                                 .OfClass(typeof(RoofBase))
  6.                                 .WhereElementIsNotElementType();

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Крыши это системное семейство. Для них другой алгоритм.

Так, а вот на этом месте можно поподробнее?

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Каждое системное семейство в API представлено своим классом. В общем виде не получится извлечь. Для крыш будет так:
Код - C# [Выбрать]
  1.                         var collector = new FilteredElementCollector(ActiveUIDocument.Document);
  2.                                                                
  3.                         var roofs =
  4.                                 collector
  5.                                 .OfClass(typeof(RoofBase))
  6.                                 .WhereElementIsNotElementType();

Попробую... один момент.



Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Великолепно!

А есть еще какие-то семейства, определяемые таким же образом?

Похоже стен тоже нет.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А есть еще какие-то семейства
Все системные семейства - стены, перекрытия, крыши, воздуховоды, трубы, кабельные лотки... Возможно еще что то упустил. Для каждого из таких семейств есть свой класс в API

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Все системные семейства - стены, перекрытия, крыши, воздуховоды, трубы, кабельные лотки... Возможно еще что то упустил. Для каждого из таких семейств есть свой класс в API

Да уж ))) Так и есть! Ответ, в принципе получен. Спасибо, Виктор!

Для определения экземпляров стен это выглядит так:

Код - C# [Выбрать]
  1.                         var collector = new FilteredElementCollector(ActiveUIDocument.Document);
  2.                                                                
  3.                         var roofs =
  4.                                 collector
  5.                                 .OfClass(typeof(Wall))
  6.                                 .WhereElementIsNotElementType();

А есть где-нибудь перечень всех системных семейств и названия их классов?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Возможно еще что то упустил

Если только перила )))

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А есть где-нибудь перечень всех системных семейств и названия их классов?
Списка такого вроде нет. Первое что пришло в голову - вот так:
Код - C# [Выбрать]
  1.         var systemFamilies =
  2.                 collector
  3.                 .WhereElementIsNotElementType()
  4.                 .Where(e=>!doc.GetElement(e.GetTypeId()) is FamilySymbol)
  5.                 .Select(e=>typeof(e))
  6.                 .Distinct()
  7.                 .ToList();
Т.е. берем все элементы, смотрим, чтобы их тип не являлся объектом класса FamilySymbol, т.е. системным.
Код не проверял. Здесь будет только список тех системных классов, экземпляры которых присутствуют в документе.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Попробую... один момент!