Серия «Автоматизация для Autodesk Revit»

1.4. Автоматизация для Autodesk Revit. Подготовка файла-манифеста

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов

Для того, чтобы плагин загружался при запуске Revit - для него необходимо подготовить файл-манифест.

Файл-манифест - это XML-файл, сохраненный с расширением .addin и содержащий основную информацию о плагине - путь к решению, информацию о разработчике, общую справочную информацию и т.д.

Форму файла-манифеста можно найти на сайте Autodesk - например - по ссылке.

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>HelloWorld</Name>
<FullClassName>HelloWorld.HelloWorld</FullClassName>
<Text>HelloWorld</Text>
<Description>Show Hello World.</Description>
<VisibilityMode>AlwaysVisible</VisibilityMode>
<Assembly>C:\Samples\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
<AddInId>239BD853-36E4-461f-9171-C5ACEDA4E723</AddInId>
<VendorId>ADSK</VendorId>
<VendorDescription>Autodesk, Inc, www.autodesk.com</VendorDescription>
</AddIn>
</RevitAddIns>

<AddIn Type="Application"> - Тип плагина - приложение. Тип "Command" - ссылка на внешнюю команду
<Name> - имя приложения для использования внутри Revit
<FullClassName> - Ссылка на класс Application в разрабатываемом проекте в формате Namespace.Application. Для внешней команды - ссылка должна указывать на класс Command
<Text> - Название внешней команды. В случае добавления Application - поле исключается
<Description> - Описание внешней команды во всплывающем сообщении. В случае добавления Application - поле исключается
<VisibilityMode> - настройка видимости внешней команды. При добавлении Application - поле исключается
<Assembly> - Полный путь к решению для приложения
<AddInId> - Уникальный ID сборки. Можно получить в VisualStudio. Для этого необходимо дважды щелкнуть левой кнопкой на раздел Properties в обозревателе решений и затем нажать кнопку "Сведения о сборке"

1.4. Автоматизация для Autodesk Revit. Подготовка файла-манифеста Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Длиннопост

Получаем GUID сборки

<VendorId> - Идентификатор разработчика ПО. Если разработчик внесен в перечень официальных разработчиков Autodesk - идентификатор будет отображаться при загрузке плагина, а плагин не будет требовать подтверждение о загрузке при каждом запуске Revit.
<VendorDescription> - Описание разработчика ПО. Например ссылка на сайт или другие контакты разработчика

1.4. Автоматизация для Autodesk Revit. Подготовка файла-манифеста Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Длиннопост

Пример заполненного файла-манифеста

После подготовки файла-манифеста, он размещается в одном из двух мест:
▻C:\ProgramData\Autodesk\Revit\Addins\ - центральная папка для размещения манифестов
▻C:\USERS\...\AppData\Roaming\Autodesk\Revit\Addins\ - локальная папка для манифестов у конкретного пользователя
Манифест размещается в папке, соответствующей версии Revit.

Если Манифест был описан правильно - при запуске Revit появится сообщение с вопросом о подтверждении загрузки:

1.4. Автоматизация для Autodesk Revit. Подготовка файла-манифеста Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Длиннопост

Подтверждение загрузки плагина

После подтверждения загрузки - будут созданы вкладки и панели, прописанные в классе Application. Плагин будет готов к работе

1.4. Автоматизация для Autodesk Revit. Подготовка файла-манифеста Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Длиннопост
Показать полностью 4

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов.

Добавление элементов: группы кнопок

Тип 1. RadioButtonGroup

Группа RadioButtonGroup в общем плане представляет собой чек-бокс, в котором необходимо выбрать только один вариант из представленных (самый простой вариант - выбор Да/Нет)

Группа создается с помощью метода AddItem() элемента панели. В качестве аргумента принимает элементы RadioButtonGroupData. Элемент RadioButtonGroupData создается с помощью конструктора, который принимает одну строку в качестве аргумента - это внутреннее имя, которое будет использоваться при работе Revit:

RadioButtonGroup rbg = panel.AddItem(new RadioButtonGroupData("radioGroup")) as RadioButtonGroup;

Далее необходимо создать и добавить в группу кнопки. Создание кнопок для группы производится с помощью конструктора ToggleButtonData, который принимает в себя те же аргументы, что и обычная PushButton

ToggleButtonData tb1 = new ToggleButtondata("revitName","interfaceName","dllLocation","Namespace.ClassCommand")

Если группа используется в качестве чек-бокса и от кнопок не требуется выполнение каких-либо команд - при создании кнопок не указываются путь к исполнительному dll и ссылка на класс Command

ToggleButtonData tb1 = new ToggleButtondata("revitName","interfaceName")

Также для кнопки доступны все свойства, доступные для обычной PushButton

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

rbg.AddItem(rgb1);

Можно получить выбранный вариант с помощью метода Current у элемента группы

Внутри группы нельзя создавать разделители между кнопками, но допускается создание разделителя на панели между двумя группами RadioButtonGroup.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Первая и третья кнопка - с заданной командой для выполнения. Вторая и четвертая - просто чекбокс. Видно выбранные варианты.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример создания кнопки и группы

Тип 2. PulldownButton

Группа PulldownButton представляет собой раскрывающийся список, который содержит внутри несколько объектов типа PushButton. При этом вся группа имеет общий заголовок, нажав на который открываются варианты кнопок для запуска.

Группа PulldownButton создается с помощью метода AddItem() панели инструментов, который принимает элемент PullDownButtonData, который создается с помощью конструктора, принимающего две строки в качестве аргументов. Первая строка - внутреннее имя, используемое при работе Revit. Вторая строка - заголовок, который будет отображаться на панели.

Кнопки в группу добавляются с помощью метода AddItem группы. Добавлять можно элементы PushButton. Процесс создания кнопок описан в части 2.

Кнопки в группе могут быть разделены разделителями. Разделитель добавляется методом AddSeparator() группы.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример группы PullDownData с двумя кнопками и разделителем между ними

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример кода для создания PullDownButton с добавлением в группу двух кнопок и разделителя между ними

Тип 3. SplitButton

Группа SplitButton полностью повторяет тип PulldownButton, за исключением того, что вместо общего заголовка для группы, отображается последняя использованная команда. Также как и PulldownButton хранит в себе несколько вариантов кнопок, которые могут быть отделены друг от друга разделителями.

Процесс добавления группы на панель и процесс добавления в нее кнопок идентичен PullDownButton, за исключением, что на панель добавляется элемент SplitButton, для создания которого используется конструктор SplitButtonData.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример SplitButton. Последней запускалась вторая кнопка

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример создания элемента SplitButton на панели с двумя кнопками и разделителем между ними

Добавление элементов: элементы для сбора пользовательских данных

Тип 1. TextBox

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

Для того, чтобы измененное значение было обновлено в алгоритме - пользователь должен нажать Enter после ввода текста. Также обновление может быть произведено нажатием на кнопку рядом с полем.

Также в коде должно быть прописано свойство, отвечающее за обновление значения по нажатию Enter

TextBox добавляется на панель инструментов с помощью метода AddItem() панели, который принимает в качестве аргумента TextBoxData с помощью конструктора, который в свою очередь принимает в качестве аргумента одну строку - внутреннее имя блока для использования в работе Revit.

Имеет несколько основных свойств:

textBox.Value = "Hello World" - свойство задает или выводит значение, введенное в поле
textBox.ToolTip= "TextBox" - всплывающая подсказка, возникающая при наведении на поле
textBox.Width = "TextBox" - задает ширину поля текстового блока. Поддерживает значение Double.
textBox.Image = new BitmapImage(new Uri(@"16.png")) - задание иконки для кнопки обновления данных. Поддерживаются только иконки 16х16px
textBox.ShowImageAsButton = true - включает отображение загруженной иконки в качестве кнопки обновления данных
textBox.EnterPressed += CallBackOfTextBox - свойство для обновления значения блока по нажатию Enter. Для реализации - необходимо отдельно прописать событие, которое будет происходить при нажатии. Событие создается ниже, за границами события OnStartUp. Intellisense может подсказать реализацию.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Текстовое поле на панели и сообщение при нажатии на кнопку

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример процесса создания и настройки текстового поля на панели

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Описание события при нажатии. Будет выведено диалоговое окно, в котором будет отображено новое значение, введенное пользователем

Тип 2. ComboBox

Элемент ComboBox представляет собой раскрывающийся список, в котором можно выбрать один из добавленных в него элементов. По назначению похож на группу RadioButtonGroup, но на элементы не может быть завязано исполнение алгоритма. Может использоваться для выбора сценария отработки скрипта.

Элемент добавляется на панель с помощью метода AddItem() панели, который в качестве аргумента принимает элемент ComboBoxData, созданный с помощью конструктора, который в свою очередь принимает одну строку - внутреннее имя для работы Revit.

После создания бокса необходимо создать и добавить в него члены бокса. Элементы ComboBoxMember создаются на основе элементов ComboBoxMemberData, созданных конструктором, использующим две строки - внутреннее имя для Revit и имя члена бокса, которое будет отображаться при выборе.

Для каждого члена бокса можно добавить иконку размером 16х16px описанным ранее способом.

После создания и задания свойств - члены бокса добавляются в бокс с помощью метода AddItem() бокса. Также в бокс могут быть добавлены разделители между членами.

Получить выбранный член бокса можно с помощью метода Current() бокса.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример бокса. Выбрано второе значение.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример создания бокса с тремя членами. Между вторым и третьим вставлен разделитель. Всем членам бокса задана иконка

Элементы в скрытой области панели - SlideOut

На панель может быть добавлена область SlideOut, которая представляет собой скрывающуюся область на панели. Для раскрытия этой области необходимо нажать на кнопку в правом нижнем углу панели.

Скрытая область создается на панели с помощью метода AddSlideout(). Все элементы, добавленные на панель после создания скрытой области, автоматически добавляются в нее.

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

SlideOut в свернутом состоянии

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

SlideOut в развернутом состоянии

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Slideout добавлен на панель, после чего добавлено текстовое поле

Группировка элементов на панели

Помимо индивидуального добавления на панель, элементы могут добавляться в составе группы. Число элементов в группе от 2 до 3.

В этом случае добавление элементов на панель производится с помощью метода AddStackedItems() панели. Данный метод принимает в себя в качестве аргументов от двух до трех элементов RibbonItemData() - это конструкторы, с помощью которых создаются элементы. Создание конструкторов для всех типов элементов было рассмотрено ранее (PushButtonData(),TextBoxData() и т.д.). При этом для элементов RibbonItemData() доступны все свойства, которые были доступны при создании элементов на панели индивидуально.

Кнопки в такой группе поддерживают иконку размером 16х16px

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Группа из двух кнопок на панели

1.3. Автоматизация для Autodesk Revit. Добавление групп кнопок и прочих элементов на панель инструментов. Скрытие и группировка элементов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пример создания двух кнопок с добавлением на панель в виде группы

Показать полностью 16

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов

Часть 1 - Создание нового проекта плагина, подготовка классов Application и Command

Запуск плагинов в Revit осуществляется с помощью кнопок, размещенных на панелях инструментов. Панели инструментов в свою очередь размещаются на вкладках.

Код, отвечающий за размещение кнопок на панели инструментов пишется в классе Application - в методе OnStartUp. С помощью аргумента application данного метода производится обращение к графическому интерфейсу Revit.

Добавление кнопки на панель инструментов производится ступенчато:
▻ Создается вкладка для панели инструментов (класс элементов RibbonTab)
▻ Создается панель инструментов для размещения элементов панели(класс элементов RibbonPanel)
▻ Создаются и размещаются элементы панели (кнопки, раскрывающиеся списки, группы кнопок и т.д.)

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Структура панели инструментов Revit

Создание вкладки

Создание новой вкладки на панели инструментов выполняется с помощью метода CreateRibbonTab аргумента application. В качестве аргумента данный метод принимает название вкладки в виде строки.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Создание вкладки на панели инструментов Revit

В случае, если вкладка с таким именем уже существует - при запуске Revit возникнет ошибка и плагин не будет загружен. Поэтому перед созданием вкладки необходимо убедиться, что вкладка с таким именем ранее не была создана. Проще всего данную проверку можно выполнить с использованием конструкции TRY - CATCH. В этом случае будет выполнена попытка создания вкладки - если вкладка ранее была создана - этап создания будет пропущен.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Попытка создания вкладки. Если вкладка с таким именем уже существует - в блоке TRY произойдет ошибка и он не будет выполнен

Создание панели

После того, как вкладка была создана - создается панель инструментов для размещения кнопок и других элементов. Создание новой панели инструментов на вкладке выполняется с помощью метода CreateRibbonPanel аргумента application. В качестве аргумента данный метод принимает название вкладки, где будет размещена панель, и название панели в виде строки. В дальнейшем - для добавления кнопок на панель - будет необходимо оперировать элементом панели. Для этого создание новой панели производится с завязкой на параметр с типом данных RibbonPanel.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Создаем панель инструментов TestPanel на вкладке TestTab

По аналогии с вкладкой - если панель инструментов с таким именем уже существует на вкладке - произойдет ошибка и плагин не будет запущен. Поэтому для панели инструментов также необходимо проводить проверку на создание. Конструкция TRY - CATCH в данном случае не подходит, так как нет возможности выбрать панель инструментов только по имени. В любом случае необходимо производить перебор всех панелей на вкладке и проверять соответствие имен.

Для проверки наличия панели инструментов на вкладке выполняются следующие действия:
▻ Создается список панелей, присутствующих на вкладке
▻ Создается пустой параметр панели с типом данных RibbonPanel
▻ Выполняется перебор всех найденных на вкладке панелей с помощью цикла foreach. Имена панелей сравниваются с целевым именем

Если при переборе найдена панель с целевым именем - она принимается в качестве элемента для дальнейшей работы. В случае, если панель с целевым именем по итогу перебора не найдена - созданный параметр останется пустым и далее может быть создана новая панель с целевым именем.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Проверка наличия панели на вкладке с последующим созданием новой панели

После создания панели инструментов - на ней могут быть размещены элементы.

Основные элементы на панели

Основными элементами, которые могут быть добавлены на панель, являются:
▻ Кнопка - PushButton - основной инструмент выполнения кода в классе Command.

▻ Область с текстом - TextBox - позволяет пользователю ввести пользовательский текст. Не является исполнительным элементом, но может служить для настройки сценариев отработки скрипта.
▻ Раскрывающийся список - ComboBox - также как и TextBox, не является исполнительным элементом, но позволяет пользователю выбрать один из предложенных в списке вариантов. Также может служить для настройки сценариев работы.
▻ Группы кнопок - RadioButtonGroup, PullDownButtonGroup, SplitButtonGroup - группировки кнопок, отличающиеся внешним видом на панели инструментов.

RadioButtonGroup - создает ограниченную область на панели, в рамках которой размещаются кнопки. Группа может использоваться как чек-бокс - в рамках группы можно выбрать только один активный элемент (например выбор Да/Нет). Внутри данной группы нет возможности вставки разделителей, но разделитель может быть вставлен на панель между двумя такими группами.

PullDownButton - представляет собой большую кнопку на панели с общим заголовком, при нажатии на которую раскрывается список, в котором можно выбрать один из вариантов кнопки для исполнения. Кнопки в такой группе могут быть разделены разделителями.

SplitButton - похожа на PullDownButton, за тем исключением, что по умолчанию на панели в такой группе отображается один из элементов группы - первый из созданных или последний из использованных.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Разновидности элементов на панели инструментов

Добавление элементов: кнопка

Кнопка на панели инструментов создается с помощью метода AddItem() элемента панели. В качестве аргумента принимает элементы PushButtonData. Элемент PushButtonData создается с помощью конструктора, который принимает 4 строки в качестве аргументов:

PushButton pb = panel.AddItem(new PushDataButton("RevitName","InterfaceName","DLL Path","NameSpace.CommandClass")) as PushButton;

RevitName - внутреннее имя кнопки, которое используется внутри Revit. Имя должно быть выполнено строго латинскими буквами
InterfaceName - имя кнопки, которое будет отображаться в интерфейсе
DLL Path - путь к DLL-файлу сборки. Путь к файлу сборки может быть получен в классе Application - следующим образом:
string assemblyPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
Путь к сборке лучше получить до описания конструкций панели
NameSpace.CommandClass - путь к классу Command, исполнение которого будет производится данной кнопкой. NameSpace - Пространство имен текущего проекта, CommandClass - Имя класса Command.

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Пространство имен проекта и имя класса Command

Для элемента кнопки можно задать несколько основных свойств:
▻Всплывающая подсказка - сообщение, которое будет выводиться при наведении курсора. ToolTip - краткое описание, возникает сразу после наведения.
LongDescription - более подробное описание, возникает после того как курсор задержится на кнопке на несколько секунд
pb.ToolTip = "Описание всплывающей подсказки";
pb.LongDescription = "Описание всплывающей подсказки";
▻Справка - можно задать ссылку, которая будет открываться при нажатии F1 при наведенном ContextualHelp contextHelp = new ContextualHelp(ContextualHelpType.Url, "Ссылка на страницу справки");
▻Большая и малая иконки - кнопки поддерживают добавление иконок с размером 32х32 px для большой и 16х16 px для маленькой. Файл изображение должен быть в формате PNG
pb.Image = new BitmapImage(new Uri(@"dev\\16.png"));
pb.LargeImage = new BitmapImage(new Uri(@"dev\\32.png"));

ВАЖНО: Для возможности загрузки иконок - в проект должна быть загружена ссылка на библиотеку PresentationCore.dll (Если на компьютере установлен .Net Framework v3.0 - можно найти в папке: C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0), а также задана ссылка на пространство имен using System.Windows.Media.Imaging;

1.2. Автоматизация для Autodesk Revit. Создание панели инструментов. Добавление кнопки на панель инструментов Программирование, Revit, Csharp, САПР, Инженерия, Visual Studio, Гайд, Длиннопост

Процесс добавления кнопки на панель и задание значений свойств

Показать полностью 8
Отличная работа, все прочитано!