Сборка 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 addin потребуются файлы Core dlls, так что мы рекомендуем все равно загрузить и собрать Dynamo. См. подробности ниже: Создание репозитория с помощью Visual Studio

Поиск репозитория DynamoRevit на Github

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

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

  1. Клонирование или скачивание репозитория.

  2. Ветви DynamoRevit ссылаются на версии Revit.

Клонирование репозитория с помощью Git

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

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

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

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

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

После клонирования репозитория измените текущий каталог на папку репозитория и перейдите в ветвь, соответствующую установленной версии 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 проверяет, на какой ветви мы находимся, и отображает другие локальные ветви.

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

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

Создание репозитория с помощью Visual Studio

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

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

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

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

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

  1. Выберите Build > Build Solution (Сборка > Собрать решение).

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

Запуск локальной сборки DynamoRevit в Revit

Для распознавания DynamoRevit в Revit требуется файл надстройки, который автоматически создается программой установки. В процессе разработки нам необходимо вручную создать файл надстройки, указывающий на необходимую нам сборку 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.

После этого необходимо добавить путь к файлу основных сборок 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.

  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

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

  • Присоединение к процессу связывает выполняющееся приложение с Visual Studio для отладки. Если требуется отладить поведение в сборке DynamoRevit, можно открыть исходные файлы DynamoRevit в Visual Studio и присоединить процесс Revit.exe, который является родительским процессом надстройки DynamoRevit. Visual Studio использует файл обозначений (.pbd) для создания связи между выполняемыми сборками DynamoRevit и исходным кодом.

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

  • При пошаговом выполнении код выполняется построчно. Можно выполнять функции по одной, отлаживать вызов функции и выходить из выполняемой в текущий момент функции.

  • Стек вызовов показывает функцию, которая в текущий момент выполняется процессом, относительно предыдущих вызовов функции, которые спровоцировали данный вызов функции. В Visual Studio есть окно для отображения стека вызовов. Например, если мы получим исключение за пределами исходного кода, мы увидим путь к коду вызова в стеке вызовов.

    В материалах 2000 вещей, которые необходимо знать о C# содержится более подробное описание стеков вызовов

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

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

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

Чтобы показать доступные процессы, необходимо запустить 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>.

  1. Файл класса с конструктором для Wall.ByCurveAndHeight.

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

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

  1. По достижении точки прерывания ее значок меняется.

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

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

  1. Инструменты отладки для навигации по коду.

  2. Нажмите Step Over (Шаг с обходом), чтобы запустить выделенный код, а затем приостановить выполнение после возврата функции

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

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

Поскольку это не библиотека с открытым исходным кодом, мы не можем вносить в нее изменения. Имея дополнительную информацию, мы можем описать проблему с контекстом на GitHub или предложить решение проблемы, используя запрос на слияние.

  1. При переходе к оператору, вызывающему исключение в Walls.cs, процесс отладки позволяет максимально близко подобраться к основной причине проблемы в пользовательском коде в ProtoToRevitCurve.cs

  2. Оператор, вызвавший исключение в ProtoToRevitCurve.cs.

  3. В стеке вызовов видно, что исключение возникает не в пользовательском коде.

  4. Всплывающее окно с информацией об исключении.

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

Извлечение последней сборки

Процесс аналогичный извлечению изменений для 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-адрес, который мы клонировали.

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

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

Last updated