В сегодняшней статье разберём создание плагина для Revit с нуля. Для этого нам потребуется предустановленный Revit, Visual Studio (инструкция по установке), и, собственно, алгоритм, который будет выполнять наш плагин. Статья может быть полезна в том числе и тогда, когда вы написали плагин, но подключить к Revit его не получается.
Порядок действий
- Создание проекта Visual Studio
- Написание кода и его компиляция
- Создание addin-файла и подключение его к Revit
Создание проекта для плагина
Запустим Visual Studio и создадим новый проект на шаблоне "Библиотека классов .NET Framework":
Далее подгрузим ссылки на RevitAPI и RevitAPIUI. Это стандартные библиотеки, используемые во всех Revit-плагинах.
1. В правой части окна в панели "Обозреватель решений" кликаем правой кнопкой мыши (далее — ПКМ) на строку "Ссылки", жмём "Добавить ссылку":
2. В появившемся в окне жмём "Обзор" и переходим в папку C:\Program Files\Autodesk\Revit 2023 (версия Revit может отличаться):
3. Находим файлы RevitAPI.dll, RevitAPIUI.dll, выделяем их и жмём "Добавить":
4. Затем в менеджере ссылок ставим галочки рядом с этими файлами и добавляем их в проект:
Теперь в нашем проекте есть ссылки на Revit API, и мы можем использовать его в нашем коде, а Visual Studio поймёт, что мы от неё хотим. Остался небольшой штрих (лучше не забывать про него, иначе папка с итоговой dll разрастётся довольно сильно).
В Обозревателе решений раскрываем список ссылок, по очереди выделяем их и в свойствах "Копировать локально" ставим False:
Теперь можно начинать писать код.
Написание пользовательской команды
В этой статье мы разберём создание пользовательской команды, которая появится в меню "Надстройки" — "Внешние инструменты". Потом для этой команды можно будет создать кнопку в интерфейсе Revit или отдельную панель.
Чтобы Revit понял, что мы пишем именно внешнюю команду, а не вспомогательный класс или что-то ещё, нам надо реализовать интерфейс IExternalCommand. Для этого к имени класса добавим " : IExternalCommand", что означает, что наш класс будет наследовать этот интерфейс:
public class FirstRevitCommand : IExternalCommand
Visual Studio подсветит нам красным наименование интерфейса. Посмотрим, в чём дело:
Дело в том, что в начале файла надо было добавить using Autodesk.Revit.UI;, то есть показать программе, что в этом файле мы используем всё, что есть в этом файле ссылки в данном пространстве имён. В прочем, можно и не дописывать руками: жмём Alt+Enter или Ctrl+., как и сказано во всплывающей подсказке и Visual Studio сама предложит исправить ошибку.
После исправления текст останется красным, вновь наведём и вновь посмотрим предложенные решения:
Дело в том, что наследуя какой либо интерфейс, мы обязаны реализовать всего его методы. В данном случае метод один: 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 ошибки:
Разберёмся с ними. И так, первая — программа ругается на переменную uidoc. Дело в том, что внутри команды к текущему документу надо обращаться через переменную commandData (которую мы передаём в метод Execute):
UIDocument uidoc = commandData.Application.ActiveUIDocument;
А проблема с методом Execute в том, что тип возвращаемого значения у него Result, а наш метод пока ничего не возвращает. Допишем в конце:
return Result.Succeeded;
то есть скажем коду, что в данном случае, если он дошёл до этого места при исполнении, то результат выполнения — успешный.
Добавим ещё немного кастомизации в вывод итогового сообщения и получим следующий результат:
Но это ещё не всё. Все надстройки для 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, вставляем его в код вместо моего, не забыв убрать фигурные скобки в начале и в конце.
Чтобы добавить атрибут транзакции, добавим строку
[Autodesk.Revit.Attributes.TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
перед классом.
Итоговый результат:
Код можно скомпилировать (Сборка — Собрать решение) и получить итоговую 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) через точку:
- <Text>Моя первая команда</Text>
- <VendorId>MyId</VendorId>
- <VendorDescription></VendorDescription>
Тут мы прописываем имя команды в списке команд, а также описание разработчика, которое появится один раз в окне загрузки внешней команды.
Я очень рекомендую править addin-файл в Visual Studio, чтобы избежать ошибок в связи с отсутствующими скобками. Обычно первые попытки с новым addin-файлом вызывают ошибки при подключении плагина, так что наберитесь терпения и будьте внимательны.
Подключение плагина к Revit
Скопируем addin-файл и dll с плагином в папку C:\ProgramData\Autodesk\Revit\Addins\2023
Запустим Revit. При запуске появится вот такое окно:
Смело жмём "Всегда загружать" и открываем любой файл
На вкладке "Надстройки" появится кнопка "Внешние инструменты", а при раскрытии — наша команда:
Запустим её:
Мы ничего не забыли, всё отлично работает!
Надеюсь, у вас получится достичь того же результата и победить все возникающие по пути ошибки. А в следующей статье мы продолжим изучать основы языка C#.