Analiza przypadku NodeModel — niestandardowy interfejs użytkownika
Last updated
Last updated
Węzły oparte na klasie NodeModel zapewniają znacznie większą elastyczność i możliwości niż węzły Zero-Touch. W tym przykładzie przeniesiemy węzeł siatki Zero-Touch na następny poziom, dodając zintegrowany suwak losowo ustawiający rozmiar prostokąta.
Ten suwak umożliwia skalowanie komórek względem ich rozmiaru, dzięki czemu użytkownik nie musi udostępniać suwaka z odpowiednim zakresem.
Dodatek Dynamo jest oparty na wzorcu architektury oprogramowania model-view-viewmodel (MVVM), który umożliwia oddzielenie interfejsu użytkownika od zaplecza. W przypadku tworzenia węzłów ZeroTouch dodatek Dynamo tworzy powiązanie danych między danymi węzła a jego interfejsem użytkownika. Aby utworzyć niestandardowy interfejs użytkownika, należy dodać logikę powiązania danych.
Ogólnie istnieją dwie części ustanawiania relacji model-widok (model-view) w dodatku Dynamo:
Klasa NodeModel
ustanawiająca podstawową logikę węzła („model”)
Klasa INodeViewCustomization
umożliwiająca dostosowanie sposobu wyświetlania modelu NodeModel
(„widok”, ang. „view”)
Obiekty NodeModel mają już skojarzoną relację widok-model (NodeViewModel), więc można skupić się na modelu i widoku dla niestandardowego interfejsu użytkownika.
W tym przykładzie omówimy kilka istotnych różnic między węzłami NodeModel a węzłami Zero-Touch. Zanim przejdziemy do dostosowywania interfejsu użytkownika, rozwińmy logikę klasy NodeModel.
1. Tworzenie struktury projektu:
Węzeł NodeModel może tylko wywoływać funkcje, dlatego należy rozdzielić węzeł NodeModel i funkcje między różnymi bibliotekami. Standardowym sposobem realizacji tego w przypadku pakietów dodatku Dynamo jest utworzenie oddzielnych projektów dla obu tych typów zawartości. Zacznij od utworzenia nowego rozwiązania obejmującego te projekty.
Wybierz opcję
File > New > Project
Wybierz opcję
Other Project Types
, aby wywołać opcję rozwiązaniaWybierz opcję
Blank Solution
Nadaj rozwiązaniu nazwę
CustomNodeModel
Wybierz przycisk
Ok
Utwórz w rozwiązaniu dwa projekty biblioteki klas C#: jeden dla funkcji, a drugi dla interfejsu NodeModel.
Kliknij prawym przyciskiem myszy rozwiązanie i wybierz pozycję
Add > New Project
Wybierz bibliotekę klas
Nadaj jej nazwę
CustomNodeModel
Kliknij przycisk
Ok
Powtórz ten proces, aby dodać kolejny projekt o nazwie
CustomNodeModelFunctions
Następnie należy zmienić nazwy automatycznie utworzonych bibliotek klas i dodać je do projektu CustomNodeModel
. Klasa GridNodeModel
służy do zaimplementowania klasy abstrakcyjnej NodeModel, a GridNodeView
do dostosowania widoku. Natomiast klasa GridFunction
ma zawierać wszystkie funkcje, które będą wywoływane.
Dodaj kolejną klasę, klikając prawym przyciskiem myszy projekt
CustomNodeModel
, wybierając polecenieAdd > New Item...
i wybierając opcjęClass
.W projekcie
CustomNodeModel
potrzebne są klasyGridNodeModel.cs
iGridNodeView.cs
W projekcie
CustomNodeModelFunction
potrzebna jest klasaGridFunctions.cs
Przed dodaniem kodu do klas dodaj wymagane dla tego projektu pakiety. Projekt CustomNodeModel
będzie wymagać bibliotek ZeroTouchLibrary i WpfUILibrary. Natomiast projekt CustomNodeModelFunction
będzie wymagać tylko biblioteki ZeroTouchLibrary. Biblioteka WpfUILibrary zostanie użyta podczas dostosowywania interfejsu użytkownika, które wykonamy później, a biblioteka ZeroTouchLibrary — do tworzenia geometrii. Pakiety można dodawać dla projektów pojedynczo. Ponieważ te pakiety mają zależności, składniki Core i DynamoServices zostaną zainstalowane automatycznie.
Kliknij prawym przyciskiem myszy projekt i wybierz pozycję
Manage NuGet Packages
Zainstaluj tylko wymagane pakiety dla tego projektu
Program Visual Studio skopiuje pakiety NuGet, do których dodaliśmy odwołania w katalogu kompilacji. Dla tej pozycji można ustawić wartość false (fałsz), aby w pakiecie nie było żadnych niepotrzebnych plików.
Wybierz pakiety NuGet dodatku Dynamo
Ustaw wartość false (fałsz) dla pozycji
Copy Local
2. Dziedziczenie klasy NodeModel
Jak wspomniano wcześniej, główna różnica między węzłem NodeModel a węzłem ZeroTouch polega na tym, że ten pierwszy zawiera implementację klasy NodeModel
. Węzeł NodeModel wymaga kilku funkcji z tej klasy, które można uzyskać, dodając po nazwie klasy :NodeModel
.
Skopiuj następujący kod do pliku GridNodeModel.cs
.
To różnica w stosunku do węzłów Zero-Touch. Przeanalizujmy funkcje poszczególnych części.
Określ atrybuty węzła, takie jak nazwa, kategoria, nazwy portów wejściowych/wyjściowych, typy portów wejściowych/wyjściowych oraz opisy.
public class GridNodeModel : NodeModel
to klasa dziedzicząca klasę NodeModel
z Dynamo.Graph.Nodes
.
public GridNodeModel() { RegisterAllPorts(); }
to konstruktor rejestrujący dane wejściowe i wyjściowe węzła.
BuildOutputAst()
zwraca drzewo AST (Abstract Syntax Tree), strukturę wymaganą do zwracania danych z węzła NodeModel.
metoda AstFactory.BuildFunctionCall()
wywołuje funkcję RectangularGrid z pliku GridFunctions.cs
.
Instrukcja new Func<int, int, double, List<Rectangle>>(GridFunction.RectangularGrid)
określa tę funkcję i jej parametry.
Instrukcja new List<AssociativeNode> { inputAstNodes[0], inputAstNodes[1], sliderValue });
odwzorowuje dane wejściowe węzła na parametry funkcji
Metoda AstFactory.BuildNullNode()
tworzy węzeł o wartości null, jeśli porty wejściowe nie są połączone. Zapobiega to wyświetleniu ostrzeżenia dotyczącego tego węzła.
Instrukcja RaisePropertyChanged("SliderValue")
powiadamia interfejs użytkownika o zmianie wartości suwaka
Instrukcja var sliderValue = AstFactory.BuildDoubleNode(SliderValue)
tworzy węzeł AST reprezentujący wartość suwaka
Zmień dane wejściowe na zmienną sliderValue
w zmiennej functionCall new List<AssociativeNode> { inputAstNodes[0], sliderValue });
3. Wywoływanie funkcji
Projekt CustomNodeModelFunction
zostanie skompilowany jako zespół oddzielny od projektu CustomNodeModel
, dzięki czemu będzie można go wywołać.
Skopiuj następujący kod do pliku GridFunction.cs
.
Ta klasa funkcji jest bardzo podobna do tej z analizy przypadku siatki Zero-Touch z jedną różnicą:
Instrukcja [IsVisibleInDynamoLibrary(false)]
„ukrywa” przed dodatkiem Dynamo następującą metodę i klasę, ponieważ ta funkcja jest już wywoływana z projektu CustomNodeModel
.
Tak jak dodaliśmy odwołania do pakietów NuGet, projekt CustomNodeModel
musi odwoływać się do projektu CustomNodeModelFunction
, aby wywołać funkcję.
Instrukcja using dla projektu CustomNodeModel będzie nieaktywna, dopóki nie będzie odwołania do tej funkcji
Kliknij prawym przyciskiem myszy pozycję
CustomNodeModel
i wybierz polecenieAdd > Reference
Wybierz opcję
Projects > Solution
Zaznacz pozycję
CustomNodeModelFunction
Kliknij przycisk
Ok
4. Dostosowywanie widoku
Aby utworzyć suwak, należy dostosować interfejs użytkownika przez zaimplementowanie interfejsu INodeViewCustomization
.
Skopiuj następujący kod do pliku GridNodeView.cs
Instrukcja public class CustomNodeModelView : INodeViewCustomization<GridNodeModel>
definiuje funkcje niezbędne do dostosowania interfejsu użytkownika.
Po skonfigurowaniu struktury projektu należy za pomocą środowiska projektowego programu Visual Studio utworzyć element sterujący użytkownika i zdefiniować jego parametry w pliku .xaml
. Z pola przybornika dodaj suwak do części <Grid>...</Grid>
.
Kliknij prawym przyciskiem myszy pozycję
CustomNodeModel
i wybierz polecenieAdd > New Item
Wybierz opcję
WPF
Nadaj elementowi sterującemu użytkownika nazwę
Slider
Kliknij opcję
Add
Skopiuj następujący kod do pliku Slider.xaml
Parametry suwaka są zdefiniowane w pliku .xaml
. Atrybuty Minimum i Maximum definiują zakres liczbowy tego suwaka.
Wewnątrz tagów <Grid>...</Grid>
można umieszczać różne elementy sterujące użytkownika z przybornika programu Visual Studio
Po utworzeniu pliku Slider.xaml
program Visual Studio automatycznie utworzył plik z kodem C# o nazwie Slider.xaml.cs
, który inicjuje suwak. Zmień przestrzeń nazw w tym pliku.
Przestrzenią nazw powinna być CustomNodeModel.CustomNodeModel
Plik GridNodeModel.cs
definiuje logikę obliczeń suwaka.
5. Konfigurowanie jako pakiet
Ostatnią czynnością przed rozpoczęciem kompilowania projektu jest dodanie pliku pkg.json
, aby umożliwić dodatkowi Dynamo odczytanie pakietu.
Kliknij prawym przyciskiem myszy pozycję
CustomNodeModel
i wybierz polecenieAdd > New Item
Wybierz opcję
Web
Wybierz opcję
JSON File
Nadaj plikowi nazwę
pkg.json
Kliknij opcję
Add
Skopiuj następujący kod do pliku pkg.json
"name":
określa nazwę pakietu i jego grupę w bibliotece dodatku Dynamo
"keywords":
określa terminy wyszukiwania na potrzeby wyszukiwania w bibliotece dodatku Dynamo
"node_libraries": []
biblioteki skojarzone z pakietem
Ostatnią czynnością jest skompilowanie rozwiązania i opublikowanie go jako pakietu dodatku Dynamo. Zapoznaj się z rozdziałem dotyczącym wdrażania pakietów, aby dowiedzieć się, jak utworzyć pakiet lokalny przed opublikowaniem go online i jak skompilować pakiet bezpośrednio z programu Visual Studio.