Le estensioni sono un potente strumento di sviluppo nell'ecosistema di Dynamo. Consentono agli sviluppatori di gestire funzionalità personalizzate basate sulle interazioni e sula logica di Dynamo. Le estensioni possono essere suddivise in due categorie principali, ovvero estensioni ed estensioni delle viste. Come implica la denominazione, la framework dell'estensione della vista consente di estendere l'interfaccia utente di Dynamo registrando voci di menu personalizzate. Le estensioni standard funzionano in modo molto simile, meno l'interfaccia utente. Ad esempio, è possibile creare un'estensione che registra informazioni specifiche nella console di Dynamo. Questo scenario non richiede alcuna interfaccia utente personalizzata e pertanto potrebbe essere eseguito anche utilizzando un'estensione.
Seguendo l'esempio SampleViewExtension dal repository DynamoSamples su GitHub, illustreremo la procedura necessaria per creare una finestra non modale semplice che visualizzi i nodi attivi nel grafico in tempo reale. Per un'estensione della vista è necessario creare un'interfaccia utente per la finestra e associare i valori ad un modello di vista.
La finestra dell'estensione della vista è stata sviluppata seguendo l'esempio SampleViewExtension nel repository su GitHub.
Anche se costruiremo l'esempio da zero, è possibile anche scaricare e creare il repository DynamoSamples come riferimento.
Il repository DynamoSamples: https://github.com/DynamoDS/DynamoSamples
Questa simulazione farà riferimento in modo specifico al progetto denominato SampleViewExtension disponibile in
DynamoSamples/src/
.
Un'estensione della vista è costituita da tre parti essenziali:
Un assieme contenente una classe che implementa IViewExtension
e una classe che crea un modello di vista
Un file .xml
che indica a Dynamo dove deve cercare questo assieme in fase di esecuzione e il tipo di estensione
Un file .xaml
che associa i dati alla visualizzazione grafica e determina l'aspetto della finestra
1. Creazione della struttura del progetto
Iniziare creando un nuovo progetto Class Library
denominato SampleViewExtension
.
Creare un nuovo progetto selezionando
File > New > Project
.Selezionare
Class Library
.Assegnare al progetto il nome
SampleViewExtension
.Selezionare
Ok
.
In questo progetto, avremo bisogno di due classi. Una classe implementerà IViewExtension
e un'altra che implementerà NotificationObject.
IViewExtension
conterrà tutte le informazioni su come l'estensione verrà distribuita, caricata, utilizzata come riferimento ed eliminata. NotificationObject
fornirà notifiche per le modifiche in Dynamo e IDisposable
. Quando si verifica una modifica, il conteggio verrà aggiornato di conseguenza.
Un file di classe denominato
SampleViewExtension.cs
che implementeràIViewExtension
Un file di classe denominato
SampleWindowViewMode.cs
che implementeràNotificationObject
Per utilizzare IViewExtension
, è necessario il pacchetto NuGet WpfUILibrary. L'installazione di questo pacchetto comporta l'installazione automatica dei pacchetti Core, Services e ZeroTouchLibrary.
Selezionare WpfUILibrary.
Selezionare
Install
per installare tutti i pacchetti dipendenti.
2. Implementazione della classe IViewExtension
Dalla classe IViewExtension
determineremo cosa succede quando Dynamo viene avviato, quando l'estensione viene caricata e quando Dynamo viene chiuso. Nel file della classe SampleViewExtension.cs
, aggiungere il seguente codice:
La classe SampleViewExtension
crea una voce di menu selezionabile per aprire la finestra e collegarla al modello di vista e alla finestra.
La classe public class SampleViewExtension : IViewExtension
SampleViewExtension
ereditata dall'interfaccia IViewExtension
fornisce tutto ciò che è necessario per creare la voce di menu.
sampleMenuItem = new MenuItem { Header = "Show View Extension Sample Window" };
crea un elemento MenuItem e lo aggiunge al menu View
.
La voce di menu
sampleMenuItem.Click += (sender, args)
attiva un evento che aprirà una nuova finestra quando si fa clic sulla voce di menu.
MainGrid = { DataContext = viewModel }
imposta il contesto dei dati per la griglia principale nella finestra, facendo riferimento a Main Grid
nel file .xaml
che creeremo.
Owner = p.DynamoWindow
imposta il proprietario della finestra a comparsa su Dynamo. Ciò significa che la nuova finestra dipende da Dynamo, pertanto azioni quali la riduzione a icona, l'ingrandimento e il ripristino di Dynamo faranno sì che la nuova finestra segua lo stesso funzionamento.
window.Show();
visualizza la finestra in cui sono state impostate proprietà aggiuntive.
3. Implementazione del modello di vista
Ora che sono stati definiti alcuni parametri di base della finestra, verrà aggiunta la logica per rispondere a vari eventi correlati a Dynamo e verrà richiesto all'interfaccia utente di eseguire l'aggiornamento in base a tali eventi. Copiare il seguente codice nel file della classe SampleWindowViewModel.cs
:
Questa implementazione della classe del modello di vista è in ascolto di CurrentWorkspaceModel
e attiva un evento quando un nodo viene aggiunto o rimosso dall'area di lavoro. Ciò genera una modifica della proprietà che notifica all'interfaccia utente o agli elementi associati che i dati sono stati modificati e devono essere aggiornati. Viene chiamato il getter ActiveNodeTypes
che chiama internamente una funzione helper aggiuntiva getNodeTypes()
. Questa funzione esegue l'iterazione di tutti i nodi attivi nell'area di disegno, compila una stringa contenente i nomi di tali nodi e restituisce questa stringa al nostro binding nel file .xaml da visualizzare nella finestra a comparsa.
Con la logica di base dell'estensione definita, ora specificheremo i dettagli dell'aspetto della finestra con un file .xaml
. Tutto ciò che server è una semplice finestra che visualizzi la stringa tramite l'associazione della proprietà ActiveNodeTypes
in TextBlock
Text
.
Fare clic con il pulsante destro del mouse sul progetto e selezionare
Add > New Item...
.Selezionare il modello di controllo utente che verrà modificato per creare una finestra.
Assegnare un nome al nuovo file
SampleWindow.xaml
.Selezionare
Add
.
Nel codice della finestra .xaml
, dovremo associare SelectedNodesText
ad un blocco di testo. Aggiungere il seguente codice a SampleWindow.xaml
:
Text="{Binding ActiveNodeTypes}"
associa il valore della proprietà ActiveNodeTypes
in SampleWindowViewModel.cs
al valore TextBlock
Text
nella finestra.
Ora inizializzeremo la finestra di esempio nel file di backing .xaml C# SampleWindow.xaml.cs
. Aggiungere il seguente codice a SampleWindow.xaml
:
L'estensione della vista è ora pronta per essere creata e aggiunta a Dynamo. Dynamo richiede un file xml
per registrare il nostro output .dll
come estensione.
Fare clic con il pulsante destro del mouse sul progetto e selezionare
Add > New Item...
.Selezionare il file XML.
Assegnare un nome al file
SampleViewExtension_ViewExtensionDefinition.xml
.Selezionare
Add
.
Il nome del file segue lo standard di Dynamo per fare riferimento ad un assieme di estensione, come indicato di seguito: "extensionName"_ViewExtensionDefinition.xml
Nel file xml
, aggiungere il seguente codice per indicare a Dynamo dove cercare l'assieme di estensione:
In questo esempio, è stato creato l'assieme nella cartella di progetti di default di Visual Studio. Sostituire la destinazione <AssemblyPath>...</AssemblyPath>
con la posizione dell'assieme.
L'ultimo passaggio consiste nel copiare il file SampleViewExtension_ViewExtensionDefinition.xml
nella cartella viewExtensions di Dynamo, che si trova nella directory di installazione di Dynamo Core C:\Program Files\Dynamo\Dynamo Core\1.3\viewExtensions
. È importante notare che sono presenti cartelle separate per extensions
e viewExtensions
. Il posizionamento del file xml
nella cartella errata potrebbe causare errori di caricamento in fase di esecuzione.
Il file
.xml
copiato nella cartella viewExtensions di Dynamo
Questa è un'introduzione di base alle estensioni delle viste. Per un case study più sofisticato, vedere il pacchetto DynaShape, un progetto open source su GitHub. Il pacchetto utilizza un'estensione della vista che consente la modifica in tempo reale nella vista modello di Dynamo.
È possibile scaricare un programma di installazione del pacchetto per DynaShape dal forum di Dynamo: https://forum.dynamobim.com/t/dynashape-published/11666
Il codice sorgente può essere clonato da GitHub: https://github.com/LongNguyenP/DynaShape
.