Определение категорий, поддерживающих привязку параметра типа или экземпляра
Вопрос: Я могу получить список категорий, поддерживающих привязку общих параметров, например, с помощью такого кода:
- SortedList<string, Category> CatList
- = new SortedList<string, Category>();
- Categories cats = doc.Settings.Categories;
- foreach( Category cat in cats )
- {
- if( cat.AllowsBoundParameters )
- {
- CatList.Add( cat.Name, cat );
- }
- }
Но как мне из этого списка понять, поддерживает ли категория привязку параметра типа или экземпляра?
Я в итоге хочу получить два списка категорий, похожих на те, что мы видим в пользовательском интерфейсе при добавлении пользовательского параметра. Переключаясь между параметром типа и параметром экземпляра, список категорий обновляется.
Например, категория Листы видна только если выбран параметр Экземпляра.
И не отображаются, когда выбираем параметр Тип
Ответ: Вам не помогли советы, обозначенные в статье Исследование категорий с помощью Python и без (на англ.)?
Ответ: К сожалению, нет.
А как Revit вообще определяет какие категории можно привязать для типа, а какие для экземпляра? Это просто предопределенный статический список?
Вот что я хочу:
- // Создаем набор категорий
- // Для которых разрешена привязка параметра только к Типу
- Categories cats = doc.Settings.Categories;
- Autodesk.Revit.DB.CategorySet catSetTypeOnly
- = doc.Application.Create.NewCategorySet();
- foreach( Category cat in cats )
- {
- // Такое свойство в API уже есть
- if( cat.AllowsBoundParameters )
- {
- // А вот такое я бы хотел увидеть
- if( cat.AllowsTypeBoundParameters )
- {
- catSetTypeOnly.Insert( cat );
- }
- }
- }
Тогда я бы смог получить список категорий, такой же, как и в интерфейсе Revit.
Ответ: Сожалею, но текущая версия Revit API не предоставляет такой возможности. Я добавил вашу просьбу в список пожеланий (CF-1079 [API wish: access to CategoryInfo hasSymbols -- 09406242])
Ответ: Жаль. Тем не менее, так как нам нужно это прямо сейчас, мы просто прямо в коде определили списки категорий. Пример кода приведен в файле CodeExample.txt.
Ответ: Поздравляю с созданием полезных списков и то что поделились с ними.
Я его не много упростил, размышляя над теми перечислениями что вы выбрали.
Мне было интересно, есть ли более эффективный способ чем использование словаря с перечислениями для поиска встроенных категорий, чтобы определить входит ли категория в список для привязки параметров к типу или к экземпляру соответственно.
В принципе, это может выглядеть как два словаря, в котором сопоставляется встроенная категория булевому значению:
- Dictionary<BuiltInCategory, bool>
Я посмотрел на поросы и ответы на тему Перечисления и производительность на Stackoverflow и все же склоняюсь к использованию словаря.
Я использовал ваши два списка и сконвертировал их в словарь. Затем я создал два метода, определяющих, можно ли к конкретной категории привязать параметр Типа или Экземпляра соответственно:
- BuiltInCategory bic = ...;
- bool bType = BicSupportsTypeParameters( bic );
- bool bInstance = BicSupportsInstanceParameters( bic );
Я создал новую команду CmdCategorySupportsTypeParameter в примерах The Building Coder.
Я использую два простых массива для хранения списков встроенных категорий, поддерживающих привязку параметров Типа и Экземпляра:
- #region Встроенные категории, поддерживающие привязку к параметру Типа
- static public BuiltInCategory[]
- _bicAllowsBoundParametersAsType
- = new BuiltInCategory[]
- {
- ///<summary>Analytical Links</summary>
- BuiltInCategory.OST_LinksAnalytical,
- ///<summary>Structural Connections</summary>
- BuiltInCategory.OST_StructConnections,
- ///<summary>Structural Fabric Areas</summary>
- BuiltInCategory.OST_FabricAreas,
- . . .
- ///<summary>Walls</summary>
- BuiltInCategory.OST_Walls
- };
- #endregion // Встроенные категории, поддерживающие привязку к параметру Типа
- #region Встроенные категории, поддерживающие привязку к параметру Экземпляра
- static public BuiltInCategory[]
- _bicAllowsBoundParametersAsInstance
- = new BuiltInCategory[]
- {
- ///<summary>Analytical Links</summary>
- BuiltInCategory.OST_LinksAnalytical,
- ///<summary>Analytical Nodes</summary>
- BuiltInCategory.OST_AnalyticalNodes,
- ///<summary>Analytical Foundation Slabs</summary>
- BuiltInCategory.OST_FoundationSlabAnalytical,
- . . .
- ///<summary>Walls</summary>
- BuiltInCategory.OST_Walls
- };
- #endregion // Встроенные категории, поддерживающие привязку к параметру Экземпляра
Они используются в словарях, для более быстрого поиска:
- static readonly Dictionary<BuiltInCategory, BuiltInCategory>
- _bicSupportsTypeParameters
- = _bicAllowsBoundParametersAsType
- .ToDictionary<BuiltInCategory, BuiltInCategory>(
- c => c );
- static readonly Dictionary<BuiltInCategory, BuiltInCategory>
- _bicSupportsInstanceParameters
- = _bicAllowsBoundParametersAsInstance
- .ToDictionary<BuiltInCategory, BuiltInCategory>(
- c => c );
Эти словари в свою очередь используются в методах, определяющих поддержку использования категории в параметрах типа и экземпляра.
- /// <summary>
- /// Возвращает true, если заданная встроенная категория
- /// поддерживает параметры Типа
- /// </summary>
- static bool BicSupportsTypeParameters(
- BuiltInCategory bic )
- {
- return _bicSupportsTypeParameters.ContainsKey(
- bic );
- }
- /// <summary>
- /// Возвращает true, если заданная встроенная категория
- /// поддерживает параметры Экземпляра
- /// </summary>
- static bool BicSupportsInstanceParameters(
- BuiltInCategory bic )
- {
- return _bicSupportsInstanceParameters.ContainsKey(
- bic );
- }
Вот пример кода внешней команды по использования этих методов:
- static string SupportsOrNotString( bool b )
- {
- return b
- ? "поддерживает"
- : "не поддерживает";
- }
- public Result Execute(
- ExternalCommandData revit,
- ref string message,
- ElementSet elements )
- {
- UIApplication uiapp = revit.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- int nCategories = 0;
- int nSupportType = 0;
- int nSupportInstance = 0;
- bool bType, bInstance;
- foreach( BuiltInCategory bic in
- Enum.GetValues( typeof( BuiltInCategory ) ) )
- {
- bType = BicSupportsTypeParameters( bic );
- bInstance = BicSupportsInstanceParameters( bic );
- ++nCategories;
- nSupportType += bType ? 1 : 0;
- nSupportInstance += bInstance ? 1 : 0;
- Debug.Print( "{0} {1} параметры экземпляра и {2} параметры типа",
- bic,
- SupportsOrNotString( bInstance ),
- SupportsOrNotString( bType ) );
- }
- string caption = "Поддержка категориями параметров Типа и Экземпляра ";
- string msg = string.Format(
- "Обработано {0} встроенных категорий"
- + ", {1} поддерживает параметры экземпляра и {2} "
- + "параметры Типа.", nCategories,
- nSupportInstance, nSupportType );
- Debug.Print( "\n" + caption + ":\n" + msg );
- TaskDialog.Show( caption, msg );
- return Result.Succeeded;
- }
В команде проверяется каждая встроенная категория на предмет поддержки привязки параметра Типа и Экземпляра и отображается отчет в окне Output Visual Studio.
- OST_StackedWalls_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_MassTags_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_MassSurface_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_MassFloor_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_Mass_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_WallRefPlanes_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_StickSymbols_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_RemovedGridSeg_Obsolete_IdInWrongRange не поддерживает параметры экземпляра и не поддерживает параметры типа
- …
- OST_MatchModel не поддерживает параметры экземпляра и не поддерживает параметры типа
- OST_MatchAll не поддерживает параметры экземпляра и не поддерживает параметры типа
- INVALID не поддерживает параметры экземпляра и не поддерживает параметры типа
В результате я так и не увидел ни одной категории, которая поддерживает параметр Типа, но не поддерживает параметр Экземпляра.
Результирующий отчет выглядит вот так:
Все примеры The Building Coder доступны в репозитории на GitHub.
Версия примеров, обсуждаемых в посте – 2014.0.190.0
Обсуждение: http://adn-cis.org/forum/index.php?topic=716
Опубликовано 30.04.2014