Программное добавление к параметру категории OST_StairsStringerCarriage

Автор Тема: Программное добавление к параметру категории OST_StairsStringerCarriage  (Прочитано 3570 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн andy_puАвтор темы

  • ADN Club
  • Сообщений: 34
  • Карма: 2
Всем добрый день. Столкнулся с проблемой.
Есть категория OST_StairsStringerCarriage (Лестницы: Опоры). При попытке программно добавить эту категорию к общему параметру, выходит ошибка "Binding the parameter to the category Опоры is not allowed", соответственно у категории свойство AllowsBoundParameters = false, что объясняет это сообщение.
Но Revit позволяет это сделать руками через интерфейс пользователя без каких-либо проблем. Не понимаю почему так.
При этом категории OST_StairsRuns (Лестницы: Марши) или OST_StairsLandings (Лестницы: Площадки) добавляются программно без вопросов.
Версия Revit2019

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Баг, походу.

Проблема в том, что Category.GetCategory(doc, BuiltInCategory.OST_StairsStringerCarriage) на самом деле возвращает категорию BuiltInCategory.OST_StairsSupports.

Можно обойти получив напрямую категорию из существующего параметра проекта (попробовал, получилось) или из элемента модели (не пробовал, но, думаю, что всё получится)

Оффлайн andy_puАвтор темы

  • ADN Club
  • Сообщений: 34
  • Карма: 2
Спасибо. Да, через элемент тоже можно. Но мне не подходит ни то ни другое, так как ни первого ни второго может не быть.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Скопируй из проекта, в котором точно есть (программно, естественно), возьми категорию, создай параметр, удали скопированное

Оффлайн andy_puАвтор темы

  • ADN Club
  • Сообщений: 34
  • Карма: 2
Сделал с использованием типа. Получаю категорию из первого попавшегося типа элемента нужной мне категории.
Код - C# [Выбрать]
  1. public static Category GetCategoryStairsStringerCarriage(Document doc)
  2. {
  3.             FilteredElementCollector coll = new FilteredElementCollector(doc).WhereElementIsElementType();
  4.             // значение параметра true означает, что нужно выбрать все элементы ,
  5.             // за исключением типа, указанного в первом параметре.
  6.             ElementClassFilter filterInv = new ElementClassFilter(typeof(FamilySymbol), true);
  7.             IEnumerable<ElementType> collElemsTypes = coll.WherePasses(filterInv).OfType<ElementType>();
  8.             var fColl = collElemsTypes.Where(l => l.Category != null && l.Category.Id.IntegerValue == (int)BuiltInCategory.OST_StairsStringerCarriage).FirstOrDefault();
  9.             if (fColl != null)
  10.                    return fColl.Category;
  11.             else
  12.                    return null;
  13. }
  14.