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

30/08/2016

Как получить импортированные категории

Для одной из задач мне понадобилось получить Импортированные категории. В диалоге «Переопределения видимости/графики» этот список можно увидеть на соответствующей вкладке:

 

В Revit API у класса Category есть свойство CategoryType, которое является перечислением со следующими значениями:

  • Invalid
  • Model
  • Annotation
  • Internal
  • AnalyticalModel

На первый взгляд, тип категории соответствует вкладкам в диалоге, но это не так. Импортированные категории имеют CategoryType = CategoryType.Model, но они не появляются на вкладке «Категории модели».

Я начал искать способы узнать является ли категория импортированной или нет.

В итоге нашел 2 способа. Первый способ неявный. Я покопался в RevitLookup и проверил свойства Импортированной категории:

 

Заметил следующее:

  • Category.Id не является встроенной категорией, т.е. значение > 0 (Все встроенные категории имеют идентификатор с отрицательным значением)
  • Свойства AllowsBoundParameters, CanAddSubcategory, HasMaterialQuantities и IsCuttable всегда равны false.

В результате я создал вот такой метод-расширение:

Код - C#: [Выделить]
  1.     public static class CategoryExtenstions
  2.     {
  3.         public static bool IsImportedCategory(this Category category)
  4.         {
  5.             if (Enum.IsDefined(typeof(BuiltInCategory), category.Id.IntegerValue))
  6.                 return false;
  7.  
  8.             if (category.Id.IntegerValue < -1)
  9.                 return false;
  10.  
  11.             return category.AllowsBoundParameters == false &&
  12.                 category.CanAddSubcategory == false &&
  13.                 category.HasMaterialQuantities == false &&
  14.                 category.IsCuttable == false;
  15.         }
  16.     }

Метод замечательно работает. Правда я проверял всего на парочке моделей.

Второй метод более сложный, но дает тот же самый результат.

Поискав в файле справке по ключевому слову Imported,  я нашел только лишь значение перечисления:

 

Судя по описанию, это действительно то что нужно.

Это перечисление связано с настройками экспорта в DWG. В интерфейсе Revit мы его можем найти в диалоге «Изменить параметры экспорта DWG/DXF»:

 

Код для получения списка импортированных категорий:

Код - C#: [Выделить]
  1. ExportDWGSettings exportSettings;
  2. DWGExportOptions options;
  3.  
  4. using (var t = new Transaction(doc, "Create new Setup"))
  5. {
  6.                 t.Start();
  7.  
  8.                 exportSettings =
  9.                                 ExportDWGSettings.Create(doc, "Test");
  10.                 options =
  11.                                 exportSettings.GetDWGExportOptions();
  12.                
  13.                 t.RollBack();
  14. }
  15.  
  16.  
  17. var table = options.GetExportLayerTable();
  18.  
  19. foreach (var tableRecord in table) {
  20.                 if (tableRecord.Value.CategoryType == LayerCategoryType.Imported)
  21.                 {
  22.                                 Debug.Print("{0} [{1}]", tableRecord.Key.CategoryName, tableRecord.Key.SubCategoryName);
  23.                                            
  24.                 }
  25. }

Безусловно, первый метод быстрее и дает тот же самый результат.

 

На форуме пользователь JimJia предложил один вариант с использованием класса ExternalFileReference:

Код - C#: [Выделить]
  1. private void GetExternalFileCategory()
  2. {
  3.     string info = null;
  4.     ICollection<ElementId> ids = ExternalFileUtils.GetAllExternalFileReferences(doc);
  5.     foreach(ElementId id in ids)
  6.     {
  7.         Element elem = doc.GetElement(id);
  8.         if(elem.Category!= null)
  9.             info += elem.Category.Name + "\n";
  10.     }
  11.     MessageBox.Show(info);
  12. }

Таким образом нашлось 3 способа. Какой использовать – зависит от ситуации. Для получения списка, на мой взгляд третий способ оптимальный. Если просто проверить является ли категория импортированной, то первый.

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

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

Опубликовано 30.08.2016