Найти тему

Создание пользовательских панелей и кнопок в Revit

Оглавление

Всем привет! В сегодняшней статье разберём важную часть создания плагинов для 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 мы поработаем:

-4

В конце статьи будет ссылка на гитхаб с кодом, а пока рассмотрим, что же мы тут сделали:

В строке 25 мы создали вкладку, а в строке 26 — панель на ней. Затем мы вызвали метод AddButon().

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

Неочевидны тут 3 момента:

1. Путь к сборке. Тут мы схитрили, и на строке 22 получили путь сборки. Куда бы мы ни перенесли файл, эта строка будет возвращать нужный нам путь. Удобно

2. Полное квалифицированное имя класса. Тут всё просто: ИмяНэймспэйса.ИмяКласса. Смотрим нашу команду:

FirstRevitPlugin.FirstRevitPlugin
FirstRevitPlugin.FirstRevitPlugin

Можно сделать ещё круче, и вместо строки в кавычках написать

nameof(FirstRevitPlugin.FirstRevitCommand)

В чём смысл? При автопереименовании класса (по горячим клавишам Ctrl-RR) переименуются и все ссылки на него, в том числе и такая. А строка в кавычках не изменится и даст ошибку.

3. Добавление изображения.

Раньше я клал изображение рядом с dll и давал ссылку на файл. Это неудобно, может привести к исключениям при исчезновении файла, а ещё хитрый пользователь может потом поменять картинку к кнопке. Мы поступим по другому:

Добавим к проекту папку Resources:

-6

Затем откроем эту папку в проводнике, положим туда файл изображения размером 32х32 (возьмите любое желаемое изображение или нарисуйте его), а затем добавим в эту папку Существующий элемент (на одну строку выше от добавления папки) — наше изображение.

Строка 40 в коде добавляет ссылку на изображение.

Важный нюанс: чтобы изображение попало в dll, надо зайти в его свойства, и поставить Действия при сборке: Resource.

-7

И не забудьте добавить новый AddinId (строка 18)

Корректировка addin-файла

Addin-файл является частью нашего решения. Зайдём в него и кое-что поправим:

-8

Принципиально важно заменить AddinId, имя класса (на имя класса приложения) и тип надстройки.

Собираем проект и переносим dll и addin-файл в папку C:\ProgramData\Autodesk\Revit\Addins\2023. Включаем Revit:

Результат выполнения кода
Результат выполнения кода

Итоговый код в моём репозитории на GitHub

Надеюсь, эта статья была вам полезной. Пробуйте воспроизвести, добавляйте свои элементы (ToggleButton, SplitButton). Пишите, что у вас получилось в комментарии или телеграм-канал. Всем успехов в изучении Revit API!

-10