Знакомство с 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 не селён, и какие нужно сделать хитросплетения из нод я не в курсе, то поступил бы так:
Поскольку в 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 файл,
содержащий туже ошибку в имени метода, и пробуем его, запустив на исполнение код.
содержащий туже ошибку в имени метода, и пробуем его, запустив на исполнение код. Взглянем на то, как выводятся ошибки загрузив *.py файл,
содержащий туже ошибку в имени метода, и пробуем его, запустив на исполнение код.
Мнда, сообщение об ошибке то он выдал, но понятно только, что 'Pipe' object has no attribute 'LookUpParameter', а где этот Pipe находится пойди найди сам. Искать самостоятельно в какой строке код ломается самостоятельно, это не наш метод, изменим немного код и посмотрим, что из этого получится.
Вооот, другое дело, теперь понятно в какой строке.
А как оно в pyRevit?
В отличии от предыдущих двух инструментов, pyRevit является более навороченным и позволяет создавать собственные вкладки с панелями инструментов и имеет богатую собственные библиотеки, немного упрощающие разработку.
Код написанный для RPS запустится в pyRevit. Прежде чем сравнить
разницу подходов написания кода для RPS и pyRevit используя возможности из коробки, запустим код написанный для RPS с ошибкой в имени метода и посмотрим, что получится.
разницу подходов написания кода для RPS и pyRevit используя возможности из коробки, запустим код написанный для RPS с ошибкой в имени метода и посмотрим, что получится.
В отличии от RPS вносить изменяя в код для понимания в какой строке сломалось не пришлось.
Теперь взглянем на небольшую разницу в коде.
Хоть так пиши хоть сяк, работать будут оба, но реализация транзакций через контекстный менеджер сильно радует.
И что же выбрать?
Для небольших скриптов с использованием структурного подхода к написанию кода, то Dynamo вполне подходит. тем более в месте с Revit в комплекте и ненужно заморачиватся с установкой дополнительных инструментов.
На счёт RevitPythonShell у меня так и не сложилось чёткого мнения,
думаю для написания простынкой автоматизации для себя, изучения API и IronPyton, несомненно, на мой взгляд более подходящий инструмент чем Dynamo.
думаю для написания простынкой автоматизации для себя, изучения API и IronPyton, несомненно, на мой взгляд более подходящий инструмент чем Dynamo.
Если придерживаться принципа что код два раза не пишется, использовать свои библиотеки, то, наверное, и в RevitPythonShell и Dynamo можно
подключить как свои, так и сторонние модули. А нужно ли для этого плясать и с каким бубном я не знаю, с Dynamo работал мало и таких задач не было, с RevitPythonShell познакомился только во время написания этой статьи.
подключить как свои, так и сторонние модули. А нужно ли для этого плясать и с каким бубном я не знаю, с Dynamo работал мало и таких задач не было, с RevitPythonShell познакомился только во время написания этой статьи.
Eсли нужно использовать свои или стронные библиотеки, да ещё
инструментарий поместить на собственную вкладку, то однозначно pyRevit то, что нужно.
инструментарий поместить на собственную вкладку, то однозначно pyRevit то, что нужно.
А где про Revit API?
А про Revit API продолжение в следующей статье про методы получения получения элементов модели, в ней и узнаете про FilteredElementCollector и не только.