Auf NodeModel basierende Blöcke bieten erheblich mehr Flexibilität und Leistung als Zero-Touch-Blöcke. In diesem Beispiel wird der Zero-Touch-Rasterblock weiter optimiert. Dazu wird ein integrierter Schieberegler hinzugefügt, mit dem die Größe des Rechtecks zufällig festgelegt wird.
Der Schieberegler skaliert die Zellen relativ zu ihrer Größe, sodass der Benutzer keinen Schieberegler mit dem richtigen Bereich zur Verfügung stellen muss.
Dynamo basiert auf dem Software-Architekturmuster Model-view-viewmodel (MVVM), um die Benutzeroberfläche vom Backend getrennt zu halten. Beim Erstellen von Zero-Touch-Blöcken nimmt Dynamo die Datenbindung zwischen den Daten eines Blocks und der zugehörigen Benutzeroberfläche vor. Um eine angepasste Benutzeroberfläche zu erstellen, müssen wir die Datenbindungslogik hinzufügen.
Allgemein gehören zur Erstellung einer Model-View-Beziehung in Dynamo zwei Aspekte:
Eine NodeModel
-Klasse zum Einrichten der Kernlogik des Blocks (Modell)
Eine INodeViewCustomization
-Klasse zum Anpassen der Anzeige von NodeModel
(Ansicht)
NodeModel-Objekte verfügen bereits über eine verknüpfte View-Model-Beziehung (NodeViewModel). Daher können wir uns auf das Modell und die Ansicht für eine angepasste Benutzeroberfläche konzentrieren.
NodeModel-Blöcke unterscheiden sich in einigen wichtigen Punkten von Zero-Touch-Blöcken, die in diesem Beispiel behandelt werden. Bevor wir uns mit der Anpassung der Benutzeroberfläche befassen, erstellen wir zunächst die NodeModel-Logik.
1. Erstellen der Projektstruktur:
Ein NodeModel-Block kann nur Funktionen aufrufen. Daher müssen wir den Block NodeModel und die Funktionen in verschiedene Bibliotheken unterteilen. Die Standardmethode hierfür besteht für Dynamo-Pakete darin, für jedes Paket ein separates Projekt zu erstellen. Beginnen Sie mit dem Erstellen einer neuen Projektmappe, die die Projekte enthält.
Wählen Sie
File > New > Project
aus.Wählen Sie
Other Project Types
aus, um die Option Projektmappe aufzurufen.Wählen Sie
Blank Solution
aus.Geben Sie der Projektmappe den Namen
CustomNodeModel
.Wählen Sie
Ok
aus.
Erstellen Sie in der Projektmappe zwei C#-Klassenbibliotheksprojekte: eines für Funktionen und eines zur Implementierung der NodeModel-Schnittstelle.
Klicken Sie mit der rechten Maustaste auf die Projektmappe, und wählen Sie
Add > New Project
.Wählen Sie die Klassenbibliothek.
Vergeben Sie den Namen
CustomNodeModel
.Klicken Sie auf
Ok
.Wiederholen Sie den Vorgang, um ein weiteres Projekt mit dem Namen
CustomNodeModelFunctions
hinzuzufügen.
Als Nächstes müssen wir die automatisch erstellten Klassenbibliotheken umbenennen und dem Projekt CustomNodeModel
eine der Bibliotheken hinzufügen. Die GridNodeModel
-Klasse implementiert die abstrakte NodeModel-Klasse, GridNodeView
wird zum Anpassen der Ansicht verwendet, und GridFunction
enthält alle Funktionen, die aufgerufen werden müssen.
Fügen Sie eine weitere Klasse hinzu, indem Sie mit der rechten Maustaste auf das Projekt
CustomNodeModel
klicken,Add > New Item...
auswählen undClass
wählen.Im Projekt
CustomNodeModel
benötigen wir die KlassenGridNodeModel.cs
undGridNodeView.cs
.Für das Projekt
CustomNodeModelFunction
benötigen wir eineGridFunctions.cs
-Klasse.
Bevor wir den Klassen Code hinzufügen, fügen wir die erforderlichen Pakete für dieses Projekt hinzu. CustomNodeModel
benötigt ZeroTouchLibrary und WpfUILibrary, CustomNodeModelFunction
benötigt nur ZeroTouchLibrary. WpfUILibrary wird später bei der Anpassung der Benutzeroberfläche verwendet, und ZeroTouchLibrary wird zum Erstellen von Geometrie verwendet. Pakete können einzeln für Projekte hinzugefügt werden. Da diese Pakete Abhängigkeiten aufweisen, werden Core und DynamoServices automatisch installiert.
Klicken Sie mit der rechten Maustaste auf ein Projekt, und wählen Sie
Manage NuGet Packages
.Installieren Sie nur die für dieses Projekt erforderlichen Pakete.
Visual Studio kopiert die NuGet-Pakete, die im Build-Verzeichnis referenziert werden. Dies kann auf False gesetzt werden, damit keine unnötigen Dateien im Paket vorhanden sind.
Wählen Sie Dynamo-NuGet-Pakete aus.
Legen Sie
Copy Local
auf False fest.
2. Übernehmen der NodeModel-Klasse
Wie bereits erwähnt, ist der wichtigste Aspekt, der einen NodeModel-Block von einem ZeroTouch-Block unterscheidet, die Implementierung der NodeModel
-Klasse. Ein NodeModel-Block benötigt mehrere Funktionen aus dieser Klasse. Fügen Sie nach dem Klassennamen :NodeModel
hinzu, um sie abzurufen.
Kopieren Sie den folgenden Code in GridNodeModel.cs
.
Dies unterscheidet sich von Zero-Touch-Blöcken. Sehen wir uns die einzelnen Aspekte an.
Geben Sie die Blockattribute wie Name, Kategorie, InPort-/OutPort-Namen, InPort-/OutPort-Typen und Beschreibungen an.
public class GridNodeModel : NodeModel
ist eine Klasse, die die NodeModel
-Klasse von Dynamo.Graph.Nodes
übernimmt.
public GridNodeModel() { RegisterAllPorts(); }
ist ein Konstruktor, der die Ein- und Ausgaben des Blocks registriert.
BuildOutputAst()
gibt einen AST (Abstract Syntax Tree, abstrakter Syntaxbaum) zurück, die erforderliche Struktur für die Rückgabe von Daten aus einem NodeModel-Block.
AstFactory.BuildFunctionCall()
ruft die Funktion RectangularGrid von GridFunctions.cs
auf.
new Func<int, int, double, List<Rectangle>>(GridFunction.RectangularGrid)
gibt die Funktion und ihre Parameter an.
new List<AssociativeNode> { inputAstNodes[0], inputAstNodes[1], sliderValue });
ordnet die Blockeingaben den Funktionsparametern zu.
AstFactory.BuildNullNode()
erstellt einen Null-Block, wenn die Eingabeanschlüsse nicht verbunden sind. Dadurch wird vermieden, dass eine Warnung für den Block angezeigt wird.
RaisePropertyChanged("SliderValue")
benachrichtigt die Benutzeroberfläche, wenn sich der Schiebereglerwert ändert.
var sliderValue = AstFactory.BuildDoubleNode(SliderValue)
erstellt einen Block im AST, der den Schiebereglerwert darstellt.
Ändern Sie eine Eingabe für die Variable sliderValue
in der functionCall-Variablen new List<AssociativeNode> { inputAstNodes[0], sliderValue });
.
3. Aufrufen einer Funktion
Das Projekt CustomNodeModelFunction
wird in einer anderen Assembly als CustomNodeModel
erstellt, sodass es aufgerufen werden kann.
Kopieren Sie den folgenden Code in GridFunction.cs
.
Diese Funktionsklasse ist der Zero-Touch-Rasterfallstudie sehr ähnlich, mit einem Unterschied:
[IsVisibleInDynamoLibrary(false)]
verhindert, dass Dynamo die folgende Methode und Klasse "sieht", da die Funktion bereits von CustomNodeModel
aufgerufen wird.
Genauso wie wir Referenzen für NuGet-Pakete hinzugefügt haben, muss CustomNodeModel
auf CustomNodeModelFunction
verweisen, um die Funktion aufzurufen.
Die using-Anweisung für CustomNodeModel ist inaktiv, bis wir die Funktion referenzieren.
Klicken Sie mit der rechten Maustaste auf
CustomNodeModel
, und wählen SieAdd > Reference
aus.Wählen Sie
Projects > Solution
.Aktivieren Sie
CustomNodeModelFunction
.Klicken Sie auf
Ok
.
4. Anpassen der Ansicht
Um einen Schieberegler zu erstellen, müssen wir die Benutzeroberfläche durch Implementierung der INodeViewCustomization
-Schnittstelle anpassen.
Kopieren Sie den folgenden Code in GridNodeView.cs
:
public class CustomNodeModelView : INodeViewCustomization<GridNodeModel>
definiert die Funktionen, die zum Anpassen der Benutzeroberfläche erforderlich sind.
Nachdem die Struktur des Projekts eingerichtet wurde, verwenden Sie die Entwurfsumgebung von Visual Studio, um ein Benutzersteuerelement zu erstellen und dessen Parameter in einer .xaml
-Datei zu definieren. Fügen Sie im Werkzeugkasten einen Schieberegler zu <Grid>...</Grid>
hinzu.
Klicken Sie mit der rechten Maustaste auf
CustomNodeModel
, und wählen SieAdd > New Item
aus.Wählen Sie
WPF
aus.Geben Sie dem Benutzersteuerelement den Namen
Slider
.Klicken Sie auf
Add
.
Kopieren Sie den folgenden Code in Slider.xaml
:
Die Parameter des Schiebereglers werden in der .xaml
-Datei definiert. Minimum- und Maximum-Attribute definieren den numerischen Bereich dieses Schiebereglers.
In <Grid>...</Grid>
können wir verschiedene Benutzersteuerelemente aus dem Visual Studio-Werkzeugkasten platzieren.
Beim Erstellen der Datei Slider.xaml
hat Visual Studio automatisch eine C#-Datei mit dem Namen Slider.xaml.cs
erstellt, die den Schieberegler initialisiert. Ändern Sie den Namensbereich in dieser Datei.
Der Namensbereich sollte CustomNodeModel.CustomNodeModel
lauten.
In GridNodeModel.cs
wird die Berechnungslogik des Schiebereglers definiert.
5. Konfigurieren als Paket
Bevor wir das Projekt erstellen, fügen wir im letzten Schritt eine pkg.json
-Datei hinzu, damit Dynamo das Paket lesen kann.
Klicken Sie mit der rechten Maustaste auf
CustomNodeModel
, und wählen SieAdd > New Item
aus.Wählen Sie
Web
aus.Wählen Sie
JSON File
aus.Geben Sie der Datei den Namen
pkg.json
.Klicken Sie auf
Add
.
Kopieren Sie den folgenden Code in pkg.json
:
"name":
Bestimmt den Namen des Pakets und dessen Gruppe in der Dynamo-Bibliothek.
"keywords":
Geben Sie Suchbegriffe für die Suche in der Dynamo-Bibliothek an.
"node_libraries": []
Die mit dem Paket verknüpften Bibliotheken.
Der letzte Schritt besteht darin, die Projektmappe zu erstellen und als Dynamo-Paket zu publizieren. Im Kapitel Paketbereitstellung finden Sie Informationen zum Erstellen eines lokalen Pakets vor der Online-Publizierung und zum Erstellen eines Pakets direkt in Visual Studio.