EN
RuBIM.tech
RuBIM.tech
14 subscribers
goals
0 of 100 paid subscribers
Как только наберется более 100 подписчиков, я пойму что эта тематика интересна и появится стимул публиковать больше статей.

Знакомство с Revit API и взаимодействие с ним через Python

Одной из его мощных функциональных возможностей Revit является его API (Application Programming Interface), который позволяет разработчикам создавать собственные плагины и скрипты для автоматизации задач и улучшения рабочего процесса в Revit. В этой статье мы рассмотрим, как начать работать с Revit API и взаимодействовать с ним, используя Python.
Что такое Revit API?
API Revit - это набор функций и классов, предоставляемых Autodesk для взаимодействия с Revit. Он позволяет получить доступ к данным модели Revi не только изменять и создавать элементы, но и многое другое. API позволяет автоматизировать широкий спектр задач, таких как создание чертежей, расчеты, анализ и управление элементами модели.
Как взаимодействовать?
Для того что бы получить возможность писать свои сценарии взаимодействия с Revit можно использовать следующие инструменты: pyRevit, RevitPythonShell, Dynamo. Для написания кода я использую VS Code, но можно использовать и другие инструменты, например PyCharm.
А как оно в Dynamo?
Для начало набросаем простой скрипт используя так называемое визуальное  программирование, который перенесет во всех трубах проекта значение параметра "Тип системы" в параметр "Комментарии".
Этот сценарий на нодах довольно простой, до тех пор, пока не понадобится внести изменения в несколько категорий.
Поскольку в Dynamo не селён, и какие нужно сделать хитросплетения из нод я не в курсе, то поступил бы так:
Накопипастив столько раз, сколько разных категорий нужно было бы использовать. Но xотелось бы посмотреть как это сделать без копипаста, используя только стандартные ноды, без использования нод из сторонних пакетов и Python.
Для примера напишем простой скрипт, без всяких мудрых проверок на наличие параметра и возможности записи в него.
В Dynamo с Python работать можно двумя способами:
1. Непосредственно писать код в ноде "Python Script".
2. Писать код например в  VS Code, тогда это будет выглядеть так:  
Второй вариант предпочтительнее, ибо писать код во встроенном редакторе это то ещё "удовольствие".
Из плюсов можно отметить,
что можно писать меньше кода, на этом они и заканчиваются. Почему
предпочтительнее использовать второй способ наглядно показывает следующие
скриншоты.
Когда кода мало, можно еще отыскать очепятки, а когда сотни строк, поиск будет утомительным, поэтому необходимо использовать инструменты для разработки кода, которые вам укажут на синтактические ошибки.
Если допустить ошибку в имени метода, то редактор кода об этой ошибке ничего и не скажет.
Но при запуске скрипта увидим сообщение об этой ошибке.
Можно собственно и вовсе избавится от входных нод, всё реализовать непосредственно в коде, тогда оба варианта будут выглядеть так:
Посмотрим на разницу кода с использованием входных нод и без.
Видим, что разница небольшая, но существенная, уже обращаемся к Revit API непосредственно из самого кода, получая нужные нам элементы. Используя входные, но необходимо входные данные преобразовать, используя метод UnwrapElement, который используется для преобразования объектов Revit, представленных в виде элементов .NET, обратно в их исходные Revit-элементы.
А как в RevitPythonShell?
RPS позволяет писать непосредственно в своей консоли и выполнить написанный код, сохранить и загружать *.py файлы. Можно вставить код из буфера и он его сразу выполнит.
Теперь попробуем написать код и совершить туже синтактическую ошибку
Уже хорошо, что в отличии от встроенного редактора кода в Dynamo, здесь уже сразу указывается на неё.
Посмотрим на разницу в коде для Dynamo и RPS
Видим разницу только в способе получения документа и использование транзакций.
Взглянем на то, как выводятся ошибки загрузив *.py файл,
содержащий туже ошибку в имени метода, и пробуем его, запустив на исполнение код. Взглянем на то, как выводятся ошибки загрузив *.py файл,
содержащий туже ошибку в имени метода, и пробуем его, запустив на исполнение код.
Мнда, сообщение об ошибке то он выдал, но понятно только, что 'Pipe' object has no attribute 'LookUpParameter', а где этот Pipe находится пойди найди сам. Искать самостоятельно в какой строке код ломается самостоятельно, это не наш метод, изменим немного код и посмотрим, что из этого получится.
Вооот, другое дело, теперь понятно в какой строке.
А как оно в pyRevit?
В отличии от предыдущих двух инструментов, pyRevit является более навороченным и позволяет создавать собственные вкладки с панелями инструментов и имеет богатую собственные библиотеки, немного упрощающие разработку.
Код написанный для RPS запустится в pyRevit. Прежде чем сравнить
разницу подходов написания кода для RPS и pyRevit используя возможности из коробки, запустим код написанный для RPS с ошибкой в имени метода и посмотрим, что получится.
В отличии от RPS вносить изменяя в код для понимания в какой строке сломалось не пришлось.
Теперь взглянем на небольшую разницу в коде.
Хоть так пиши хоть сяк, работать будут оба, но реализация транзакций через контекстный менеджер сильно радует.
И что же выбрать?
Для небольших скриптов с использованием структурного подхода к написанию кода, то Dynamo вполне подходит. тем более в месте с Revit в комплекте и ненужно заморачиватся с установкой дополнительных инструментов.
На счёт RevitPythonShell у меня так и не сложилось чёткого мнения,
думаю для написания простынкой автоматизации для себя, изучения API и IronPyton, несомненно, на мой взгляд более подходящий инструмент чем Dynamo.
Если придерживаться принципа что код два раза не пишется, использовать свои библиотеки, то, наверное, и в RevitPythonShell и Dynamo можно
подключить как свои, так и сторонние модули. А нужно ли для этого плясать и с каким бубном я не знаю, с Dynamo работал мало и таких задач не было, с RevitPythonShell познакомился только во время написания этой статьи.
Eсли нужно использовать свои или стронные библиотеки, да ещё
инструментарий поместить на собственную вкладку, то однозначно pyRevit то, что нужно.
А где про Revit API?
А про Revit API продолжение в следующей статье про методы получения получения элементов модели, в ней и узнаете про FilteredElementCollector и не только.

Subscription levels

Читатель

$ 5,4 per month
Считаешь что контент полезен, подпишись и поддержи автора и сможешь читать больше статей.

Продвинутый читатель

$ 16 per month
С этим уровнем подписки уже можно будет читать полный цикл статей про разработку инструментов.

Нетерпеливый читатель

$ 32 per month
С этим уровнем вы раньше всех сможете читать ещё неопубликованные статьи для других подписчиков, а также будет доступен исходный код из статей.
...

Пытливый читатель

$ 54 per month
С этим уровнем сможете вступить в закрытый телеграмм чат.
Go up