Case study NodeModel - Interfaccia utente personalizzata
Last updated
Last updated
I nodi basati su NodeModel offrono una flessibilità e una potenza notevolmente superiori rispetto ai nodi zero-touch. In questo esempio, si porta il nodo griglia zero-touch al livello successivo aggiungendo un dispositivo di scorrimento integrato che imposta dimensioni casuali del rettangolo.
Il dispositivo di scorrimento consente di mettere in scala le celle rispetto alle relative dimensioni, in modo che l'utente non debba fornire un dispositivo di scorrimento con l'intervallo corretto.
Dynamo è basato sul modello di architettura del software Model-View-Viewmodel (MVVM) per mantenere l'interfaccia utente separata dal back-end. Quando si creano nodi zero-touch, Dynamo esegue l'associazione tra i dati di un nodo e la relativa interfaccia utente. Per creare un'interfaccia utente personalizzata, è necessario aggiungere la logica di associazione dei dati.
Ad un livello generale sono disponibili due parti per stabilire una relazione modello-vista in Dynamo:
Una classe NodeModel
per stabilire la logica di base del nodo (il "modello")
Una classe INodeViewCustomization
per personalizzare la modalità di visualizzazione di NodeModel
(la "vista").
Gli oggetti NodeModel dispongono già di una relazione vista-modello associata (NodeViewModel), pertanto possiamo concentrarci solo sul modello e sulla vista per l'interfaccia utente personalizzata.
I nodi NodeModel presentano diverse differenze significative rispetto ai nodi zero-touch, che verranno illustrate in questo esempio. Prima di passare alla personalizzazione dell'interfaccia utente, iniziamo costruendo la logica NodeModel.
1. Creare la struttura di progetto:
Un nodo NodeModel può chiamare solo funzioni, pertanto è necessario separare NodeModel e le funzioni in librerie diverse. Il modo standard per eseguire questa operazione per i pacchetti di Dynamo consiste nella creazione di progetti separati per ciascuno di essi. Iniziare creando una nuova soluzione per includere i progetti.
Selezionare
File > New > Project
.Selezionare
Other Project Types
per visualizzare l'opzione Solution.Selezionare
Blank Solution
.Assegnare un nome alla soluzione
CustomNodeModel
.Selezionare
Ok
.
Creare due progetti di libreria di classi C# nella soluzione: uno per le funzioni e uno per implementare l'interfaccia NodeModel.
Fare clic con il pulsante destro del mouse sulla soluzione e selezionare
Add > New Project
.Scegliere Class Library.
Assegnare il nome
CustomNodeModel
.Fare clic su
Ok
.Ripetere la procedura per aggiungere un altro progetto denominato
CustomNodeModelFunctions
.
Successivamente, è necessario rinominare le librerie di classi create automaticamente e aggiungerne una al progetto CustomNodeModel
. La classe GridNodeModel
implementa la classe astratta NodeModel, la classe GridNodeView
viene utilizzata per personalizzare la vista e GridFunction
contiene eventuali funzioni che è necessario chiamare.
Aggiungere un'altra classe facendo clic con il pulsante destro del mouse sul progetto
CustomNodeModel
, selezionandoAdd > New Item...
e scegliendoClass
.Nel progetto
CustomNodeModel
, sono necessarie le classiGridNodeModel.cs
eGridNodeView.cs
.Nel progetto
CustomNodeModelFunction
, è necessaria una classeGridFunctions.cs
.
Prima di aggiungere qualsiasi codice alle classi, aggiungere i pacchetti necessari per questo progetto. CustomNodeModel
richiede ZeroTouchLibrary e WpfUILibrary e CustomNodeModelFunction
richiede solo ZeroTouchLibrary. Si utilizzerà WpfUILibrary nella personalizzazione dell'interfaccia utente che verrà eseguita in seguito e si userà ZeroTouchLibrary per la creazione della geometria. I pacchetti possono essere aggiunti singolarmente per i progetti. Poiché questi pacchetti presentano dipendenze, Core e DynamoServices verranno installati automaticamente.
Fare clic con il pulsante destro del mouse su un progetto e selezionare
Manage NuGet Packages
.Installare solo i pacchetti necessari per il progetto.
Visual Studio copierà i pacchetti NuGet a cui si fa riferimento nella directory della build. Questa opzione può essere impostata su False, in modo da non includere eventuali file non necessari nel pacchetto.
Seleziona i pacchetti NuGet di Dynamo.
Impostare
Copy Local
su False.
2. Ereditare la classe NodeModel
Come accennato in precedenza, l'aspetto principale che rende un nodo NodeModel diverso da un nodo zero-touch è la sua implementazione della classe NodeModel
. Un nodo NodeModel richiede diverse funzioni di questa classe ed è possibile ottenerle aggiungendo :NodeModel
dopo il nome della classe.
Copiare il seguente codice in GridNodeModel.cs
.
È differente dai nodi zero-touch. Cerchiamo di capire cosa fa ogni parte.
Specificare gli attributi del nodo, ad esempio NodeName, NodeCategory, InPortNames/OutPortNames, InPortTypes/OutPortTypes, InPortDescriptions/OutPortDescriptions.
public class GridNodeModel : NodeModel
è una classe che eredita la classe NodeModel
da Dynamo.Graph.Nodes
.
public GridNodeModel() { RegisterAllPorts(); }
è un costruttore che registra gli input e gli output del nodo.
BuildOutputAst()
restituisce un AST (albero della sintassi astratta), la struttura necessaria per la restituzione dei dati da un nodo NodeModel.
AstFactory.BuildFunctionCall()
chiama la funzione RectangularGrid da GridFunctions.cs
.
new Func<int, int, double, List<Rectangle>>(GridFunction.RectangularGrid)
specifica la funzione e i relativi parametri.
new List<AssociativeNode> { inputAstNodes[0], inputAstNodes[1], sliderValue });
mappa gli input del nodo ai parametri di funzione.
AstFactory.BuildNullNode()
crea un nodo nullo se le porte di input non sono connesse. Ciò consente di evitare la visualizzazione di un avviso sul nodo.
RaisePropertyChanged("SliderValue")
avvisa l'interfaccia utente quando il valore del dispositivo di scorrimento cambia.
var sliderValue = AstFactory.BuildDoubleNode(SliderValue)
crea un nodo nell'albero AST che rappresenta il valore del dispositivo di scorrimento.
Modificare un input nella variabile sliderValue
nella variabile functionCall new List<AssociativeNode> { inputAstNodes[0], sliderValue });
.
3. Chiamare una funzione
Il progetto CustomNodeModelFunction
verrà integrato in un assieme separato da CustomNodeModel
in modo che possa essere chiamato.
Copiare il seguente codice in GridFunction.cs
.
Questa classe di funzioni è molto simile al case study del nodo griglia zero-touch con una differenza:
[IsVisibleInDynamoLibrary(false)]
impedisce a Dynamo di "vedere" il seguente metodo e la seguente classe, poiché la funzione è già stata chiamata da CustomNodeModel
.
Così come sono stati aggiunti i riferimenti per i pacchetti NuGet, CustomNodeModel
dovrà fare riferimento a CustomNodeModelFunction
per chiamare la funzione.
L'istruzione using per CustomNodeModel sarà inattiva fino a quando non si fa riferimento alla funzione.
Fare clic con il pulsante destro del mouse su
CustomNodeModel
e selezionareAdd > Reference
.Scegliere
Projects > Solution
.Selezionare
CustomNodeModelFunction
.Fare clic su
Ok
.
4. Personalizzare la vista
Per creare un dispositivo di scorrimento, è necessario personalizzare l'interfaccia utente implementando l'interfaccia INodeViewCustomization
.
Copiare il seguente codice in GridNodeView.cs
.
public class CustomNodeModelView : INodeViewCustomization<GridNodeModel>
definisce le funzioni necessarie per personalizzare l'interfaccia utente.
Dopo aver impostato la struttura del progetto, utilizzare l'ambiente di progettazione di Visual Studio per creare un controllo utente e definirne i parametri in un file .xaml
. Dalla casella degli strumenti, aggiungere un dispositivo di scorrimento a <Grid>...</Grid>
.
Fare clic con il pulsante destro del mouse su
CustomNodeModel
e selezionareAdd > New Item
.Selezionare
WPF
.Assegnare un nome al controllo utente
Slider
.Fare clic su
Add
.
Copiare il seguente codice in Slider.xaml
.
I parametri del controllo del dispositivo di scorrimento sono definiti nel file .xaml
. Gli attributi Minimum e Maximum definiscono l'intervallo numerico di questo dispositivo di scorrimento.
All'interno di <Grid>...</Grid>
è possibile posizionare diversi controlli utente dalla casella degli strumenti di Visual Studio.
Quando è stato creato il file Slider.xaml
, Visual Studio ha creato automaticamente un file C# denominato Slider.xaml.cs
che inizializza il dispositivo di scorrimento. Modificare lo spazio dei nomi in questo file.
Lo spazio dei nomi deve essere CustomNodeModel.CustomNodeModel
.
GridNodeModel.cs
definisce la logica di calcolo del dispositivo di scorrimento.
5. Configurazione come pacchetto
Prima di creare il progetto, il passaggio finale consiste nell'aggiungere un file pkg.json
in modo che Dynamo possa leggere il pacchetto.
Fare clic con il pulsante destro del mouse su
CustomNodeModel
e selezionareAdd > New Item
.Selezionare
Web
.Selezionare
JSON File
.Assegnare un nome al file
pkg.json
.Fare clic su
Add
.
Copiare il seguente codice in pkg.json
.
"name":
determina il nome del pacchetto e il relativo gruppo nella libreria di Dynamo.
"keywords":
fornisce i termini di ricerca per la ricerca nella libreria di Dynamo.
"node_libraries": []
indica le librerie associate al pacchetto.
L'ultimo passaggio consiste nel creare la soluzione e pubblicarla come pacchetto di Dynamo. Per informazioni su come creare un pacchetto locale prima di pubblicarlo in linea e su come creare un pacchetto direttamente da Visual Studio, vedere il capitolo sull'installazione client dei pacchetti.