# 1. Старт

Статьи посвещенные быстрому старту работы с pyRevit

# 1.1. Давайте знакомиться, pyRevit

[![asd.webp](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/asd.webp)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/asd.webp)

#### 1.1.1. Введение

<span class="p1 pcustom">В мире архитектурного и инженерного проектирования программное обеспечение Autodesk Revit занимает особое место. Однако, несмотря на его мощь и возможности, у многих пользователей возникает желание расширить функционал программы, сделать ее более гибкой и адаптированной под свои задачи. Здесь на помощь приходит **pyRevit** — инструмент, который способен существенно повысить эффективность работы в Revit.</span>

#### 1.1.2. Что такое pyRevit?

<span class="p1 pcustom">**pyRevit** — это бесплатный и открытый фреймворк, разработанный для расширения возможностей Autodesk Revit с помощью языка программирования Python. Он позволяет создавать пользовательские скрипты, инструменты и даже целые панели инструментов, интегрированные непосредственно в интерфейс Revit.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/oloimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/oloimage.png)

<span class="p1 pcustom">Основная идея pyRevit заключается в том, чтобы предоставить пользователям простой и доступный способ автоматизировать рутинные задачи, создавать собственные инструменты и делиться ими с сообществом. Благодаря использованию Python, одного из самых популярных и простых в освоении языков программирования, pyRevit открывает двери в мир кастомизации Revit даже для тех, кто не является профессиональным программистом.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/QZvimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/QZvimage.png)

#### 1.1.3. Встроенные кнопки и инструменты pyRevit

<span class="p1 pcustom">После установки pyRevit в Revit появляется новая вкладка с множеством полезных инструментов. Эти инструменты разработаны для решения различных задач, с которыми сталкиваются пользователи в повседневной работе:</span>

- <span class="p1 pcustom">**Анализ и проверка моделей**: инструменты для поиска ошибок, дубликатов, несоответствий в модели.</span>
- <span class="p1 pcustom">**Управление видами и листами**: быстрые способы создания и настройки видов, генерации листов и управления ими.</span>
- <span class="p1 pcustom">**Работа с параметрами**: массовое изменение параметров, экспорт и импорт данных.</span>
- <span class="p1 pcustom">**Геометрические операции**: дополнительные функции для работы с геометрией, которые отсутствуют в стандартном наборе Revit.</span>

<span class="p1 pcustom">Эти инструменты созданы сообществом и постоянно обновляются, что позволяет решать самые актуальные задачи и быть в курсе последних тенденций в отрасли.</span>

#### 1.1.4. Создание собственных инструментов

<span class="p1 pcustom">Одним из главных преимуществ pyRevit является возможность создавать собственные скрипты и инструменты. Это открывает безграничные возможности для персонализации Revit под конкретные потребности:</span>

- <span class="p1 pcustom">**Автоматизация рутинных задач**: если вы регулярно выполняете одни и те же действия, вы можете написать скрипт, который сделает это за вас в несколько кликов.</span>
- <span class="p1 pcustom">**Расширение функционала**: добавляйте новые функции, которых нет в стандартном наборе Revit.</span>
- <span class="p1 pcustom">**Интеграция с внешними данными**: связывайте вашу модель с внешними источниками данных, такими как базы данных или веб-сервисы.</span>

<span class="p1 pcustom">Создание собственных инструментов на Python не только повышает эффективность работы, но и способствует профессиональному росту, открывая новые горизонты в программировании и автоматизации.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/SnMimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/SnMimage.png)

#### 1.1.5. Преимущества pyRevit по сравнению с RPS, Dynamo и C#

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/wPKimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/wPKimage.png)

<span class="p1 pcustom">Многие могут задаться вопросом: "Зачем использовать pyRevit, если есть другие инструменты для расширения Revit, такие как RevitPythonShell (RPS), Dynamo или возможности программирования на C#?"</span>

<span class="p1 pcustom">Вот несколько причин, почему pyRevit выделяется на их фоне:</span>

- <span class="p1 pcustom">**Удобство использования**: pyRevit интегрируется непосредственно в интерфейс Revit, предоставляя интуитивно понятный доступ к инструментам и скриптам.</span>
- <span class="p1 pcustom">**Простота разработки**: Python считается одним из самых простых языков программирования для изучения. Его синтаксис понятен и логичен, что облегчает процесс создания скриптов даже для новичков.</span>
- <span class="p1 pcustom">**Быстрая интеграция**: в отличие от RPS, pyRevit позволяет создавать полноценные кнопки и панели инструментов, что делает использование скриптов более удобным и профессиональным.</span>
- <span class="p1 pcustom">**Гибкость**: хотя Dynamo предоставляет визуальное программирование, оно может быть менее эффективным для некоторых задач. Python в pyRevit позволяет писать более сложные и производительные скрипты.</span>
- <span class="p1 pcustom">**Сообщество и поддержка**: pyRevit имеет активное сообщество пользователей и разработчиков, которые постоянно обмениваются идеями, скриптами и оказывают поддержку новичкам.</span>
- <span class="p1 pcustom">**Отсутствие необходимости компиляции**: в отличие от C#, где для создания плагинов требуется компиляция кода, в pyRevit скрипты пишутся и запускаются напрямую, что ускоряет процесс разработки и отладки.</span>

#### 1.1.6. Заключение

<span class="p1 pcustom">pyRevit — это мощный инструмент, который может значительно повысить эффективность вашей работы в Autodesk Revit. Он объединяет в себе простоту использования, гибкость и широкие возможности для кастомизации.</span>

<span class="p1 pcustom">Если вы ищете способ упростить рутинные задачи, добавить новые функции в Revit или просто хотите расширить свои навыки и возможности, pyRevit — это то, что вам нужно.</span>

<span class="p1 pcustom">В следующих статьях мы более подробно рассмотрим, как установить pyRevit, как пользоваться встроенными инструментами и как начать создавать собственные скрипты. Присоединяйтесь к нам в этом увлекательном путешествии и откройте для себя новые возможности в мире BIM-проектирования с pyRevit!</span>

# 1.2. Установка

[  
<span class="p1 pcustom">![205ОБЩ.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/205obshh.png)</span>](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/205obshh.png)

---

<span class="p1 pcustom">"...самый лучший плагин" - это не только кликабельный заголовок, но и моё официальное заявление. </span>  
<span class="p1 pcustom">Причины описаны [ТУТ](https://dzen.ru/a/ZfGs1B8XcWyx-gzy)</span>

---

#### 1.2.1. Установка

<span class="p1 pcustom">Переходим на github: [https://github.com/pyrevitlabs/pyRevit/releases](https://github.com/pyrevitlabs/pyRevit/releases)</span>

<span class="p1 pcustom">Выбираем версию для установки:</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/image.png)</span>

- <span class="p1 pcustom">1ый installer ставит в \\AppData\\Roaming\\pyRevit-Master</span>
- <span class="p1 pcustom">2ой installe ставит на диск C и имеет возможность настроить классические расширения.</span>

<details id="bkmrk-%D0%97%D0%B0%D1%87%D0%B5%D0%BC-%D0%B8%D1%85-2%3F-%D0%9D%D0%B0-%D1%81%D0%BB%D1%83%D1%87%D0%B0"><summary>Зачем их 2?</summary>

<span class="p1 pcustom">На случай если у вас нет прав администратора на компьютере.</span>

</details><span class="p1 pcustom">Далее:</span>

- <span class="p1 pcustom">ждем завершения скачивания</span>
- <span class="p1 pcustom">закрываем ревиты</span>
- <span class="p1 pcustom">запускаем установку.</span>

<p class="callout success"><span class="p1 pcustom">Вот собственно и все.</span>  
<span class="p1 pcustom">Теперь у вас есть самый крутой плагин. Я же говорил, что будет быстро.</span></p>

#### 1.2.2. Расширения

<span class="p1 pcustom">Пока мы не начали писать свои кнопки, плагины и скрипты, давайте поговорим о уже готовых пользовательских расширениях.</span>

---

<span class="p1 pcustom">Их я условно разделю на "<span class="low_highlighting_custom highlighting">Одобренные</span>" и "<span class="low_highlighting_custom highlighting">Прочие</span>", отличаются они лишь способ установки.</span>

---

<span class="p1 pcustom">Кстати, если прям не терпится написать свое вот [статья](https://dzen.ru/a/ZnSrsVejjxvy1EU1).</span>

##### 1.2.2.1. Одобренные

<span class="p1 pcustom">Переходим на вкладку pyRevit и ищем вот эту стрелку:</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Ufqimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Ufqimage.png)</span>

<span class="p1 pcustom">Далее "Расширения":</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/XEBimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/XEBimage.png)</span>

<span class="p1 pcustom">Откроется меню, где представлены одобренные самим pyRevit расширения:</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/rPsimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/rPsimage.png)</span>

<span class="p1 pcustom">Любой из них можно выбрать и установить.</span>

<span class="p1 pcustom">После установки панель парезапустится и станет доступна среди вкладок.</span>

<span class="p1 pcustom">Для того чтобы попасть в список этих расширений необходимо следовать этой [инструкции](https://pyrevitlabs.notion.site/Share-Your-Extensions-48ff84d4eae846f4aa9567fca32ff4fe).</span>

##### 1.2.2.2. Прочие

<span class="p1 pcustom">Вот эти расширения надо поискать самостоятельно, но ниже в главе "<span class="low_highlighting_custom highlighting">Ресурсы</span>" я закину пару расширений, которые смог найти.</span>

<span class="p1 pcustom">Теперь представим, что вы скачали чьё-то расширение или сделали его сами, и у вас будет папка с окончанием<span class="low_highlighting_custom highlighting"> .extension</span> в имени.</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Mo9image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Mo9image.png)</span>

<span class="p1 pcustom">Надо указать паю путь до нее. Для этого переходим в "Настройки":</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Zf1image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Zf1image.png)</span>

<div id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D0%BE%D0%B5%D1%82-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BE%D0%BA%D0%BD%D0%BE%3A"><div aria-label=""><div><span class="p1 pcustom">Откроет такое окно:</span></div></div></div><span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/I20image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/I20image.png)</span>

<div id="bkmrk-%D0%92%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%22%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF-1"><div aria-label=""><div>- <div><span class="p1 pcustom">Выбираем "<span class="low_highlighting_custom p1 highlighting">Добавить папку</span>"</span></div>
- <div><span class="p1 pcustom">Указываем папку <span class="low_highlighting_custom p1 highlighting">В КОТОРОЙ</span> находится папка с расширением <span class="low_highlighting_custom p1 highlighting">.extension</span></span></div>
- <div><span class="p1 pcustom">Нажимаем "<span class="low_highlighting_custom p1 highlighting">Сохранить и перезапустить</span>"</span></div>

</div></div></div><span class="p1 pcustom">После перезагрузки новые расширения отобразятся в Ревит.</span>

<span class="p1 pcustom">И да, теперь любую из кнопок (при условие что она была написана на python) можно открыть и посмотреть ее исходный код. Для этого зажмите <span class="low_highlighting_custom p1 highlighting">Alt + ЛКМ</span> по кнопке - откроется папка с исполняющим файлом.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/59timage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/59timage.png)

#### 1.2.3. Ресурсы

- <span class="p1 pcustom">[Офф. документация по установке](https://pyrevitlabs.notion.site/Install-pyRevit-98ca4359920a42c3af5c12a7c99a196d)</span>
- <span class="p1 pcustom">[Офф. документация](https://pyrevitlabs.notion.site/pyRevit-bd907d6292ed4ce997c46e84b6ef67a0)</span>
- <span class="p1 pcustom">[Офф. инструкция по установке расширений:](https://pyrevitlabs.notion.site/Install-Extensions-0753ab78c0ce46149f962acc50892491)</span>
- <span class="p1 pcustom">[Гайды от сообщества](https://pyrevitlabs.notion.site/HOW-TO-Guides-dc20e0e227b74d9bbc775699904152cb)</span>

# 1.3. Первая кнопка

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/oY1image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/oY1image.png)

<span class="p1 pcustom">Сегодня мы с вами создадим свою вкладку, свою панель и свою кнопку в пару кликов. </span>  
<span class="p1 pcustom">Все это благодаря pyRevit (дальше "<span class="strong_highlighting_custom p1 highlighting">пай</span>").</span>

#### 1.3.1. В начале была папка.

<span class="p1 pcustom">Добавить пользовательское расширение в пай легко. </span>  
<span class="p1 pcustom">Нужно лишь создать правильную структуру папок остальное на себя возьмет сам плагин.</span>

<span class="p1 pcustom">Для начала предлагаю выбрать какую-то папку, куда мы будем в последствие добавлять все нами написанные кнопки.</span>

---

<span class="p1 pcustom">Если мы говорим о разработке плагинов внутри компании, хорошей практикой будет расположить ее в общедоступном месте. После чего, все желающие могут подключится к директории и использовать скрипты.</span>

---

<span class="p1 pcustom">Для статьи я выберу папку просто на рабочем столе: </span>  
<span class="p1 pcustom strong_highlighting_custom highlighting">C:\\Users\\chttm\\OneDrive\\Рабочий стол\\TEST\\</span>

<span class="p1 pcustom">Открываем папку TEST идем по пунктам:</span>

#### 1.3.2. ".extension"

<span class="p1 pcustom">Нам нужна папка с окончанием <span class="low_highlighting_custom p1 highlighting">.extension</span>.</span>

<span class="p1 pcustom">Это сообщит pyRevit, что у нас внутри есть структура папок расширений.</span>

<span class="p1 pcustom">Создаем папку с именем "<span class="low_highlighting_custom p1 highlighting">МоеРасширение.extension</span>".</span>

---

<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">.extension</span> - специальное окончание в имени папки, так пай будет понимать, что это расширение.</span>  
<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">МоеРасширение</span> - произвольное имя, оно не будет фигурировать в самом ревите.</span>

---

#### 1.3.3. ".tab"

<span class="p1 pcustom">Внутри МоеРасширение.extension создадим папку "<span class="low_highlighting_custom p1 highlighting">МояВкладка.tab</span>".</span>

---

<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">.tab</span> - специальное окончание, которое укажет паю, что эту папку надо рассматривать как вкладу ревита</span>  
<span class="p1 pcustom">💡“<span class="low_highlighting_custom p1 highlighting">МояВкладка</span>” - имя вкладки. Оно отобразится в ревите.</span>

---

<span class="p1 pcustom">Это в Revit называется "<span class="strong_highlighting_custom p1 highlighting">Вкладки</span>".</span>

[![Это вкладки](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/jdqimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/jdqimage.png)

#### 1.3.4 ".panel"

<span class="p1 pcustom">Перейдем в “<span class="low_highlighting_custom p1 highlighting">МояВкладка.tab</span>” и создадим папку <span class="low_highlighting_custom p1 highlighting">МояПанель1.panel</span></span>

---

<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">.panel</span> - специальное окончание, которое укажет паю, что содержимое этой папки надо поместить на отдельную панель.</span>  
<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">МояПанель1</span> - имя панели.</span>

---

<span class="p1 pcustom">Это "<span class="strong_highlighting_custom p1 highlighting">Панели</span>".</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/DuBimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/DuBimage.png)

#### 1.3.5. ".pushbutton"

<span class="p1 pcustom">Наконец, нам нужно создать кнопки.</span>

<span class="p1 pcustom">Перейдем в папку <span class="low_highlighting_custom p1 highlighting">МояПанель1.panel</span> и создадим папку "<span class="low_highlighting_custom p1 highlighting">МояПростоКнопка.pushbutton</span>".</span>

---

<span class="p1 pcustom">💡<span class="low_highlighting_custom p1 highlighting">.pushbutton</span> - специальное окончание, которое укажет паю, что эта папка должна стать кнопкой.</span>  
<span class="p1 pcustom">💡"<span class="low_highlighting_custom p1 highlighting">МояПростоКнопка</span>" - имя кнопки, если нет иного указания имени.</span>

---

<span class="p1 pcustom">Это "<span class="strong_highlighting_custom p1 highlighting">Кнопки</span>".</span>

[  
![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Gc7image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Gc7image.png)

<span class="p1 pcustom">Внутри этой папки должны находится:</span>

- <span class="p1 pcustom">"<span class="low_highlighting_custom p1 highlighting">script.py</span>" - скрипт.</span>

---

<span class="p1 pcustom">💡Мы можем называть наши скрипты как угодно, лишь бы в конце стоял <span class="low_highlighting_custom p1 highlighting">script.py</span>.</span>  
<span class="p1 pcustom">💡Например: <span class="low_highlighting_custom p1 highlighting">Supernatural\_script.py</span></span>

---

- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">icon.png</span> - иконка. </span>

---

<span class="p1 pcustom">💡Не обязательный файл.</span>  
<span class="p1 pcustom">💡Максимальный размер <span class="low_highlighting_custom p1 highlighting">96x96</span> пикселей.</span>

---

- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">bundle.yam</span>l - файл метаданных. [Тут подробнее](https://pyrevitlabs.notion.site/Bundle-Metadata-9fa4911c14fa49c48e715421400f1427)</span>

---

<span class="p1 pcustom">💡Не обязательный файл.</span>  
<span class="p1 pcustom">💡Удобный способ задать имя, контекст, описание, автора и многое другое для кнопки.</span>

---

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/BVuimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/BVuimage.png)

<span class="p1 pcustom">У нас получится такая структуру папок:</span>

<span class="p1 pcustom">- МоеРасширение.extension</span>

<span class="p1 pcustom">- - МояВкладка.tab</span>

<span class="p1 pcustom">- - - МояПанель1.panel</span>

<span class="p1 pcustom">- - - - МояПростоКнопка.pushbutton</span>

<span class="p1 pcustom">- - - - - script.py</span>

<span class="p1 pcustom">- - - - - icon.png</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/s9rimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/s9rimage.png)

<p class="callout success"><span class="p1 pcustom">Поздравляю вас, первая кнопка создана.</span></p>

<span class="p1 pcustom">Теперь подключим наше расширение к Revit.</span>

# 1.4. Подключение своего расширения

<span class="p1 pcustom">В этом нам поможет классическая вкладка pyRevit, которая появляется сразу после его установки.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Twmimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Twmimage.png)

<span class="p1 pcustom">Переходим по пути: <span class="low_highlighting_custom p1 highlighting">pyRevit</span> - <span class="low_highlighting_custom p1 highlighting">Настройки</span> - <span class="low_highlighting_custom p1 highlighting">Каталоги пользовательских расширений</span></span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/55Vimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/55Vimage.png)

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/mqDimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/mqDimage.png)

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/sESimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/sESimage.png)

<span class="p1 pcustom">Нажимаем “<span class="low_highlighting_custom p1 highlighting">Добавить папку</span>” и указываем папку TEST - то есть, ту папку, в которой находится папка с окончанием <span class="low_highlighting_custom p1 highlighting">.extension</span></span>

<p class="callout warning"><span class="p1 pcustom">Еще раз - не саму папку с расширением <span class="low_highlighting_custom p1 highlighting">.extension</span>, а директорию в которой она находится.</span></p>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/tLiimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/tLiimage.png)

<span class="p1 pcustom">И нажимаем “<span class="low_highlighting_custom p1 highlighting">Выбор папки</span>” и применяем настройки нажав “<span class="low_highlighting_custom p1 highlighting">Сохранить и перезапустить</span>”</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/wXOimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/wXOimage.png)

<span class="p1 pcustom">После перезагрузки появляется новая вкладка “<span class="low_highlighting_custom p1 highlighting">МояВкладка</span>”</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/Attimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/Attimage.png)

<span class="p1 pcustom">Откроем ее и увидим нашу первую кнопку.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/tMAimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/tMAimage.png)

# 1.5. Пишем первый скрипт

<span class="p1 pcustom">Раз уж есть кнопка, предлагаю познакомиться немного с апи и напиcать какую-то базовую штуку, но только не “привет мир”.</span>

<span class="p1 pcustom">Пусть кнопка закрепляет все наши оси в проекте.</span>

<span class="p1 pcustom">Для этого откроем файл <span class="low_highlighting_custom p1 highlighting">script.py</span>. В качестве редактора я буду использовать VSCode.</span>

---

<span class="p1 pcustom">Для того чтобы быстро открыть скрипт какой-либо кнопки, необходимо активировать ее левой кнопкой мыши зажав <span class="low_highlighting_custom p1 highlighting">ALT</span></span>  
<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">ALT + Click</span> - открывает папку с скриптом</span>

---

<span class="p1 pcustom">Напишем первые строчки - метаданные.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/iRVimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/iRVimage.png)

<span class="p1 pcustom">Пройдем по ним</span>

<span class="p1 pcustom">1 - **Задаем кодировку для отображения и использования русских символов**: Указание кодировки UTF-8 позволяет корректно отображать и использовать русские символы.</span>

<span class="p1 pcustom">3-5 - **Заголовок, автор и описание скрипта**:</span>

- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">\_\_title\_\_</span>: Устанавливает заголовок скрипта.</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">\_\_author\_\_</span>: Указывает автора скрипта.</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">\_\_doc\_\_</span>: Предоставляет описание скрипта.</span>

---

<span class="p1 pcustom">Это метаданные для кнопки. Их можно определять в качестве глобальных переменных в самом коде или в специальном файле <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span>. О нем поговорим попозже.</span>

---

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/B6wimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/B6wimage.png)

<span class="p1 pcustom">7 - **Импортируем библиотеку Autodesk Revit API**: Импортируем пространство имен DB из библиотеки Autodesk Revit, которое содержит классы и методы для работы с элементами Revit.</span>

<span class="p1 pcustom">9 - **Получаем активный документ Revit**: doc хранит ссылку на текущий активный документ Revit, который используется для выполнения операций с элементами модели.</span>

<span class="p1 pcustom">11-13 - **Определяем функцию pin для закрепления элемента**: Функция которая будет закреплять элемент и выводить информацию об этом через print</span>

<span class="p1 pcustom">15-18 - **Создаем коллекцию всех осей в документе**: </span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">DB.FilteredElementCollector(doc)</span>: Создает коллекцию для фильтрации элементов в документе doc.</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">.OfCategory(DB.BuiltInCategory.OST\_Grids)</span>: Фильтрует коллекцию по категории "Оси" (Grids).</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">.WhereElementIsNotElementType()</span>: Исключает из коллекции типы элементов, оставляя только экземпляры.</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">.ToElements()</span>: Преобразует отфильтрованную коллекцию в список элементов.</span>

<span class="p1 pcustom">20-25 - **Открываем транзакцию для выполнения изменений в документе**:</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">with DB.Transaction(doc, "Автозакрепление") as t</span>: Создает транзакцию с именем "<span class="low_highlighting_custom p1 highlighting">Автозакрепление</span>" и открывает ее в контексте <span class="low_highlighting_custom p1 highlighting">with</span>.</span>

- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">t.Start()</span>: Запускает транзакцию.</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">if grids</span>: Проверяет, если список осей не пустой.</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">for grid in grids</span>: Перебирает каждую ось в списке grids.</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">pin(grid, 1)</span>: Вызывает функцию pin для закрепления текущей оси grid (устанавливает статус в 1, что означает "закреплено").</span>
- <span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">t.Commit()</span>: Фиксирует изменения в документе, завершает транзакцию.</span>

<span class="p1 pcustom">Сохраняем скрипт, возвращаемся к Revit’у и активируем кнопку. Появится окно:</span>

<div id="bkmrk--5"><div><div><div><div><div><div itemprop="articleBody"><div data-points="5" data-z7_wysb6y="article-render__block"><div><div aria-label=""><div><figure class="content--article-image-item__imageItem-3w">![-17](https://avatars.dzeninfra.ru/get-zen_doc/271828/pub_6674abb157a38f1bf2d44535_66756293eb0150584cc69ab6/scale_1200)</figure></div></div></div></div></div></div></div></div></div></div></div><span class="p1 pcustom">Как видно мы внесли изменения в файл скрипта и он отработал согласно последним изменениям в нем.</span>

---

<span class="p1 pcustom">То есть, при изменение самого кода перезапускать панель не надо, но вот чтобы отобразить новые кнопки или изменения в оформление(строчки 1-4 ) необходимо произвести перезагрузку панелей пая.</span>

---

 <span class="p1 pcustom">Для этого на вкладке pyRevit есть кнопка “<span class="low_highlighting_custom p1 highlighting">Обновить</span>”</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/ktwimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/ktwimage.png)

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/hTlimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/hTlimage.png)

<span class="p1 pcustom">Нажимаем “<span class="low_highlighting_custom p1 highlighting">Да</span>” и ждем обновления панелей.</span>

<span class="p1 pcustom">Теперь мы видим, что имя кнопки сменилось на то, которое мы указали внутри самого скрипта и добавилось описание.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/scaled-1680-/lWYimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-09/lWYimage.png)

<p class="callout success"><span class="p1 pcustom">Наша первая полностью функционирующая кнопка готова.</span></p>

<span class="p1 pcustom">Код тут: [gist.github](https://gist.github.com/chttIE/f755e23a17e85d11de65b89c7f0b4495)</span>

# 1.6. Типы кнопок

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/2Bsimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/2Bsimage.png)

<span class="p1 pcustom">В [предыдущей статье](https://wiki.marksdigital.ru/books/pyrevit/page/13-pervaia-knopka) мы разбирали как создать кнопку типа <span class="low_highlighting_custom p1 highlighting">.pushbutton</span>, но на этом функционал Revit и pyRevit не заканчивается.</span>

<span class="p1 pcustom">Давайте посмотрим, что они еще могут.</span>

#### 1.6.1. Выпадающий список и стак (.pulldown и .stack)

<span class="p1 pcustom">Стак выглядит так:</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/Yo8image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/Yo8image.png)</span>

<span class="p1 pcustom">Выпадающий список выглядит так:</span>

<span class="p1 pcustom">![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/2XRimage.png)</span>

<span class="p1 pcustom">Для этого в папке “<span class="low_highlighting_custom p1 highlighting">МояВкладка.tab</span>” создадим папку "<span class="low_highlighting_custom p1 highlighting">МояПанель2.panel</span>"</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/uFHimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/uFHimage.png)</span>

<span class="p1 pcustom">В нее поместим папку с именем "<span class="low_highlighting_custom p1 highlighting">Стак1.stack</span>"</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/n1Nimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/n1Nimage.png)</span>

<span class="p1 pcustom">А в нее поместим “<span class="low_highlighting_custom p1 highlighting">Стаковая кнопка 1.pulldown</span>”</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/Nd6image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/Nd6image.png)</span>

<span class="p1 pcustom">Внутри папки <span class="low_highlighting_custom p1 highlighting">.pulldown</span> расположим 3 папки с расширением <span class="low_highlighting_custom p1 highlighting">.pushbutton</span> (в <span class="low_highlighting_custom p1 highlighting">.pushbutton</span> закидываем <span class="low_highlighting_custom p1 highlighting">script.py</span> и <span class="low_highlighting_custom p1 highlighting">icon.png</span> )</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/ojJimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/ojJimage.png)

<span class="p1 pcustom">После чего скопируем <span class="low_highlighting_custom p1 highlighting">.pulldown</span> 2 раза поменяв названия.</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/PQqimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/PQqimage.png)

<span class="p1 pcustom">Должна получится такая структура:</span>

<span class="p1 pcustom">- МояВкладка.tab</span>

<span class="p1 pcustom">- МояПанель2.panel</span>

<span class="p1 pcustom">- Стак1.stack</span>

<span class="p1 pcustom">- Стаковая кнопка 1.pulldown</span>

<span class="p1 pcustom">- Стаковая кнопка 2.pulldown</span>

<span class="p1 pcustom">- Стаковая кнопка 3.pulldown</span>

<span class="p1 pcustom">- Кнопка1.pushbutton</span>

<span class="p1 pcustom">- script.py</span>

<span class="p1 pcustom">- icon.png</span>

<span class="p1 pcustom">- Кнопка2.pushbutton</span>

<span class="p1 pcustom">- Кнопка3.pushbutton</span>

<span class="p1 pcustom">- icon.png</span>

<span class="p1 pcustom">Перезапускаем панель нажав “<span class="low_highlighting_custom p1 highlighting">Обновить</span>” и вауля:</span>

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/HERimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/HERimage.png)

<span class="p1 pcustom">Попробую еще раз но другими слова для закрепления.</span>

---

<span class="p1 pcustom">Сначала мы создали .stack сказав паю что надо расплагать все что будет внутри друг под другом - типа таблицей. Максимальная высота стака - 3.</span>

<span class="p1 pcustom">А "таблица" состоин из выпадающих списков, и что бы пай понял, что это "выпадающий" мы задаем в имени папки на конце .pulldown</span>

<span class="p1 pcustom">В основном я пользуюсь только 3 типа кнопок:</span>

- <span class="p1 pcustom">stack</span>
- <span class="p1 pcustom">puldown</span>
- <span class="p1 pcustom">pushbutton</span>

<span class="p1 pcustom">и просто по разному комбинирую их.</span>

---

#### 1.6.2. А какие еще могут быть кнопки?

<span class="p1 pcustom">Вообще, вы могли заметить, что по сути тип кнопки не поменялся, как был pushbutton так и остался. Поменялась структура, в которой расположена кнопка. Но в пай действительно можно создать другой тип кнопки. Описывать подробно в рамках статей я не буду, но дам затравку:</span>

- <span class="p1 pcustom">.smartbutton</span>
- <span class="p1 pcustom">.nobutton</span>
- <span class="p1 pcustom">.splitpushbutton</span>
- <span class="p1 pcustom">.splitbutton</span>
- <span class="p1 pcustom">.urlbutton</span>

<span class="p1 pcustom">подробнее [тут](https://pyrevitlabs.notion.site/Developer-Docs-2c88f3ecccde422d9504e20b6b9e04f8)</span>

# 1.7. Метаданные для кнопок

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/XzNimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/XzNimage.png)

<p class="callout info"><span class="p1 pcustom">В продолжение темы о работе с кнопками и их форматом следует упоминать файл метаданных - <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span></span></p>

#### 1.7.1. Введение 

<span class="p1 pcustom">Метаданные - это наборы инструкций которые помогают паю более детально настраивать кнопки. </span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/fU7image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/fU7image.png)</span>

<span class="p1 pcustom">Например строчка \_title\_ отвечающее за имя кнопки является метаданными.</span>  
<span class="p1 pcustom">Изначально разработчики pyRevit определили их нахождение прямо в самом файле скрипта, и на ранних этапах этого было вполне достаточно.</span>

<span class="p1 pcustom">По мере увеличения функционала появлялись все новые и новые инструкции и было решено перенести их в отдельный файл <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span>. </span>

<span class="p1 pcustom">При этом поддержка работы инструкций находящихся внутри скрипта все еще осталась.</span>

#### 1.7.2. Сортировка

<span class="p1 pcustom">Смоделируем ситуацию: сделали мы кнопку <span class="low_highlighting_custom p1 highlighting">.pulldown</span> и туда поместили кучу <span class="low_highlighting_custom p1 highlighting">.pushbutton</span></span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/eSIimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/eSIimage.png)</span>

<span class="p1 pcustom">Пай отсортирует этот список кнопок по алфавиту, но что делать, если нам нужна другая последовательность?</span>

<span class="p1 pcustom">Для упорядочивания нам потребует еще один файлик - <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span></span>

<span class="p1 pcustom">1. Создать файл <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span></span>

<span class="p1 pcustom">2. Расположить его в папку, в которой надо задать сортировку кнопок</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/Jf7image.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/Jf7image.png)</span>

<span class="p1 pcustom">3. Открываем файл <span class="low_highlighting_custom p1 highlighting">bundle.yaml</span> и задаем нужную сортировку указав специальное слово "<span class="low_highlighting_custom p1 highlighting">layout:</span>"</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/JwRimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/JwRimage.png)</span>

<p class="callout success"><span class="p1 pcustom">После перезапуска кнопки отсортируются согласно порядку в данном файле.</span></p>

#### 1.7.3. Что еще может bundle.yaml

[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/QDCimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/QDCimage.png)

##### 1.7.3.1. Выделение

<span class="p1 pcustom">Добавив поля: </span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">highlight: updated</span> или <span class="low_highlighting_custom p1 highlighting">highlight: new</span></span>

<span class="p1 pcustom">У кнопки появится такой эффект:</span>

<span class="p1 pcustom">[![image.png](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/scaled-1680-/90Nimage.png)](https://wiki.marksdigital.ru/uploads/images/gallery/2024-10/90Nimage.png)</span>

##### 1.7.3.2. Имя

<span class="p1 pcustom low_highlighting_custom highlighting">title: "Имя\\nкнопки"</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">\\n</span> - позволит перенести текст на новую строчку как здесь (если используем перенос, указываем имя в кавычках)</span>

<span class="p1 pcustom">Так же можно задать имя, которое будет меняться в зависимости от того какая языковая версия установлена</span>

```yaml
title:
  en_us: Test Bundle (Custom Title)
  ru: Имя кнопке
```

##### 1.7.3.3. Описание

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">tooltip:</span> Описание кнопки</span>

```yaml
tooltip:
  en_us: tooltip for button
  ru: Описание кнопки
```

##### 1.7.3.4. Автор

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">author:</span> Указать автора</span>

<span class="p1 pcustom">или указать несколько </span>

<span class="p1 pcustom low_highlighting_custom highlighting">authors:</span>  
<span class="p1 pcustom"> - Nistratov Ilia</span>  
<span class="p1 pcustom"> - Anton Vyazikov</span>

##### 1.7.3.5. Версии ревит

<span class="p1 pcustom">Можно ограничить версии ревит на которых кнопка будет появляться</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">min\_revit\_version:</span> 2017 - Минимальная версия, на которой будет отображаться эта кнопка</span>  
<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">max\_revit\_version:</span> 2025 - Максимальная версия ревита, на которой будет отображаться эта кнопка</span>

##### 1.7.3.6. Контекст

<span class="p1 pcustom">Контекст это условие при котором кнопка будет доступна для нажатия.</span>

<span class="p1 pcustom">Например нам нужно чтобы кнопка была доступна даже если не открыт ни один проект - нужно указать: </span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">context: zero-doc</span> - Позволит использовать скрипт без открытых моделей</span>

<span class="p1 pcustom">А вот пример того что нужно указать что бы кнопка стала доступна только выбора элементов категории стены или окна:</span>

```yaml
context:
- Walls
- Window
```

<span class="p1 pcustom">А такая запись позволит использовать скрипт только если выделены стены или окна (можно указывать несколько категорий)</span>

<span class="p1 pcustom"><span class="low_highlighting_custom p1 highlighting">helpurl: "https: ССЫЛКА"</span> - позволит при наведение на кнопку и нажатие F1 открыть указанную ссылку</span>

<span class="p1 pcustom">Больше об этом читаем [тут](https://pyrevitlabs.notion.site/Bundle-Metadata-9fa4911c14fa49c48e715421400f1427)</span>