Всем привет! В сегодняшней статье разберём важную часть создания плагинов для Revit: создание панелей и кнопок для плагинов.
Теория
Мы можем размещать свои кнопки на панели "Надстройки", либо создавать свои собственные панели. Группирование кнопок может быть самым разнообразным: обычная кнопка, кнопка с выпадающим списком других кнопок. Мы можем добавлять на панель разделители, поля для ввода текста и выпадающие списки с данными. Также можно создать прикрепляемую панель (как панель Свойств или Диспетчер проекта). Описывающие все эти вещи классы находятся в пространстве имён Autodesk.Revit.UI. Сегодня разберём самую простую часть: добавление обычной кнопки.
Практика
Мы уже научились создавать внешнюю команду и подключать её к Revit. Напомню, что команда реализует интерфейс IExternalCommand. Для создания приложения необходимо реализовать интерфейс IExternalApplication, а также немного откорректировать addin-файл.
Кликнем правой кнопкой на проект в Visual Studio и создадим новый класс:
Выберем "Класс" и зададим ему имя, затем добавим его в проект.
Я настоятельно советую не давать классам имена по умолчанию (Class1), не давать неочевидные имена, а также старайтесь не давать имена, совпадающие с именами классов в RevitAPI (чтобы избежать дублирования ссылок в будущем).
В классе реализуем интерфейс:
internal class RevitApplication : IExternalApplication
Слова IExternalApplication подсветятся красным. Поставьте туда курсор и нажмите Ctrl-Ю или Alt-Enter. Вам предложат сначала добавить директиву using, а затем реализовать интерфейс.
Метод OnShutdown мы оставим пустым (просто напишите return Result.Succeeded;), а с методом OnStartup мы поработаем:
В конце статьи будет ссылка на гитхаб с кодом, а пока рассмотрим, что же мы тут сделали:
В строке 25 мы создали вкладку, а в строке 26 — панель на ней. Затем мы вызвали метод AddButon().
В этот метод мы передаём панель со строки 25, имя кнопки, путь к сборке (dll-файлу), полное квалифицированное имя класса для команды на кнопке, и всплывающую подсказку к кнопке.
Неочевидны тут 3 момента:
1. Путь к сборке. Тут мы схитрили, и на строке 22 получили путь сборки. Куда бы мы ни перенесли файл, эта строка будет возвращать нужный нам путь. Удобно
2. Полное квалифицированное имя класса. Тут всё просто: ИмяНэймспэйса.ИмяКласса. Смотрим нашу команду:
Можно сделать ещё круче, и вместо строки в кавычках написать
nameof(FirstRevitPlugin.FirstRevitCommand)
В чём смысл? При автопереименовании класса (по горячим клавишам Ctrl-RR) переименуются и все ссылки на него, в том числе и такая. А строка в кавычках не изменится и даст ошибку.
3. Добавление изображения.
Раньше я клал изображение рядом с dll и давал ссылку на файл. Это неудобно, может привести к исключениям при исчезновении файла, а ещё хитрый пользователь может потом поменять картинку к кнопке. Мы поступим по другому:
Добавим к проекту папку Resources:
Затем откроем эту папку в проводнике, положим туда файл изображения размером 32х32 (возьмите любое желаемое изображение или нарисуйте его), а затем добавим в эту папку Существующий элемент (на одну строку выше от добавления папки) — наше изображение.
Строка 40 в коде добавляет ссылку на изображение.
Важный нюанс: чтобы изображение попало в dll, надо зайти в его свойства, и поставить Действия при сборке: Resource.
И не забудьте добавить новый AddinId (строка 18)
Корректировка addin-файла
Addin-файл является частью нашего решения. Зайдём в него и кое-что поправим:
Принципиально важно заменить AddinId, имя класса (на имя класса приложения) и тип надстройки.
Собираем проект и переносим dll и addin-файл в папку C:\ProgramData\Autodesk\Revit\Addins\2023. Включаем Revit:
Итоговый код в моём репозитории на GitHub
Надеюсь, эта статья была вам полезной. Пробуйте воспроизвести, добавляйте свои элементы (ToggleButton, SplitButton). Пишите, что у вас получилось в комментарии или телеграм-канал. Всем успехов в изучении Revit API!