Найти тему

Создание и подключение плагина для Revit

Оглавление

В сегодняшней статье разберём создание плагина для Revit с нуля. Для этого нам потребуется предустановленный Revit, Visual Studio (инструкция по установке), и, собственно, алгоритм, который будет выполнять наш плагин. Статья может быть полезна в том числе и тогда, когда вы написали плагин, но подключить к Revit его не получается.

Порядок действий

  1. Создание проекта Visual Studio
  2. Написание кода и его компиляция
  3. Создание addin-файла и подключение его к Revit

Создание проекта для плагина

Запустим Visual Studio и создадим новый проект на шаблоне "Библиотека классов .NET Framework":

Создание нового проекта
Создание нового проекта

Далее подгрузим ссылки на RevitAPI и RevitAPIUI. Это стандартные библиотеки, используемые во всех Revit-плагинах.

1. В правой части окна в панели "Обозреватель решений" кликаем правой кнопкой мыши (далее — ПКМ) на строку "Ссылки", жмём "Добавить ссылку":

Заходим в окно добавления ссылок
Заходим в окно добавления ссылок

2. В появившемся в окне жмём "Обзор" и переходим в папку C:\Program Files\Autodesk\Revit 2023 (версия Revit может отличаться):

Переходим в C:\Program Files\Autodesk\Revit 2023
Переходим в C:\Program Files\Autodesk\Revit 2023

3. Находим файлы RevitAPI.dll, RevitAPIUI.dll, выделяем их и жмём "Добавить":

Добавляем ссылки
Добавляем ссылки

4. Затем в менеджере ссылок ставим галочки рядом с этими файлами и добавляем их в проект:

-5

Теперь в нашем проекте есть ссылки на Revit API, и мы можем использовать его в нашем коде, а Visual Studio поймёт, что мы от неё хотим. Остался небольшой штрих (лучше не забывать про него, иначе папка с итоговой dll разрастётся довольно сильно).

В Обозревателе решений раскрываем список ссылок, по очереди выделяем их и в свойствах "Копировать локально" ставим False:

-6

Теперь можно начинать писать код.

Написание пользовательской команды

В этой статье мы разберём создание пользовательской команды, которая появится в меню "Надстройки" — "Внешние инструменты". Потом для этой команды можно будет создать кнопку в интерфейсе Revit или отдельную панель.

Чтобы Revit понял, что мы пишем именно внешнюю команду, а не вспомогательный класс или что-то ещё, нам надо реализовать интерфейс IExternalCommand. Для этого к имени класса добавим " : IExternalCommand", что означает, что наш класс будет наследовать этот интерфейс:

public class FirstRevitCommand : IExternalCommand

Visual Studio подсветит нам красным наименование интерфейса. Посмотрим, в чём дело:

Не удалось найти тип или имя пространства имён
Не удалось найти тип или имя пространства имён

Дело в том, что в начале файла надо было добавить using Autodesk.Revit.UI;, то есть показать программе, что в этом файле мы используем всё, что есть в этом файле ссылки в данном пространстве имён. В прочем, можно и не дописывать руками: жмём Alt+Enter или Ctrl+., как и сказано во всплывающей подсказке и Visual Studio сама предложит исправить ошибку.

После исправления текст останется красным, вновь наведём и вновь посмотрим предложенные решения:

-8

Дело в том, что наследуя какой либо интерфейс, мы обязаны реализовать всего его методы. В данном случае метод один: Execute, что и логично: команда должна знать, как её исполнять. Реализуем интерфейс.

Далее используем тот код, который мы уже написали в статье про макросы

Скопируем его и вставим внутрь метода Execute вместо того кода, который был создан Visual Studio при реализации интерфейса:

UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;
Reference myRef = uidoc.Selection.PickObject(ObjectType.Element, "Выберите элемент для вывода его Id");
Element element = doc.GetElement(myRef);
ElementId id = element.Id;
TaskDialog.Show("Hello world!", id.ToString());

У нас появятся 2 ошибки:

-9

Разберёмся с ними. И так, первая — программа ругается на переменную uidoc. Дело в том, что внутри команды к текущему документу надо обращаться через переменную commandData (которую мы передаём в метод Execute):

UIDocument uidoc = commandData.Application.ActiveUIDocument;

А проблема с методом Execute в том, что тип возвращаемого значения у него Result, а наш метод пока ничего не возвращает. Допишем в конце:

return Result.Succeeded;

то есть скажем коду, что в данном случае, если он дошёл до этого места при исполнении, то результат выполнения — успешный.

Добавим ещё немного кастомизации в вывод итогового сообщения и получим следующий результат:

-10

Но это ещё не всё. Все надстройки для Revit должны иметь уникальный идентификатор (Guid), совпадающий в коде и в addin-файле, а также атрибут настроек транзакции.

Чтобы добавить Guid, добавим следующую строку в начало класса:

static AddInId addinId = new AddInId(new Guid("0F296157-A2DC-4532-BB1B-6D6D3462F15A"));

Guid 0F296157-A2DC-4532-BB1B-6D6D3462F15A — это случайный Guid моего плагина. Вам нужно сделать свой, таким образом: Средства — Создать Guid:

Копируем Guid в буфер обмена
Копируем Guid в буфер обмена

Скопировав Guid, вставляем его в код вместо моего, не забыв убрать фигурные скобки в начале и в конце.

Чтобы добавить атрибут транзакции, добавим строку

[Autodesk.Revit.Attributes.TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]

перед классом.

Итоговый результат:

-12

Код можно скомпилировать (Сборка — Собрать решение) и получить итоговую DLL по адресу, где мы сохранили проект, в папках bin/Debug.

Создание addin-файла

Этот шаг вызывает больше всего затруднений у новичков (и не только новичков). Давайте подробно разбираться.

Для начала нам нужен addin-файл. Это обычный файл блокнота с расширением addin. Обычно его сохраняют один раз и добавляют в шаблон нового проекта Visual Studio, либо создают на основе существующего.

Итак, создадим *.txt файл и вставим в него следующий код

<RevitAddIns>
<AddIn Type="Command">
<Name>FirstRevitCommand</Name>
<Assembly>FirstRevitPlugin.dll</Assembly>
<AddInId>0F296157-A2DC-4532-BB1B-6D6D3462F15A</AddInId>
<FullClassName>FirstRevitPlugin.FirstRevitCommand</FullClassName>
<Text>Моя первая команда</Text>
<VendorId>MyId</VendorId>
<VendorDescription></VendorDescription>
</AddIn>
</RevitAddIns>

В строку AddInIn вставим наш Guid из предыдущего пункта (в точном соответствии с тем, который в коде).

Переименуем файл в FirstRevitPlugin.addin и перенесём в папку с проектом Visual Studio. Добавим файл к проекту:

ПКМ на имя решения — Добавить — Существующий элемент
ПКМ на имя решения — Добавить — Существующий элемент

Присоединим addin-файл и откроем его в Visual Studio. Благодаря подсветки синтаксиса убедимся, что всё хорошо, все открывающие и закрывающие угловые скобки на месте.

Рассмотри подробнее поля файла:

  • AddIn Type="Command"

Варианты: Command, Application. В нашем случае это команда, не приложение.

  • <Name>FirstRevitCommand</Name>
  • <Assembly>FirstRevitPlugin.dll</Assembly>
  • <AddInId>0F296157-A2DC-4532-BB1B-6D6D3462F15A</AddInId>

Имя плагина, путь к сборке и Guid. В данном случае мы скопируем dll и addin файлы в одну папку, но иногда это не так, и тогда нужно указывать полный или краткий (только по вложенным папкам) путь. Guid же должен точно соответствовать коду.

  • <FullClassName>FirstRevitPlugin.FirstRevitCommand</FullClassName>

Это важная строка. Тут мы указываем полное имя класса с именем его пространства имён (namespace) через точку:

Формат строки: Namespace.ClassName. Должно быть точное соответствие
Формат строки: Namespace.ClassName. Должно быть точное соответствие
  • <Text>Моя первая команда</Text>
  • <VendorId>MyId</VendorId>
  • <VendorDescription></VendorDescription>

Тут мы прописываем имя команды в списке команд, а также описание разработчика, которое появится один раз в окне загрузки внешней команды.

Я очень рекомендую править addin-файл в Visual Studio, чтобы избежать ошибок в связи с отсутствующими скобками. Обычно первые попытки с новым addin-файлом вызывают ошибки при подключении плагина, так что наберитесь терпения и будьте внимательны.

Подключение плагина к Revit

Скопируем addin-файл и dll с плагином в папку C:\ProgramData\Autodesk\Revit\Addins\2023

Запустим Revit. При запуске появится вот такое окно:

-15

Смело жмём "Всегда загружать" и открываем любой файл

На вкладке "Надстройки" появится кнопка "Внешние инструменты", а при раскрытии — наша команда:

-16

Запустим её:

-17

Мы ничего не забыли, всё отлично работает!

Надеюсь, у вас получится достичь того же результата и победить все возникающие по пути ошибки. А в следующей статье мы продолжим изучать основы языка C#.

-18