Как получить значение BuiltInCategory для объекта класса Category
Категории в Revit API определяются двумя различными способами: классом Category и перечислением BuiltInCategory.
Если перечисление по сути представляет собой некое целочисленное значение, то класс Category содержит в себе более полную информацию, такую как наименование (локализованное название), подкатегории, а также методы для управления видимостью объектов категории на заданном виде.
Получить список всех категорий можно с помощью свойства Settings.Categories
- var categories = doc.Settings.Categories
Получить категорию, зная BuiltInCategory, можно при помощи метода get_Item:
- var wallCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
В одном из проектов мне понадобилось выполнить обратное действие – получить значение BuiltInCategory заданного объекта класса Category. Просмотрев список доступных свойств и методов класса Category, ничего подходящего обнаружить не удалось.
Однако решение все же есть.
Класс Category имеет свойство Id.Для категории Стены, это значение равно -2000011
Теперь самое время вспомнить о том, что перечисление определяется числовым значением.
Перейдем к определению перечисления BuiltInCategory
- // Summary:
- // A list of all the built in categories within Revit.
- public enum BuiltInCategory
- {
- OST_StackedWalls_Obsolete_IdInWrongRange = -20034100,
- OST_MassTags_Obsolete_IdInWrongRange = -20034005,
- OST_MassSurface_Obsolete_IdInWrongRange = -20034004,
- // ….
- OST_WallsCutOutlines = -2000012,
- OST_Walls = -2000011,
- OST_IOSRegenerationFailure = -2000010,
- OST_ScheduleViewParamGroup = -2000008,
- OST_MatchSiteComponent = -2000007,
- OST_MatchProfile = -2000006,
- OST_MatchDetail = -2000005,
- OST_MatchAnnotation = -2000004,
- OST_MatchModel = -2000003,
- OST_MatchAll = -2000002,
- INVALID = -1,
- }
Как можно заметить, числовое значение перечисления совпадает со значением свойства Id.
Все что нам нужно, так это получить значение перечисления зная его числовое значение.
Сделать это довольно просто. Нужно всего лишь привести число к типу BuiltInCategory.
- BuiltInCategory builtInCategory = (BuiltInCategory)category.Id.IntegerValue;
Но так же было бы неплохо проверить, соответствуют ли числовое значение одному из значений перечисления. Это можно сделать с помощью статического метода Enum.IsDefined.
В качестве бонуса, для легкого определения BuiltInCategory создадим вот такой класс-расширение:
- public static class CategoryExtension
- {
- public static BuiltInCategory GetBuiltInCategory(this Category category)
- {
- if (System.Enum.IsDefined(typeof(BuiltInCategory),
- category.Id.IntegerValue))
- {
- var builtInCategory = (BuiltInCategory)category.Id.IntegerValue;
- return builtInCategory;
- }
- return BuiltInCategory.INVALID;
- }
- }
Теперь, чтобы получить встроенную категорию, достаточно вызвать метод GetBuiltInCategory():
- var wallCategory = _document.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
- var wallBuiltInCategory = wallCategory.GetBuiltInCategory();
Автор перевода: Виктор Чекалин
Обсуждение: http://adn-cis.org/forum/index.php?topic=557
Опубликовано 25.02.2014Отредактировано 26.02.2014 в 08:23:09