Найти тему

Создание прикрепляемой панели (DockablePane) в Revit

Оглавление

Всем привет! Сегодня научимся создавать новые панели по типу Свойств или обозревателя проекта. Тема статьи — только регистрация панели, поэтому мы создадим простую панель для вывода сообщения, без функционала.

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

Введение

Чтобы создать панель и управлять её видимостью, нам нужно минимально создать 4 класса:

  • Application, где мы зарегистрируем панель и добавим команду для управления видимостью
  • Command, которая будет включать-выключать отображение панели
  • Page (не Window), где будет хранится собственно отображение страницы
  • DockablePaneProvider, класс-наследник IDockablePaneProvider, в котором мы настроим нашу панель.

DockablePaneProvider мы реализуем обобщённый, чтобы он позволял управлять любыми панелями.

Page

Создадим простейшую страницу в стиле Hello world!:

Тут думаю всё понятно, если не понятно, читайте мою подборку про WPF.

Command

Создадим команду, которая будет менять видимость нашей панели:

-2

DockablePaneId должен совпадать с тем, что будет при регистрации панели. Его можно вынести в отдельный класс.

DockablePaneProvider

А теперь самое интересное и сложное. Создадим класс для регистрации панели:

-3

В чём тут суть:

Интерфейс IDockablePaneProvider имеет один метод SetupDockablePane. Он принимает DockablePaneProviderData, но при этом не вызывается непосредственно — мы передаём наш DockablePaneProvider при регистрации панели, при этом саму DockablePaneProviderData мы при регистрации передавать не обязаны. Какой будет наша панель — зависит от того, как будет модифицирована переменная data в методе SetupDockablePane. Поэтому я применил такой финт: я добавил DockablePaneProviderData как параметр конструктора, а в методе SetupDockablePane просто переношу значения свойств.

Application

-4

Давайте по порядку, что теперь будет происходить при запуске Revit:

  1. Вызовется приватный метод SetupDockablePane внутри моего класса Application
  2. Внутри него мы создаём экземпляр DockablePaneProviderData, куда передаём в качестве FrameworkElement нашу страницу.
  3. Затем мы вызываем метод RegisterDockablePane, вызываем на UIControlledApplication из OnStartup.
  4. Этому методу мы передаём dockablePaneId, заголовок нашей панели и написанный нами DockablePaneProvider.
  5. Провайдер получает при создании указанную нами DockablePaneProviderData.
  6. Далее Revit вызывает SetupDockablePane из провайдера, его переменная data получает наши значения, и мы видим нашу панель

Также в коде я создаю панель на ленте для кнопки, но тут уже нет ничего нового:

-5

Заключение

Выполняем сборку, добавляем addin-файл и смотрим результат:

-6

У нас получилось создать пользовательскую панель в Revit!

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

Не забывайте подписываться на мой телеграм-канал о Revit API и до новых встреч!

-7