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

25/02/2014

Как получить значение BuiltInCategory для объекта класса Category

Категории в Revit API определяются двумя различными способами: классом Category и перечислением BuiltInCategory.

Если перечисление по сути представляет собой некое целочисленное значение, то класс Category содержит в себе более полную информацию, такую как наименование (локализованное название), подкатегории, а также методы для управления видимостью объектов категории на заданном виде.

Получить список всех категорий можно с помощью свойства Settings.Categories

Код - C#: [Выделить]
  1. var categories = doc.Settings.Categories

Получить категорию, зная BuiltInCategory, можно при помощи метода get_Item:

Код - C#: [Выделить]
  1. var wallCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);

В одном из проектов мне понадобилось выполнить обратное действие – получить значение BuiltInCategory заданного объекта класса Category. Просмотрев список доступных свойств и методов класса Category, ничего подходящего обнаружить не удалось.

Однако решение все же есть.
Класс Category имеет свойство Id.Для категории Стены, это значение равно -2000011

 

Теперь самое время вспомнить о том, что перечисление определяется числовым значением.

Перейдем к определению перечисления BuiltInCategory

Код - C#: [Выделить]
  1.     // Summary:
  2.     //     A list of all the built in categories within Revit.
  3.     public enum BuiltInCategory
  4.     {
  5.         OST_StackedWalls_Obsolete_IdInWrongRange = -20034100,
  6.         OST_MassTags_Obsolete_IdInWrongRange = -20034005,
  7.         OST_MassSurface_Obsolete_IdInWrongRange = -20034004,
  8.        // ….
  9.         OST_WallsCutOutlines = -2000012,
  10.         OST_Walls = -2000011,
  11.         OST_IOSRegenerationFailure = -2000010,
  12.         OST_ScheduleViewParamGroup = -2000008,
  13.         OST_MatchSiteComponent = -2000007,
  14.         OST_MatchProfile = -2000006,
  15.         OST_MatchDetail = -2000005,
  16.         OST_MatchAnnotation = -2000004,
  17.         OST_MatchModel = -2000003,
  18.         OST_MatchAll = -2000002,
  19.         INVALID = -1,
  20.     }

Как можно заметить, числовое значение перечисления совпадает со значением свойства Id.

Все что нам нужно, так это получить значение перечисления зная его числовое значение.

Сделать это довольно просто. Нужно всего лишь привести число к типу BuiltInCategory.

Код - C#: [Выделить]
  1. BuiltInCategory builtInCategory = (BuiltInCategory)category.Id.IntegerValue;

Но так же было бы неплохо проверить, соответствуют ли числовое значение одному из значений перечисления. Это можно сделать с помощью статического метода Enum.IsDefined.

В качестве бонуса, для легкого определения BuiltInCategory создадим вот такой класс-расширение:

Код - C#: [Выделить]
  1.     public static class CategoryExtension
  2.     {
  3.         public static BuiltInCategory GetBuiltInCategory(this Category category)
  4.         {
  5.             if (System.Enum.IsDefined(typeof(BuiltInCategory),
  6.                                           category.Id.IntegerValue))
  7.             {
  8.                 var builtInCategory = (BuiltInCategory)category.Id.IntegerValue;
  9.                 return builtInCategory;
  10.             }
  11.  
  12.             return BuiltInCategory.INVALID;
  13.         }
  14.     }

Теперь, чтобы получить встроенную категорию, достаточно вызвать метод GetBuiltInCategory():

Код - C#: [Выделить]
  1.             var wallCategory = _document.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
  2.             var wallBuiltInCategory = wallCategory.GetBuiltInCategory();

 

Автор: Виктор Чекалин
Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=557

Опубликовано 25.02.2014
Отредактировано 26.02.2014 в 08:23:09