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

ADN Club => Revit API => Тема начата: RevitTormentor от 08-03-2018, 07:14:13

Название: Wall или BuiltInCategory.OST_Walls
Отправлено: RevitTormentor от 08-03-2018, 07:14:13
Чем отличаются два кода?

Код - C# [Выбрать]
  1. ElementType elementType
  2.         = new FilteredElementCollector( doc )
  3.           .OfCategory( BuiltInCategory.OST_Walls ) // .OST_Columns
  4.           .OfClass( typeof( ElementType ) )
  5.           .FirstElement() as ElementType;
  6.  

Код - C# [Выбрать]
  1.             ICollection<Element> collections = collector.OfClass(typeof(Wall)).ToElements();
  2.             List<Wall> lstCol = new List<Wall>();
  3.             foreach (Wall item in collections)
  4.             {
  5.                 lstCol.Add(item);
  6.             }
  7.  
  8.  

Что такое категория, в данном случае стен BuiltInCategory.OST_Walls ?

И ещё Почему по второму коду я не могу выбрать также например колонны или балки.
Стена тоже может быть несущей или не несущей. Плита тоже, а колонны с балками где-то в "сторонке".

Как получить список колонн и балок например? Там же двери
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: Виктор Чекалин от 08-03-2018, 12:19:09
RevitTormentor,
Во первом случае вы получите только типоразмеры стен. Во втором - и типоразмеры и экземпляры стен.
Если говорить в целом, то один и тот же результат, можно получить разными фильтрами. Как делать выборку - по категории или по названию класса - зависит от ситуации. В случае со стенами, вроде не принципиально. В случае, например, с арматурой, там категория не равно одному классу.


Каждый объект в Revit имеет категорию. BuiltInCategory.OST_Walls - это лишь идентификатор этой категории.

Что качается остальных вопросов, то они немного странные.
FilteredElementCollector позволяет выбрать объекты по каким либо признакам. Во-втором коде ищите объекты, у которых категория - Стена. Нужны двери - ищите по категории Двери (OST_Doors). Нужны колонны - OST_Columns и т.п.
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: RevitTormentor от 08-03-2018, 13:02:41
Виктор спасибо за ответ,
А как получить список колонн по подобию кода
Код - C# [Выбрать]
  1.  ICollection<Element> collections = collector.OfClass(typeof(Wall)).ToElements();
  2.             List<Wall> lstCol = new List<Wall>();
  3.             foreach (Wall item in collections)
  4.             {
  5.                 lstCol.Add(item);
  6.             }

Если вместо Wall вставлю Columns Column или что-то подобное то ничего не получится.
Как выбрать колонны в проекте? Потом уже я постараюсь дожать дальнейшую фильтрацию и группировку.
Спасибо
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: Виктор Чекалин от 08-03-2018, 13:26:49
RevitTormentor,
Колонны заданы семейством, соответственно это экземпляр класса FamilyInstance. Но если просто вместо Wall вы подставите FamilyInstance, то почти все объекты модели будут в результате. Так что колонны только по категории искать.
Код - Text [Выбрать]
  1. FilteredElementCollector collector = new FilteredElementCollector(doc);
  2. var columns = collector
  3. .OfCategory(BuiltInCategory.OST_Columns)
  4. .WhereElementIsNotElementType();
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: RevitTormentor от 08-03-2018, 13:56:19
Виктор, а разве в Ревите не всё создано семействами? Стены Перекрытия Размеры Уровни, это ведь тоже семейства? Почему колонны как то выделены особняком?

Запутался немного. Стены же тоже семейства, почему к ним другой доступ имеется, а к колоннам нет?

Просто это отразится потом на всём остальном коде, хочется разобраться во внутренней структуре.

Спасибо.
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: Виктор Чекалин от 08-03-2018, 14:03:22
RevitTormentor,
Есть встроенные семейства (Стены, Пол, трубы и т.п.), а есть пользовательские. Встроенные семейства в API имеют свои классы. Пользовательские же семейства являются классами FamilyInstance.
Название: Re: Wall или BuiltInCategory.OST_Walls
Отправлено: RevitTormentor от 08-03-2018, 14:06:17
Ок. Однако странное дело. Колонны не являются встроенным семейством.
А если я загружу своё какое-нибудь семейство стен, то видимо и доступ к ним тоже будет через famalyInstance. Всё теперь понял. Придётся переделать пару методов.

Спасибо Виктор.