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

30/04/2014

Определение категорий, поддерживающих привязку параметра типа или экземпляра

Вопрос: Я могу получить список категорий, поддерживающих привязку общих параметров, например, с помощью такого кода:

Код - C#: [Выделить]
  1.   SortedList<string, Category> CatList
  2.     = new SortedList<string, Category>();
  3.  
  4.   Categories cats = doc.Settings.Categories;
  5.  
  6.   foreach( Category cat in cats )
  7.   {
  8.     if( cat.AllowsBoundParameters )
  9.     {
  10.       CatList.Add( cat.Name, cat );
  11.     }
  12.   }  

Но как мне из этого списка понять, поддерживает ли категория привязку параметра типа или экземпляра?

Я в итоге хочу получить два списка категорий, похожих на те, что мы видим в пользовательском интерфейсе при добавлении пользовательского параметра. Переключаясь между параметром типа и параметром экземпляра, список категорий обновляется.

Например, категория Листы видна только если выбран параметр Экземпляра.

 

И не отображаются, когда выбираем параметр Тип

 

Ответ: Вам не помогли советы, обозначенные в статье Исследование категорий с помощью Python и без (на англ.)?

Ответ: К сожалению, нет.

А как Revit вообще определяет какие категории можно привязать для типа, а какие для экземпляра? Это просто предопределенный статический список?

Вот что я хочу:

Код - C#: [Выделить]
  1.   // Создаем набор категорий
  2.   // Для которых разрешена привязка параметра только к Типу
  3.  
  4.   Categories cats = doc.Settings.Categories;
  5.  
  6.   Autodesk.Revit.DB.CategorySet catSetTypeOnly
  7.     = doc.Application.Create.NewCategorySet();
  8.  
  9.   foreach( Category cat in cats )
  10.   {
  11.     // Такое свойство в API уже есть
  12.  
  13.     if( cat.AllowsBoundParameters )
  14.     {
  15.       // А вот такое я бы хотел увидеть
  16.  
  17.       if( cat.AllowsTypeBoundParameters )
  18.       {
  19.         catSetTypeOnly.Insert( cat );
  20.       }
  21.     }
  22.   }

Тогда я бы смог получить список категорий, такой же, как и в интерфейсе Revit.

Ответ: Сожалею, но текущая версия Revit API не предоставляет такой возможности. Я добавил вашу просьбу в список пожеланий (CF-1079 [API wish: access to CategoryInfo hasSymbols -- 09406242])

Ответ: Жаль. Тем не менее, так как нам нужно это прямо сейчас, мы просто прямо в коде определили списки категорий. Пример кода приведен в файле CodeExample.txt.

Ответ: Поздравляю с созданием полезных списков и то что поделились с ними.

Я его не много упростил, размышляя над теми перечислениями что вы выбрали.

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

В принципе, это может выглядеть как два словаря, в котором сопоставляется встроенная категория булевому значению:

Код - C#: [Выделить]
  1. Dictionary<BuiltInCategory, bool>

Я посмотрел на поросы и ответы на тему Перечисления и производительность на Stackoverflow и все же склоняюсь к использованию словаря.

Я использовал ваши два списка и сконвертировал их в словарь. Затем я создал два метода, определяющих, можно ли к конкретной категории привязать параметр Типа или Экземпляра соответственно:

Код - C#: [Выделить]
  1.   BuiltInCategory bic = ...;
  2.  
  3.   bool bType = BicSupportsTypeParameters( bic );
  4.   bool bInstance = BicSupportsInstanceParameters( bic );

Я создал новую команду CmdCategorySupportsTypeParameter в примерах The Building Coder.

Я использую два простых массива для хранения списков встроенных категорий, поддерживающих привязку параметров Типа и Экземпляра:

Код - C#: [Выделить]
  1.   #region Встроенные категории, поддерживающие привязку к параметру Типа
  2.   static public BuiltInCategory[]
  3.     _bicAllowsBoundParametersAsType
  4.       = new BuiltInCategory[]
  5.       {
  6.         ///<summary>Analytical Links</summary>
  7.         BuiltInCategory.OST_LinksAnalytical,
  8.         ///<summary>Structural Connections</summary>
  9.         BuiltInCategory.OST_StructConnections,
  10.         ///<summary>Structural Fabric Areas</summary>
  11.         BuiltInCategory.OST_FabricAreas,
  12.  
  13.         . . .
  14.  
  15.         ///<summary>Walls</summary>
  16.         BuiltInCategory.OST_Walls
  17.       };
  18.   #endregion // Встроенные категории, поддерживающие привязку к параметру Типа
  19.  
  20.   #region Встроенные категории, поддерживающие привязку к параметру Экземпляра
  21.   static public BuiltInCategory[]
  22.     _bicAllowsBoundParametersAsInstance
  23.       = new BuiltInCategory[]
  24.       {
  25.         ///<summary>Analytical Links</summary>
  26.         BuiltInCategory.OST_LinksAnalytical,
  27.         ///<summary>Analytical Nodes</summary>
  28.         BuiltInCategory.OST_AnalyticalNodes,
  29.         ///<summary>Analytical Foundation Slabs</summary>
  30.         BuiltInCategory.OST_FoundationSlabAnalytical,
  31.  
  32.         . . .
  33.  
  34.         ///<summary>Walls</summary>
  35.         BuiltInCategory.OST_Walls
  36.       };
  37.   #endregion // Встроенные категории, поддерживающие привязку к параметру Экземпляра

Они используются в словарях, для более быстрого поиска:

Код - C#: [Выделить]
  1.   static readonly Dictionary<BuiltInCategory, BuiltInCategory>
  2.     _bicSupportsTypeParameters
  3.       = _bicAllowsBoundParametersAsType
  4.         .ToDictionary<BuiltInCategory, BuiltInCategory>(
  5.           c => c );
  6.  
  7.   static readonly Dictionary<BuiltInCategory, BuiltInCategory>
  8.     _bicSupportsInstanceParameters
  9.       = _bicAllowsBoundParametersAsInstance
  10.         .ToDictionary<BuiltInCategory, BuiltInCategory>(
  11.           c => c );

Эти словари в свою очередь используются в методах, определяющих поддержку использования категории в параметрах типа и экземпляра.

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Возвращает true, если заданная встроенная категория
  3.   /// поддерживает параметры Типа
  4.   /// </summary>
  5.   static bool BicSupportsTypeParameters(
  6.     BuiltInCategory bic )
  7.   {
  8.     return _bicSupportsTypeParameters.ContainsKey(
  9.       bic );
  10.   }
  11.  
  12.   /// <summary>
  13.   /// Возвращает true, если заданная встроенная категория
  14.   /// поддерживает параметры Экземпляра
  15.   /// </summary>
  16.   static bool BicSupportsInstanceParameters(
  17.     BuiltInCategory bic )
  18.   {
  19.     return _bicSupportsInstanceParameters.ContainsKey(
  20.       bic );
  21.   }

Вот пример кода внешней команды по использования этих методов:

Код - C#: [Выделить]
  1.   static string SupportsOrNotString( bool b )
  2.   {
  3.     return b
  4.       ? "поддерживает"
  5.       : "не поддерживает";
  6.   }
  7.  
  8.   public Result Execute(
  9.     ExternalCommandData revit,
  10.     ref string message,
  11.     ElementSet elements )
  12.   {
  13.     UIApplication uiapp = revit.Application;
  14.     UIDocument uidoc = uiapp.ActiveUIDocument;
  15.     Document doc = uidoc.Document;
  16.  
  17.     int nCategories = 0;
  18.     int nSupportType = 0;
  19.     int nSupportInstance = 0;
  20.     bool bType, bInstance;
  21.  
  22.     foreach( BuiltInCategory bic in
  23.       Enum.GetValues( typeof( BuiltInCategory ) ) )
  24.     {
  25.       bType = BicSupportsTypeParameters( bic );
  26.       bInstance = BicSupportsInstanceParameters( bic );
  27.  
  28.       ++nCategories;
  29.       nSupportType += bType ? 1 : 0;
  30.       nSupportInstance += bInstance ? 1 : 0;
  31.  
  32.       Debug.Print( "{0} {1} параметры экземпляра и {2} параметры типа",
  33.         bic,
  34.         SupportsOrNotString( bInstance ),
  35.         SupportsOrNotString( bType ) );
  36.     }
  37.  
  38.     string caption = "Поддержка категориями параметров Типа и Экземпляра ";
  39.  
  40.     string msg = string.Format(
  41.       "Обработано {0} встроенных категорий"
  42.       + ", {1} поддерживает параметры экземпляра и {2} "
  43.       + "параметры Типа.", nCategories,
  44.       nSupportInstance, nSupportType );
  45.  
  46.     Debug.Print( "\n" + caption + ":\n" + msg );
  47.  
  48.     TaskDialog.Show( caption, msg );
  49.  
  50.     return Result.Succeeded;
  51.   }

В команде проверяется каждая встроенная категория на предмет поддержки привязки параметра Типа и Экземпляра и отображается отчет в окне Output Visual Studio.

Код - XML: [Выделить]
  1. OST_StackedWalls_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  2. OST_MassTags_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  3. OST_MassSurface_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  4. OST_MassFloor_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  5. OST_Mass_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  6. OST_WallRefPlanes_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  7. OST_StickSymbols_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  8. OST_RemovedGridSeg_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
  9. OST_MatchModel не поддерживает параметры экземпляра и не поддерживает параметры типа
  10. OST_MatchAll не поддерживает параметры экземпляра и не поддерживает параметры типа
  11. INVALID не поддерживает параметры экземпляра и не поддерживает параметры типа
  12.  

В результате я так и не увидел ни одной категории, которая поддерживает параметр Типа, но не поддерживает параметр Экземпляра.

Результирующий отчет выглядит вот так:

 

Все примеры The Building Coder доступны в репозитории на GitHub.

Версия примеров, обсуждаемых в посте – 2014.0.190.0

Источник: http://thebuildingcoder.typepad.com/blog/2014/04/category-support-for-shared-type-and-instance-parameters.html

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

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