Не работает перегрузка метода Create в классе PathReinforcement

Автор Тема: Не работает перегрузка метода Create в классе PathReinforcement  (Прочитано 4006 раз)

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

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Всем привет. Сегодня неожиданно столкнулся с проблемой при работе с перегрузкой метода Create в классе PathReinforcement (Revit 2017.2).
Код метода:
Код - C# [Выбрать]
  1.         public static PathReinforcement CreatePathReinforcement(
  2.                         Floor floor,
  3.                         Document document,
  4.             ExternalCommandData commandData)
  5.         {
  6.             // Getting analytical model from floor
  7.             AnalyticalModel analyticalModel = floor.GetAnalyticalModel();
  8.             if (analyticalModel == null)
  9.             {
  10.                 throw new Exception("Can't get AnalyticalModel from the selected floor");
  11.             }
  12.  
  13.             // Getting curves of analytical model
  14.             IList<Curve> curvesInput = analyticalModel.GetCurves(AnalyticalCurveType.ActiveCurves);
  15.             var curves = CounterBreak(curvesInput);
  16.  
  17.             // Obtain the default types
  18.             var defaultRebarBarTypeId = document.GetDefaultElementTypeId(ElementTypeGroup.RebarBarType);
  19.             var defaultPathReinforcementTypeId = document.GetDefaultElementTypeId(ElementTypeGroup.PathReinforcementType);
  20.             var defaultHookTypeId = ElementId.InvalidElementId;
  21.  
  22.             // Creating path reinforcement
  23.             var reinforcement = PathReinforcement.Create(
  24.                 document,
  25.                 floor,
  26.                 curves,
  27.                 true,
  28.                 defaultPathReinforcementTypeId,
  29.                 defaultRebarBarTypeId,
  30.                 defaultHookTypeId,
  31.                 defaultHookTypeId,
  32.                 rebarProperties.RebarShapes.FirstOrDefault().Id);
  33.                                
  34.             return reinforcement;
  35.         }
Соответственно, срабатывает исключение:
Код - INI [Выбрать]
  1. Autodesk.Revit.Exceptions ArgumentsInconsistentException        startRebarHookTypeId cannot be set for given rebar shape. -or- endRebarHookTypeId cannot be set for given rebar shape.
В переводе на русский - начальный тип крюка не может быть установлен для данного шейпа, что уже странно, ведь в Revit руками можно установить для любого шейпа любой тип крюка.
Причем я пробовал ставить типы крюков не None, а формы стержней не первые в списке, а любые другие. Результат всегда остается тем же.
Заранее спасибо за помощь.
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Я понимаю, что вопрос достаточно узкоспециализированный, также допускаю, что людям, которые, возможно, хотели бы потестить, не хочется самим собирать проект, поэтому я тут максимально упростил и собрал все воедино:
Извините, вам запрещён просмотр содержимого спойлеров.

Соответственно, выскакивает исключение. Если закоммитить строчки 91 и 92, то метод отработает.
Также ниже прикрепляю файл Revit с одним-единственным перекрытием.

UPD. Почему-то не прикрепляется файл, собранный в архив. Поэтому вот
« Последнее редактирование: 14-06-2017, 17:01:18 от Максим Маркевич »

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Также ниже прикрепляю файл Revit с одним-единственным перекрытием
ой враки, оооойййй враки =))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
UPD. Почему-то не прикрепляется файл, собранный в архив. Поэтому вот
Ограничение на размер прикреплённого файла - 8Мб.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Максим Маркевич, не работал с этим методом к сожалению. Проверю в чем дело, отпишусь.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Явный глюк API'шки. Поэтому вот тебе костыль решение:
Код - C# [Выбрать]
  1. var rebarShape = rebarProperties.RebarShapes.FirstOrDefault(c => c.IsValidObject & c.Name =="21");
  2. // Creating path reinforcement
  3. var reinforcement = PathReinforcement.Create(
  4.     document,
  5.     floor,
  6.     curves,
  7.     true,
  8.     defaultPathReinforcementTypeId,
  9.     defaultRebarBarTypeId,
  10.     defaultHookTypeId,
  11.     defaultHookTypeId
  12. );
  13. if (rebarShape != null) reinforcement.PrimaryBarShapeId = rebarShape.Id;

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Ограничение на размер прикреплённого файла - 8Мб.
Понял.
Максим Маркевич, не работал с этим методом к сожалению. Проверю в чем дело, отпишусь.
Спасибо, буду ждать.
Явный глюк API'шки. Поэтому вот тебе костыль решение:
Дааа :) Я в итоге примерно к этому же пришел. Просто хотел понять, что не так с перегрузкой метода (думал уже - упускаю что-то).
Конечно, за API Revit в целом сказать не могу, но в теме программного армирования (достаточно глубоко изучаю возможности API Revit в этом плане) подобных проблем очень много!.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
На мой взгляд такой вариант даже лучше, потому что в случае каких-то проблем при инициализации RebarShape, метод PathReinforcement.Create() все-равно отработает и потом уже можно построить логику работы в нужном русле - добавить это армирование или предупредить пользователя. Короче - не такой уж и страшный косяк API

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
На мой взгляд такой вариант даже лучше, потому что в случае каких-то проблем при инициализации RebarShape, метод PathReinforcement.Create() все-равно отработает и потом уже можно построить логику работы в нужном русле - добавить это армирование или предупредить пользователя. Короче - не такой уж и страшный косяк API
Я согласен, решение рабочее.
Просто я достаточно долго изучаю армирование при помощи Revit API в относительном "вакууме", ну вот и решил переосмыслить некоторые мутноватые вещи, создать тему на форуме, найти единомышленников..
Так что тема не закрыта, пока не будет подтверждения или опровержения неработоспособности перегрузки метода. ;)