Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня

Автор Тема: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня  (Прочитано 3977 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Есть печально известный в узких кругах своей сложностью метод Rebar.CreateFromCurves(). Я конечно преувеличиваю, и метод не такой уж и сложный если разобраться, но вот возникла проблема:
Создаваемая этим методом форма арматурного стержня не редактируется в редакторе семейств



После долгих тыканий мышкой в Ревите я смог получить "описание болезни":



Возникает ряд вопросов:
1. Чем не полностью определенная форма стержня отличается от полностью определенной?
2. Как заставить этот метод работать верно?
3. Возможно ли этот метод заставить работать верно?

Я не буду в вопросе приводить никакого кода, так как в этом нет никакой необходимости. Просто надеюсь, что кто-то что-то знает по этому поводу. Ну или умеет гуглить лучше меня, так как я ничего подобного не нашёл )

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ради интереса декомпилировал Revit Extensions. Вижу, что у них тоже используется этот метод для создания арматуры. Но создаваемые ими формы арматурных стержней в Ревите открываются редактором семейств. Это убеждает меня в моей идее - после вызова этого метода нужно взять созданную форму и что-то с ней сделать, чтобы она стала полноценной. Пока только не понимаю что именно

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
День добрый.

Поковырялся, всё дело действительно в форме арматурного стержня, а конкретнее, Rebar.GetShapeId() -> RebarShape.ShapeFamilyId.

Более того, один и тот же код работает по разному в 2 проектах в зависимости наличия или отсутствия в проекте семейств формы арматурного стержня. Если семейство есть в проекте, то всё работает без проблем, форму арматурного стержня подбирает первую, которую нашёл по заданным кривым.

Ещё немного немало гугла, резюмирую:
Если в проекте используем RebarShape.Create явно или неявно (RebarBarType.CreateDefaultRebarBarType, RebarBarType.Create при отсутствии семейства формы арматурного стержня или невозможности подбора из существующих форм), то такой RebarShape создается без ShapeFamilyId. В более ранних версиях Revit при создании арматурного стержня по кнопке "Эскиз арматурного стержня" так же работало и через UI, сейчас переделали и семейство, все-таки, создается.

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Игнатович, так вопрос как-раз таки в том, чтобы сделать созданную форму полноценной.
Хотя, резюмируя ваш ответ и проводя некоторые тесты, я прихожу к выводу, что это невозможно. Хотя, надежда конечно еще тлеет где-то там внутри =))

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Почему это? Полноценную форму создаем семейством и загружаем в проект, RebarShape.Create не сделает, по крайней мере, в текущей версии Revit.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Почему это? Полноценную форму создаем семейством и загружаем в проект, RebarShape.Create не сделает, по крайней мере, в текущей версии Revit.
Тут дело в том, что у меня плагин позволяет выполнить армирование вообще в пустом проекте, в котором не загружено никаких форм. RebarBarType создается в коде, а метод Rebar.CreateFromCurves() создает формы. Конечно у меня стоят два последних параметра в значении true и при наличии существующих подходящих семейств они должны использоваться. Но для "крутости" хотелось бы чтобы полноценные формы создавались вообще в пустом проекте)

Отмечено как Решение Александр Пекшев aka Modis 12-10-2018, 11:56:44

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Хм, вообще забавно.

Если в проект закинуть вообще любую форму (программно создаю стержень с отгибами, форму закинул - круглый хомут), то стержень внезапно становится редактируемым

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Хм, вообще забавно.

Если в проект закинуть вообще любую форму (программно создаю стержень с отгибами, форму закинул - круглый хомут), то стержень внезапно становится редактируемым
И действительно! Лайфках! =))

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Можно, как вариант, в ресурсах проекта "таскать" одно семейство формы арматурного стержня и по тихому загружать его, а потом удалять

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Агась, самое оно

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Эх, рано мы порадовались - ничерта не работает =((
Обратился пользователь с описанием таких-же симптомов. Да вот беда - все что мы выше тут наобсуждали не работает.
Вот файл, который мне прислали - https://drive.google.com/open?id=1idOx_eIECAeXqiNb-_wAsiRlx2Suiru7
Там одна стенка, заармированная моим плагином. В проекте уже были другие формы, но созданная плагином форма С-ки все-равно не открывается в редакторе семейств. Хотя, кнопка активна.
Пробовали создать форму С-ки вручную (вроде 111 в этом файле), но метод упорно её не использует.

Нужны идеи. Я что-то опустошен (

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Оказывается даже в справке написано:
Цитировать
createNewShape
Type: System Boolean
Creates a shape in the document to match the curves, hooks, and style specified, and assigns it to the new rebar instance. Shape creation will not succeed unless one or more other shapes already exist in the document, and these shapes have enough shape parameters to define a shape for these curves.
Легче не стало правда) Т.е. форма создаться нормальной только лишь при условии, что в проекте уже есть подходящая. Так себе решение  :(

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Возвращаю решение на ответ с подгрузкой формы. Все-же это и есть решение.
А самое правильное - это чтобы в проекте уже существовали подходящие формы арматурных стержней. И вот тут появляется самая главная "проблема" - понимание того, как эта форма должны выглядеть.
После проведения тестов я понял, что Ревит подхватывает ту форму, у которой Curves буду иметь такое-же количество, форму и порядок следования, как и подаваемые в метод

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем - систематизировать информацию некогда, но написал статью для своих пользователей - https://modplus.org/ru/news/stirrups
Статья будет полезна и программистам для понимания того, как Ревит подбирает формы и почему создает новые