> For the complete documentation index, see [llms.txt](https://primer2.dynamobim.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://primer2.dynamobim.org/ru/1_developer_primer_intro/2_build_dynamo_from_source/1-build-dynamorevit-from-source.md).

# Сборка DynamoRevit на основе исходного кода

Исходные файлы DynamoRevit также хранятся в репозитории DynamoDS GitHub, что позволяет разработчикам вносить свой вклад и создавать бета-версии. Процесс создания DynamoRevit на основе исходного кода в целом аналогичен процессу, используемому в Dynamo, за исключением нескольких важных деталей:

* DynamoRevit ссылается на сборки Dynamo, поэтому их следует создавать с соответствующими пакетами NuGet. Например, DynamoRevit 2.x не загружается в Dynamo 1.3.
* DynamoRevit относится к определенным версиям Revit, например ветвь DynamoRevit 2018 должна работать в Revit 2018.

В данном руководстве предполагается, что используются следующие версии:

* Revit 2023.
* Последняя версия DynamoRevit, созданная в ветви `Revit2023`.
* Последняя сборка Dynamo.

Для успешной сборки в этом руководстве мы клонируем репозитории Dynamo и DynamoRevit.

*Примечание. Создавать Dynamo вручную до использования DynamoRevit требуется только при сборке Dynamo 1.x и DynamoRevit 1.x. Новые версии репозитория DynamoRevit используют диспетчер пакетов NuGet для загрузки необходимых зависимостей Dynamo. Хотя для сборки DynamoRevit 2.x не нужно извлекать Dynamo вручную, для запуска `надстройки` DynamoRevit потребуются файлы Core `DLL`, так что мы рекомендуем все равно загрузить и собрать Dynamo. См. подробности ниже:* [*Создание репозитория с помощью Visual Studio*](#building-the-repository-using-Visual-Studio).

### Поиск репозитория DynamoRevit на GitHub <a href="#locating-the-dynamorevit-repository-on-github" id="locating-the-dynamorevit-repository-on-github"></a>

Код проекта DynamoRevit и исходный код основного компонента Dynamo хранятся на GitHub в отдельных репозиториях. Этот репозиторий содержит исходные файлы для узлов Revit и надстройку Revit, с помощью которой выполняется загрузка Dynamo. Сборки DynamoRevit для различных версий Revit (например, 2016, 2017 или 2018) существуют в репозитории как ветви.

Исходный код DynamoRevit находится здесь: <https://github.com/DynamoDS/DynamoRevit>

![DynamoRevit на GitHub](/files/5JS7kwXK9XbqJbGp6OpO)

> 1. Клонирование или скачивание репозитория.
> 2. Ветви DynamoRevit ссылаются на версии Revit.

### Клонирование репозитория с помощью Git <a href="#cloning-the-repository-using-git" id="cloning-the-repository-using-git"></a>

Так же, как мы извлекали репозиторий Dynamo, мы используем команду git clone, чтобы клонировать DynamoRevit и указать ветвь, соответствующую версии Revit. Для начала откроем интерфейс командной строки и зададим в качестве текущего каталога папку, в которую будут скопированы файлы.

`cd C:\Users\username\Documents\GitHub` заменяет текущий каталог

> Замените `username` именем пользователя.

![Интерфейс командной строки](/files/0nGabFAyY8HEBA0oUirC)

Теперь можно клонировать репозиторий в эту папку. Хотя нам нужно будет указать ветвь репозитория, мы можем переключиться на эту ветвь после клонирования.

`git clone https://github.com/DynamoDS/DynamoRevit.git` клонирует репозиторий с удаленного URL и по умолчанию переключается на главную ветвь.

![Интерфейс командной строки после клонирования репозитория](/files/d4Rg7F44HzIhzfgnJnss)

После клонирования репозитория измените текущий каталог на папку репозитория и перейдите в ветвь, соответствующую установленной версии Revit. В данном примере используется Revit RC2.13.1\_Revit2023. Все удаленные ветви можно просмотреть на странице GitHub в раскрывающемся меню ветви.

`cd C:\Users\username\Documents\GitHub\DynamoRevit` меняет каталог на DynamoRevit.\
`git checkout RC2.13.1_Revit2023` определяет в качестве текущей ветвь `RC2.13.1_Revit2023`.\
`git branch` проверяет, на какой ветви мы находимся, и отображает другие локальные ветви.

![Каталог переключен на ветвь](/files/UrxV9YjTA6LeUPlTz3jF)

> Выгруженная в данный момент ветвь помечена звездочкой. Ветвь `Revit2018` отображается, так как уже была выгружена ранее, и поэтому присутствует на локальном компьютере.

Важно выбрать правильную ветвь репозитория, чтобы при сборке проекта в Visual Studio он ссылался на сборки верной версии каталога установки Revit, а именно `RevitAPI.dll` и `RevitAPIUI.dll`.

### Создание репозитория с помощью Visual Studio <a href="#building-dynamo-revit" id="building-dynamo-revit"></a>

Перед созданием репозитория необходимо восстановить пакеты NuGet с файлом `restorepackages.bat` в папке `src`. В этом файле BAT используется диспетчер пакетов [NuGet](https://www.nuget.org) для извлечения встроенных двоичных файлов Dynamo Core, необходимых для работы DynamoRevit. Их также можно создать вручную, но только если изменения вносятся в DynamoRevit, а не в ядро Dynamo. Это позволяет быстрее начать работу. Убедитесь, что этот файл запущен от имени администратора.

![Запуск от имени администратора](/files/4a2Nun1L8fGJyyZK7Z38)

> 1. Щелкните правой кнопкой мыши `restorepackages.bat` и выберите `Run as administrator` (запуск от имени администратора).

Если пакеты успешно восстановлены, в папку `packages` будет добавлена папка `src` с последними бета-версиями пакетов NuGet.

![Последние бета-версии пакетов Dynamo NuGet](/files/fA0ApC0mag2baEPeH3XT)

> 1. Последние бета-версии пакетов Dynamo NuGet

После восстановления пакетов откройте файл решения `DynamoRevit.All.sln` Visual Studio в `src` и выполните сборку. В сборке могут изначально возникнуть проблемы с поиском `AssemblySharedInfo.cs`. Перезапустите сборку, чтобы устранить эту проблему.

![Сборка решения](/files/XGRB3Fbrhjki4UzMVcy5)

> 1. Выберите `Build > Build Solution` (Сборка > Собрать решение).
> 2. В окне вывода вы должны увидеть сообщение об успешной сборке. Например: `===== Build: 13 succeeded, 0 failed, 0 up-to-date, 0 skipped =====`.

### Запуск локальной сборки DynamoRevit в Revit <a href="#running-a-local-build-of-dynamorevit-in-revit" id="running-a-local-build-of-dynamorevit-in-revit"></a>

Для распознавания DynamoRevit в Revit требуется файл надстройки, который автоматически создается программой [установки](http://dynamobim.org/download/). В процессе разработки нам необходимо вручную создать файл надстройки, указывающий на необходимую нам сборку DynamoRevit — `DynamoRevitDS.dll`. Кроме того, DynamoRevit необходимо связать со сборкой Dynamo.

Создайте файл `Dynamo.addin` в папке надстройки Revit, расположенной в папке `C:\ProgramData\Autodesk\Revit\Addins\2023`. У нас уже установлена версия DynamoRevit, поэтому мы просто отредактируем существующий файл, чтобы указать на новую сборку.

```
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>Dynamo For Revit</Name>
<Assembly>"C:\Users\username\Documents\GitHub\DynamoRevit\bin\AnyCPU\Debug\Revit\DynamoRevitDS.dll"</Assembly>
<AddInId>8D83C886-B739-4ACD-A9DB-1BC78F315B2B</AddInId>
<FullClassName>Dynamo.Applications.DynamoRevitApp</FullClassName>
<VendorId>ADSK</VendorId>
<VendorDescription>Dynamo</VendorDescription>
</AddIn>
</RevitAddIns>
```

* Укажите путь к файлу `DynamoRevitDS.dll` внутри `<Assembly>...</Assembly>`.

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

```
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>Dynamo For Revit</Name>
<Assembly>"C:\Users\username\Documents\GitHub\DynamoRevit\bin\AnyCPU\Debug\Revit\DynamoRevitVersionSelector.dll"</Assembly>
<AddInId>8D83C886-B739-4ACD-A9DB-1BC78F315B2B</AddInId>
<FullClassName>Dynamo.Applications.VersionLoader</FullClassName>
<VendorId>ADSK</VendorId>
<VendorDescription>Dynamo</VendorDescription>
</AddIn>
</RevitAddIns>
```

* Задайте путь к файлу `<Assembly>...</Assembly>`: `DynamoRevitVersionSelector.dll`
* `<FullClassName>...</FullClassName>` определяет, какой класс будет создан из сборки. Мы указали его в пути к элементу сборки выше. Этот класс будет отправной точкой для нашей надстройки.

Кроме того, необходимо удалить существующее приложение Dynamo, входящее в комплект поставки Revit. Для этого перейдите в каталог `C:\\Program Files\Autodesk\Revit 2023\AddIns` и удалите две папки, в названии которых есть текст **Dynamo**: `DynamoForRevit` и `DynamoPlayerForRevit`. Их можно удалить или создать резервную копию в отдельной папке, если требуется восстановить исходное приложение Dynamo for Revit.

![Папки DynamoForRevit и DynamoPlayerforRevit](/files/k6fmPNthtx9wphYZgbUz)

После этого необходимо добавить путь к файлу основных сборок Dynamo `Dynamo.config` в папку DynamoRevit `bin`. DynamoRevit загрузит их при открытии надстройки в Revit. Этот файл конфигурации позволяет указать надстройку DynamoRevit для различных версий Dynamo Core, чтобы разрабатывать и тестировать изменения в Core и DynamoRevit.

Код должен выглядеть так:

```
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
     <add key="DynamoRuntime" value="C:\Users\username\Documents\GitHub\Dynamo\bin\AnyCPU\Debug"/>
  </appSettings>
</configuration>
```

* Добавьте путь к `<add key/>` в папке `bin`.

> Перед созданием руководства мы клонировали Dynamo и произвели сборку, чтобы гарантировать корректную работу DynamoRevit. Путь к папке указывает на эту сборку.

Теперь при открытии Revit на вкладке «Управление» должна появиться надстройка Dynamo.

![Надстройка Dynamo, расположенная на вкладке «Управление»](/files/FjSQbZRnjsBZ5ugRb4ey)

> 1. Выберите `Manage` (Управление).
> 2. Щелкните значок надстройки Dynamo.
> 3. Экземпляр DynamoRevit.

Если отображается диалоговое окно с сообщением об ошибке, в котором показаны отсутствующие сборки, то, вероятно, обнаружено несоответствие между версиями Dynamo Core, созданными на основе этих сборок, и версиями, загружаемыми во время выполнения. Например, DynamoRevit с последними бета-версиями 2.0 пакетов Dynamo Core не будет работать при попытке запуска с помощью DLL-файлов Dynamo 1.3. Убедитесь, что версии репозиториев совпадают, а DynamoRevit извлекает корректную версию зависимостей NuGet. Зависимости определены в файле `package.json` репозитория DynamoRevit.

### Отладка DynamoRevit с помощью Visual Studio <a href="#debugging-dynamorevit-using-visual-studio" id="debugging-dynamorevit-using-visual-studio"></a>

В предыдущем разделе, **Сборка Dynamo на основе исходного кода**, мы кратко описали отладку в Visual Studio и способ присоединения Visual Studio к процессу. На примере исключения в узле Wall.ByCurveAndHeight рассмотрим процедуру присоединения к процессу, задания точек прерывания, пошагового выполнения кода и использования стека вызовов для определения источника исключения. Эти средства отладки обычно применяются к рабочим процессам разработки .Net и описаны за рамками данного руководства.

* **Присоединение к процессу** связывает выполняющееся приложение с Visual Studio для отладки. Если требуется отладить поведение в сборке DynamoRevit, можно открыть исходные файлы DynamoRevit в Visual Studio и присоединить процесс `Revit.exe`, который является родительским процессом надстройки DynamoRevit. Visual Studio использует [файл обозначений](https://msdn.microsoft.com/en-us/library/ms241613.aspx) (`PBD`) для создания связи между выполняемыми сборками DynamoRevit и исходным кодом.
* **Точки прерывания** устанавливают строки в исходном коде, перед выполнением которых приложение приостановит работу. Если узел приводит к аварийному завершению работы DynamoRevit или к непредвиденному результату, можно добавить точку прерывания в исходный код узла, чтобы приостановить процесс, выполнить код пошагово и проверить значения переменных в реальном времени, пока не будет найден источник проблемы
* При **пошаговом выполнении** код выполняется построчно. Можно выполнять функции по одной, отлаживать вызов функции и выходить из выполняемой в текущий момент функции.
* **Стек вызовов** показывает функцию, которая в текущий момент выполняется процессом, относительно предыдущих вызовов функции, которые спровоцировали данный вызов функции. В Visual Studio есть окно для отображения стека вызовов. Например, если мы получим исключение за пределами исходного кода, мы увидим путь к коду вызова в стеке вызовов.

  > В материалах [2000 вещей, которые необходимо знать о C#](https://csharp.2000things.com/2013/05/20/847-how-the-call-stack-works/) содержится более подробное описание стеков вызовов

Узел **Wall.ByCurveAndHeight** создает исключение, если в качестве входного значения кривой для него задана кривая PolyCurve с сообщением *To BSPlineCurve Not Implemented*. С помощью отладки мы можем выяснить точную причину, по которой узел не принимает выбранный тип геометрии в качестве входных данных параметра кривой. В следующем примере предполагается, что DynamoRevit успешно собран и может быть запущен как надстройка для Revit.

![Узел Wall.ByCurveAndHeight вызвал исключение](/files/gDDiGlGK7sui8t3jTj0c)

> 1. Узел Wall.ByCurveAndHeight вызвал исключение

Для начала откройте файл решения `DynamoRevit.All.sln`, запустите Revit, а затем надстройку DynamoRevit. Затем присоедините Visual Studio к процессу Revit с помощью окна `Attach to Process` (Присоединить к процессу).

![Окно «Присоединить к процессу»](/files/Pd1EflWsz6IzLjjjqzre)

> Чтобы показать доступные процессы, необходимо запустить Revit и DynamoRevit
>
> 1. Откройте окно `Attach to Process` (Присоединить к процессу), выбрав `Debug > Attach to Process...` (Отладка > Присоединить к процессу).
> 2. Установите для параметра `Transport` (Транспорт) значение `Default` (По умолчанию).
> 3. Выберите `Revit.exe`.
> 4. Выберите `Attach` (Присоединить).

Присоединив Visual Studio к Revit, откройте исходный код Wall.ByCurveAndHeight в `Wall.cs`. Его можно найти в обозревателе решений в разделе `Libraries > RevitNodes > Elements` (Библиотеки > RevitNodes > Элементы) в области `Public static constructors` файла. Задайте точку прерывания в конструкторе типа стены, чтобы при выполнении узла в Dynamo процесс прерывался, и мы могли просмотреть каждую строку кода по отдельности. Обычно автоматические конструкторы Dynamo начинаются с `By<parameters>`.

![Установка точки прерывания](/files/fzLgVwK1GqQCWndXtUHD)

> 1. Файл класса с конструктором для Wall.ByCurveAndHeight.
> 2. Чтобы задать точку прерывания, левой кнопкой мыши щелкните номер строки или правой кнопкой мыши щелкните строку кода, выберите`Breakpoint > Insert Breakpoint` (Точка прерывания > Вставить точку прерывания).

После установки точки прерывания необходимо запустить процесс через функцию Wall.ByCurveAndHeight. Эту функцию можно повторно выполнить в Dynamo, заново подключив провод к одному из портов, что приведет к повторному выполнению узла. Точка прерывания будет достигнута в Visual Studio.

![Достигнута точка прерывания в Visual Studio](/files/QFTswkEY5Lf0jJ3Kxpfh)

> 1. По достижении точки прерывания ее значок меняется.
> 2. В окне стека вызовов отображается следующий метод.

Теперь мы будем переходить от строки к строке до тех пор, пока не возникнет исключение. Следующим выполняется код, выделенный желтым цветом.

![Шаг с обходом в Visual Studio](/files/JYRlgadp3aQYIHfZ68Gt)

> 1. Инструменты отладки для навигации по коду.
> 2. Нажмите `Step Over` (Шаг с обходом), чтобы запустить выделенный код, а затем приостановить выполнение после возврата функции
> 3. Следующий выполняемый оператор обозначен желтым цветом и стрелкой.

Если продолжить пошаговое выполнение функции, возникнет исключение, отображаемое в окне DynamoRevit. В окне стека вызовов можно увидеть, что исключение изначально было создано методом `Autodesk.Revit.CurveAPIUtils.CreateNurbsCurve`. К счастью, здесь происходит обработка исключения, поэтому не происходит сбоя Dynamo. В процессе отладки мы выяснили контекст для проблемы, обнаружив в исходном коде другой метод.

Поскольку это не библиотека с открытым исходным кодом, мы не можем вносить в нее изменения. Имея дополнительную информацию, мы можем описать [проблему](https://guides.github.com/features/issues/) с контекстом на GitHub или предложить временное решение проблемы, используя запрос на слияние.

![Исключение в Visual Studio](/files/LiRc9YCRS9ynM8aYFgUd)

> 1. При переходе к оператору, вызывающему исключение в `Walls.cs`, процесс отладки позволяет максимально близко подобраться к основной причине проблемы в пользовательском коде в `ProtoToRevitCurve.cs`
> 2. Оператор, вызвавший исключение в `ProtoToRevitCurve.cs`.
> 3. В стеке вызовов видно, что исключение возникает не в пользовательском коде.
> 4. Всплывающее окно с информацией об исключении.

Этот процесс можно применить к любым исходным файлам, с которыми мы работаем. При разработке библиотеки узлов Zero-Touch для Dynamo можно открыть исходный код библиотеки и подключить процесс Dynamo для отладки библиотеки узлов. Даже если все работает нормально, отладка послужит отличным способом изучения кода для понимания рабочих процессов.

### Извлечение последней сборки <a href="#pull-latest-build" id="pull-latest-build"></a>

Процесс аналогичный извлечению изменений для Dynamo, но требует нахождения в правильной ветви. Используйте команду `git branch` в хранилище DynamoRevit, чтобы узнать, какие ветви доступны локально и какие из них в настоящий момент извлечены.

`cd C:\Users\username\Documents\GitHub\DynamoRevit` задает текущий каталог в репозитории DynamoRevit.\
`git branch` проверяет правильности ветви, `RC2.13.1_Revit2023`.\
`git pull origin RC2.13.1_Revit2023` извлекает изменения из удаленной исходной ветви `RC2.13.1_Revit2023`.

Начало координат указывает на исходный URL-адрес, который мы клонировали.

![Задание каталога в интерфейсе командной строки](/files/vGf9rzQCONqAwa4CKOwF)

> Необходимо помнить о том, на какой ветви мы находимся и из какой ветви мы извлекаем изменения, чтобы не переносить ненужные изменения, скажем, из `RC2.13.1_Revit2023` в `Revit2018`.

Как уже упоминалось в разделе **Сборка Dynamo на основе исходного кода**, при отправке изменений в хранилище DynamoRevit можно создать запрос на слияние, следуя рекомендациям команды Dynamo, изложенным в соответствующем разделе.
