Как получить импортированные категории
Для одной из задач мне понадобилось получить Импортированные категории. В диалоге «Переопределения видимости/графики» этот список можно увидеть на соответствующей вкладке:
В Revit API у класса Category есть свойство CategoryType, которое является перечислением со следующими значениями:
- Invalid
- Model
- Annotation
- Internal
- AnalyticalModel
На первый взгляд, тип категории соответствует вкладкам в диалоге, но это не так. Импортированные категории имеют CategoryType = CategoryType.Model, но они не появляются на вкладке «Категории модели».
Я начал искать способы узнать является ли категория импортированной или нет.
В итоге нашел 2 способа. Первый способ неявный. Я покопался в RevitLookup и проверил свойства Импортированной категории:
Заметил следующее:
- Category.Id не является встроенной категорией, т.е. значение > 0 (Все встроенные категории имеют идентификатор с отрицательным значением)
- Свойства AllowsBoundParameters, CanAddSubcategory, HasMaterialQuantities и IsCuttable всегда равны false.
В результате я создал вот такой метод-расширение:
- public static class CategoryExtenstions
- {
- public static bool IsImportedCategory(this Category category)
- {
- if (Enum.IsDefined(typeof(BuiltInCategory), category.Id.IntegerValue))
- return false;
- if (category.Id.IntegerValue < -1)
- return false;
- return category.AllowsBoundParameters == false &&
- category.CanAddSubcategory == false &&
- category.HasMaterialQuantities == false &&
- category.IsCuttable == false;
- }
- }
Метод замечательно работает. Правда я проверял всего на парочке моделей.
Второй метод более сложный, но дает тот же самый результат.
Поискав в файле справке по ключевому слову Imported, я нашел только лишь значение перечисления:
Судя по описанию, это действительно то что нужно.
Это перечисление связано с настройками экспорта в DWG. В интерфейсе Revit мы его можем найти в диалоге «Изменить параметры экспорта DWG/DXF»:
Код для получения списка импортированных категорий:
- ExportDWGSettings exportSettings;
- DWGExportOptions options;
- using (var t = new Transaction(doc, "Create new Setup"))
- {
- t.Start();
- exportSettings =
- ExportDWGSettings.Create(doc, "Test");
- options =
- exportSettings.GetDWGExportOptions();
- t.RollBack();
- }
- var table = options.GetExportLayerTable();
- foreach (var tableRecord in table) {
- if (tableRecord.Value.CategoryType == LayerCategoryType.Imported)
- {
- Debug.Print("{0} [{1}]", tableRecord.Key.CategoryName, tableRecord.Key.SubCategoryName);
- }
- }
Безусловно, первый метод быстрее и дает тот же самый результат.
На форуме пользователь JimJia предложил один вариант с использованием класса ExternalFileReference:
- private void GetExternalFileCategory()
- {
- string info = null;
- ICollection<ElementId> ids = ExternalFileUtils.GetAllExternalFileReferences(doc);
- foreach(ElementId id in ids)
- {
- Element elem = doc.GetElement(id);
- if(elem.Category!= null)
- info += elem.Category.Name + "\n";
- }
- MessageBox.Show(info);
- }
Таким образом нашлось 3 способа. Какой использовать – зависит от ситуации. Для получения списка, на мой взгляд третий способ оптимальный. Если просто проверить является ли категория импортированной, то первый.