Расширения
Last updated
Last updated
Расширения — это эффективное средство разработки в экосистеме Dynamo. Они позволяют разработчикам управлять пользовательскими функциями на основе взаимодействия и логики Dynamo. Расширения можно разделить на две основные категории: расширения и расширения вида. Как видно из названия, расширение вида позволяет расширить пользовательский интерфейс Dynamo путем регистрации пользовательских элементов меню. Обычные расширения работают аналогично, за исключением пользовательского интерфейса. Например, можно создать расширение, которое будет записывать определенную информацию в консоль Dynamo. Для этого сценария не требуется настраиваемый пользовательский интерфейс, поэтому его можно выполнить с помощью расширения.
Мы возьмем пример SampleViewExtension из репозитория DynamoSamples на Github и выполним действия, необходимые для создания простого немодального окна, в котором отображаются активные узлы на графике в реальном времени. Для расширения вида требуется создать пользовательский интерфейс для окна и привязать значения к модели вида.
Окно расширения вида, созданное в соответствии с примером SampleViewExtension в репозитории Github.
Мы будем создавать пример с нуля, однако вы также можете скачать и собрать репозиторий DynamoSamples, чтобы опираться на него.
Репозиторий DynamoSamples: https://github.com/DynamoDS/DynamoSamples
В этом пошаговом руководстве мы будем ссылаться на проект SampleViewExtension, который находится в папке
DynamoSamples/src/
.
Расширение вида состоит из трех основных частей:
сборка, содержащая класс, который реализует IViewExtension
, а также класс, который создает модель вида.
файл .xml
, указывающий Dynamo, где следует искать эту сборку во время выполнения, и тип расширения.
файл .xaml
, который привязывает данные к графическому отображению и определяет внешний вид окна.
1. Создание структуры проекта
Начните с создания нового проекта Class Library
(Библиотека классов) с именем SampleViewExtension
.
Создайте новый проект, выбрав
File > New > Project
(Файл > Создать > Проект).Выберите
Class Library
(Библиотека классов).Присвойте проекту имя
SampleViewExtension
.Нажмите
Ok
.
В этом проекте нам потребуется два класса. Один класс будет реализовывать IViewExtension
, а другой, который реализует NotificationObject.
IViewExtension
, будет содержать все сведения о развертывании, загрузке, ссылке и удалении расширения. NotificationObject
будет предоставлять уведомления об изменениях в Dynamo, а IDisposable
будет обновлять количество при внесении изменений.
Файл класса с именем
SampleViewExtension.cs
, который будет реализовыватьIViewExtension
.Файл класса с именем
SampleWindowViewMode.cs
, который будет реализовыватьNotificationObject
.
Для использования IViewExtension
нам потребуется пакет NuGet WpfUILibrary. При установке этого пакета будут автоматически установлены пакеты Core, Services и ZeroTouchLibrary.
Выберите библиотеку WpfUILibrary.
Нажмите
Install
(Установить) для установки всех зависимых пакетов.
2. Реализация класса IViewExtension
В классе IViewExtension
мы определим, что происходит при запуске Dynamo, при загрузке расширения и при завершении работы Dynamo. В файл класса SampleViewExtension.cs
добавьте следующий код:
Класс SampleViewExtension
создает пункт меню, на который можно нажать, чтобы открыть окно, и подключает его к модели вида и окну.
public class SampleViewExtension : IViewExtension
SampleViewExtension
наследуется из интерфейса IViewExtension
и предоставляет все необходимое для создания пункта меню.
sampleMenuItem = new MenuItem { Header = "Show View Extension Sample Window" };
создает MenuItem (Пункт меню) и добавляет его в меню View
(Вид).
Пункт меню
sampleMenuItem.Click += (sender, args)
инициирует событие, которое откроет новое окно при нажатии пункта меню.
MainGrid = { DataContext = viewModel }
задает контекст данных для основной сетки в окне, ссылаясь на Main Grid
в создаваемом файле .xaml
.
Owner = p.DynamoWindow
назначает Dynamo владельцем всплывающего окна. Это означает, что новое окно находится в зависимости от Dynamo, поэтому при сворачивании, развертывании и восстановлении Dynamo те же действия будут выполняться с новым окном.
window.Show();
отображает окно, в котором заданы дополнительные свойства.
3. Реализация модели вида
Определив некоторые основные параметры окна, добавим логику для реагирования на различные события, связанные с Dynamo, а также поставим для пользовательского интерфейса задачу обновления данных в соответствии с этими событиями. Скопируйте следующий код в файл класса SampleWindowViewModel.cs
:
Эта реализация класса модели вида прослушивает CurrentWorkspaceModel
и инициирует событие при добавлении или удалении узла из рабочего пространства. При этом происходит изменение свойства, которое уведомляет пользовательский интерфейс или связанные элементы о том, что данные были изменены и их необходимо обновить. Метод получения ActiveNodeTypes
вызывает дополнительную вспомогательную функцию getNodeTypes()
. Эта функция проходит по всем активным узлам в рабочей области, заполняет строку, содержащую имена этих узлов, и возвращает эту строку в нашу привязку в файле XAML, чтобы она отобразилась в нашем всплывающем окне.
Теперь, когда определена основная логика расширения, мы зададим параметры отображения окна с помощью файла .xaml
. Нам нужно простое окно, в котором будет отображаться строка с помощью привязки свойства ActiveNodeTypes
в TextBlock
Text
.
Щелкните проект правой кнопкой мыши и выберите
Add > New Item...
(Добавить > Новый элемент).Выберите шаблон пользовательского элемента управления, который будет изменен для создания окна.
Присвойте новому файлу имя
SampleWindow.xaml
.Нажмите
Add
(Добавить).
В коде окна .xaml
нам потребуется привязать SelectedNodesText
к текстовому блоку. Добавьте следующий код в файл SampleWindow.xaml
:
Text="{Binding ActiveNodeTypes}"
привязывает значение свойства ActiveNodeTypes
в SampleWindowViewModel.cs
к значению TextBlock
Text
в окне.
Теперь инициализируем окно образца в файле резервной копии XAML C# SampleWindow.xaml.cs
. Добавьте следующий код в файл SampleWindow.xaml
:
Теперь можно приступать к сборке и добавлению расширения вида в Dynamo. Для регистрации выходного файла .dll
в качестве расширения Dynamo требуется файл xml
.
Щелкните проект правой кнопкой мыши и выберите
Add > New Item...
(Добавить > Новый элемент).Выберите файл XML.
Присвойте файлу имя
SampleViewExtension_ViewExtensionDefinition.xml
.Нажмите
Add
(Добавить).
Имя файла соответствует стандарту Dynamo для ссылки на сборку расширения: "extensionName"_ViewExtensionDefinition.xml
В файле xml
добавьте следующий код, указывающий Dynamo, где искать сборку расширения:
В этом примере сборка была создана в папке проекта Visual Studio по умолчанию. Замените целевое расположение <AssemblyPath>...</AssemblyPath>
на путь к сборке.
Наконец, скопируйте файл SampleViewExtension_ViewExtensionDefinition.xml
в папку расширений видов Dynamo, расположенную в каталоге установки Dynamo Core C:\Program Files\Dynamo\Dynamo Core\1.3\viewExtensions
. Важно отметить, что для extensions
и viewExtensions
существуют отдельные папки. Если разместить файл xml
в неправильной папке, во время выполнения может произойти сбой загрузки.
Файл
.xml
, скопированный в папку расширений видов Dynamo.
Это основная информация о расширениях видов. Более сложный пример можно найти в пакете DynaShape, проекте с открытым исходным кодом на GitHub. Пакет использует расширение вида, которое позволяет редактировать модель Dynamo в реальном времени.
Программу установки пакета для DynaShape можно скачать на форуме Dynamo: https://forum.dynamobim.com/t/dynashape-published/11666
Исходный код можно скопировать с сайта GitHub: https://github.com/LongNguyenP/DynaShape