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

ADN Club => Revit API => Тема начата: andy_pu от 13-04-2021, 10:35:41

Название: Программное добавление к параметру категории OST_StairsStringerCarriage
Отправлено: andy_pu от 13-04-2021, 10:35:41
Всем добрый день. Столкнулся с проблемой.
Есть категория OST_StairsStringerCarriage (Лестницы: Опоры). При попытке программно добавить эту категорию к общему параметру, выходит ошибка "Binding the parameter to the category Опоры is not allowed", соответственно у категории свойство AllowsBoundParameters = false, что объясняет это сообщение.
Но Revit позволяет это сделать руками через интерфейс пользователя без каких-либо проблем. Не понимаю почему так.
При этом категории OST_StairsRuns (Лестницы: Марши) или OST_StairsLandings (Лестницы: Площадки) добавляются программно без вопросов.
Версия Revit2019
Название: Re: Программное добавление к параметру категории OST_StairsStringerCarriage
Отправлено: Александр Игнатович от 13-04-2021, 11:08:15
Баг, походу.

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

Можно обойти получив напрямую категорию из существующего параметра проекта (попробовал, получилось) или из элемента модели (не пробовал, но, думаю, что всё получится)
Название: Re: Программное добавление к параметру категории OST_StairsStringerCarriage
Отправлено: andy_pu от 13-04-2021, 16:20:00
Спасибо. Да, через элемент тоже можно. Но мне не подходит ни то ни другое, так как ни первого ни второго может не быть.
Название: Re: Программное добавление к параметру категории OST_StairsStringerCarriage
Отправлено: Александр Игнатович от 13-04-2021, 16:25:30
Скопируй из проекта, в котором точно есть (программно, естественно), возьми категорию, создай параметр, удали скопированное
Название: Re: Программное добавление к параметру категории OST_StairsStringerCarriage
Отправлено: andy_pu от 16-04-2021, 10:33:56
Сделал с использованием типа. Получаю категорию из первого попавшегося типа элемента нужной мне категории.
Код - 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.