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

ADN Club => Revit API => Тема начата: Александр Пекшев aka Modis от 02-10-2018, 01:08:13

Название: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 01:08:13
Всем привет. Есть печально известный в узких кругах своей сложностью метод Rebar.CreateFromCurves() (http://www.revitapidocs.com/2018.1/b020c9d5-6026-b9fa-7e23-f6a7ec2cede3.htm). Я конечно преувеличиваю, и метод не такой уж и сложный если разобраться, но вот возникла проблема:
Создаваемая этим методом форма арматурного стержня не редактируется в редакторе семейств

(https://i.postimg.cc/8FqwNm4y/Wq_Iho4_K9id_E.jpg) (https://postimg.cc/8FqwNm4y)

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

(https://i.postimg.cc/RqQrpWVr/xs5v_RQtf_H1s.jpg) (https://postimg.cc/RqQrpWVr)

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

Я не буду в вопросе приводить никакого кода, так как в этом нет никакой необходимости. Просто надеюсь, что кто-то что-то знает по этому поводу. Ну или умеет гуглить лучше меня, так как я ничего подобного не нашёл )
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 11:42:49
Ради интереса декомпилировал Revit Extensions. Вижу, что у них тоже используется этот метод для создания арматуры. Но создаваемые ими формы арматурных стержней в Ревите открываются редактором семейств. Это убеждает меня в моей идее - после вызова этого метода нужно взять созданную форму и что-то с ней сделать, чтобы она стала полноценной. Пока только не понимаю что именно
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Игнатович от 02-10-2018, 12:05:53
День добрый.

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

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

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

Чтобы работало корректно, перед созданием арматуры загружаем в проект семейства форм, код можно и не менять.
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 12:09:56
Александр Игнатович, так вопрос как-раз таки в том, чтобы сделать созданную форму полноценной.
Хотя, резюмируя ваш ответ и проводя некоторые тесты, я прихожу к выводу, что это невозможно. Хотя, надежда конечно еще тлеет где-то там внутри =))
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Игнатович от 02-10-2018, 12:13:11
Почему это? Полноценную форму создаем семейством и загружаем в проект, RebarShape.Create не сделает, по крайней мере, в текущей версии Revit.
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 12:17:30
Почему это? Полноценную форму создаем семейством и загружаем в проект, RebarShape.Create не сделает, по крайней мере, в текущей версии Revit.
Тут дело в том, что у меня плагин позволяет выполнить армирование вообще в пустом проекте, в котором не загружено никаких форм. RebarBarType создается в коде, а метод Rebar.CreateFromCurves() создает формы. Конечно у меня стоят два последних параметра в значении true и при наличии существующих подходящих семейств они должны использоваться. Но для "крутости" хотелось бы чтобы полноценные формы создавались вообще в пустом проекте)
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Игнатович от 02-10-2018, 12:31:55
Хм, вообще забавно.

Если в проект закинуть вообще любую форму (программно создаю стержень с отгибами, форму закинул - круглый хомут), то стержень внезапно становится редактируемым
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 12:34:34
Хм, вообще забавно.

Если в проект закинуть вообще любую форму (программно создаю стержень с отгибами, форму закинул - круглый хомут), то стержень внезапно становится редактируемым
И действительно! Лайфках! =))
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 12:42:47
Можно, как вариант, в ресурсах проекта "таскать" одно семейство формы арматурного стержня и по тихому загружать его, а потом удалять
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Игнатович от 02-10-2018, 12:55:13
Агась, самое оно
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 08-10-2018, 12:49:54
Эх, рано мы порадовались - ничерта не работает =((
Обратился пользователь с описанием таких-же симптомов. Да вот беда - все что мы выше тут наобсуждали не работает.
Вот файл, который мне прислали - https://drive.google.com/open?id=1idOx_eIECAeXqiNb-_wAsiRlx2Suiru7
Там одна стенка, заармированная моим плагином. В проекте уже были другие формы, но созданная плагином форма С-ки все-равно не открывается в редакторе семейств. Хотя, кнопка активна.
Пробовали создать форму С-ки вручную (вроде 111 в этом файле), но метод упорно её не использует.

Нужны идеи. Я что-то опустошен (
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 09-10-2018, 15:13:21
Оказывается даже в справке написано:
Цитировать
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.
Легче не стало правда) Т.е. форма создаться нормальной только лишь при условии, что в проекте уже есть подходящая. Так себе решение  :(
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 12-10-2018, 12:00:01
Возвращаю решение на ответ с подгрузкой формы. Все-же это и есть решение.
А самое правильное - это чтобы в проекте уже существовали подходящие формы арматурных стержней. И вот тут появляется самая главная "проблема" - понимание того, как эта форма должны выглядеть.
После проведения тестов я понял, что Ревит подхватывает ту форму, у которой Curves буду иметь такое-же количество, форму и порядок следования, как и подаваемые в метод
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Игнатович от 12-10-2018, 12:04:25
Александр, если будет желание систематизировать и отметить все особенности работы, с удовольствием опубликуем статейку сайте :-)
Название: Re: Метод Rebar.CreateFromCurves() создает не редактируемую форму стержня
Отправлено: Александр Пекшев aka Modis от 13-02-2019, 17:43:22
В общем - систематизировать информацию некогда, но написал статью для своих пользователей - https://modplus.org/ru/news/stirrups
Статья будет полезна и программистам для понимания того, как Ревит подбирает формы и почему создает новые