Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Platforma Dynamo je navržena tak, aby se přispěvateli mohli stát všichni uživatelé, bez ohledu na úroveň jejich zkušeností. Existuje několik možností vývoje, které se zaměřují na různé schopnosti a úrovně dovedností, přičemž každá má své silné a slabé stránky v závislosti na cíli. Níže uvádíme různé možnosti a způsob, jak si vybrat jednu z nich.
Tři vývojová prostředí: Visual Studio, Editor jazyka Python a Blok kódů s jazykem DesignScript
Možnosti vývoje pro aplikaci Dynamo spadají primárně do dvou kategorií: pro aplikaci Dynamo a v aplikaci Dynamo. Tyto dvě kategorie si lze představit takto: „v“ aplikaci Dynamo znamená obsah vytvořený pomocí vývojového prostředí aplikace Dynamo, který bude použit v aplikaci Dynamo, a „pro“ aplikaci Dynamo znamená použití externích nástrojů k vytvoření obsahu, který bude importován do aplikace Dynamo a poté zde použit. Ačkoliv je tato příručka zaměřena na vývoj pro aplikaci Dynamo, níže jsou popsány zdroje pro všechny procesy.
Tyto uzly umožňují nejvyšší stupeň přizpůsobení. Touto metodou je sestaveno mnoho balíčků a je nezbytná pro přispívání do zdrojů aplikace Dynamo. Proces jejich sestavení bude popsán v této příručce.
Uzly Zero Touch
Uzly odvozené z uzlů NodeModel
Rozšíření
V této příručce naleznete pokyny k importu knihoven Zero-Touch.
V následujícím pojednání je jako vývojové prostředí pro uzly Zero-Touch a NodeModel použita aplikace Visual Studio.
Rozhraní aplikace Visual Studio s projektem, který budeme vyvíjet.
Ačkoli tyto procesy existují v pracovním prostoru vizuálního programování a jsou poměrně přímočaré, všechny představují vhodné možnosti pro přizpůsobení aplikace Dynamo. Tato příručka se jimi podrobně zabývá a v kapitole Strategie skriptování poskytuje tipy a osvědčené postupy.
Bloky kódu zobrazují jazyk DesignScript ve vizuálním programovacím prostředí a umožňují flexibilní práci s textovým skriptem a uzly. Funkci v bloku kódu může volat cokoli v pracovním prostoru.
Stáhněte si příklad bloku kódu (klikněte pravým tlačítkem a uložte jej) nebo si v této příručce prohlédněte podrobnou ukázku.
Vlastní uzly jsou kontejnery pro kolekce uzlů nebo dokonce celých grafů. Jsou účinným způsobem, jak shromažďovat často používané postupy a sdílet je s komunitou.
Stáhněte si příklad vlastního uzlu (klikněte pravým tlačítkem a uložte jej) nebo si v této příručce prohlédněte podrobnou ukázku.
Uzly jazyka Python jsou skriptovací rozhraní v pracovním prostoru vizuálního programování, podobně jako bloky kódu. Knihovny Autodesk.DesignScript používají tečkovou notaci podobnou jazyku DesignScript.
Stáhněte si příklad uzlu jazyka Python (klikněte pravým tlačítkem a uložte jej) nebo si v této příručce prohlédněte podrobnou ukázku.
Vývoj v pracovním prostoru Dynamo představuje výkonný nástroj pro získání okamžité zpětné vazby.
Vývoj v pracovním prostoru aplikace Dynamo pomocí uzlu jazyka Python
Možnosti vývoje aplikace Dynamo byly navrženy tak, aby řešily složitost potřeby přizpůsobení. Ať už je cílem napsat rekurzivní skript v jazyce Python, nebo sestavit vlastní uživatelské rozhraní uzlu, existují možnosti implementace kódu, které zahrnují pouze to, co je nezbytné pro spuštění.
Bloky kódu, uzel jazyka Python a vlastní uzly v aplikaci Dynamo
Toto jsou přímé možnosti pro psaní kódu ve vizuálním programovacím prostředí aplikace Dynamo. Pracovní prostor vizuálního programování aplikace Dynamo poskytuje přístup k jazyku Python a jazyku DesignScript a umožňuje zahrnout více uzlů do vlastního uzlu.
Pomocí těchto metod můžeme:
Začít psát kód v jazyce Python nebo DesignScript bez větších nároků na nastavení.
Importovat knihovny jazyka Python do aplikace Dynamo.
Sdílet bloky kódu, uzly jazyka Python a vlastní uzly s komunitou aplikace Dynamo v rámci balíčku.
Uzly Zero Touch
Zero-Touch označuje jednoduchou metodu importu knihoven C# pomocí najetí kurzoru a kliknutí. Aplikace Dynamo přečte veřejné metody knihovny .dll
a převede je na uzly aplikace Dynamo. Pomocí funkce Zero-Touch můžete vyvíjet své vlastní uzly a balíčky.
Pomocí této metody můžeme:
Importovat knihovnu, která nebyla nezbytně vyvinuta pro aplikaci Dynamo, a automaticky vytvořit sadu nových uzlů, viz příklad A-Forge v příručce Primer.
Psát metody C# a snadno je používat jako uzly v aplikaci Dynamo.
Sdílet knihovny C# jako uzly s komunitou aplikace Dynamo v balíčku
Uzly odvozené z uzlů NodeModel
Tyto uzly jsou krokem hlouběji do struktury aplikace Dynamo. Jsou založeny na třídě NodeModel
a napsány v jazyce C#. Tato metoda sice poskytuje největší flexibilitu a výkon, ale většina aspektů uzlu musí být explicitně definována a funkce musí být umístěny v samostatné sestavě.
Pomocí této metody můžeme:
Vytvářet plně přizpůsobitelné uživatelské rozhraní uzlu s posuvníky, obrázky, barvami atd. (např. uzel ColorRange).
Přistupovat k tomu, co se děje na kreslicí ploše aplikace Dynamo, a ovlivňovat to.
Přizpůsobit vázání.
Načítat uzly do aplikace Dynamo jako balíček.
Protože je aplikace Dynamo pravidelně aktualizována, mohou být provedeny změny v části rozhraní API, které jsou používány v balíčku. Sledování těchto změn je důležité pro zajištění správné funkce stávajících balíčků.
Změny rozhraní API jsou sledovány na stránce Wiki aplikace Dynamo na Githubu. Sledovány jsou změny v jádru aplikace Dynamo, knihovnách a pracovních prostorech.
Příkladem nadcházející významné změny je přechod z formátu XML na formátu souboru JSON ve verzi 2.0. Uzly odvozené z uzlu NodeModel nyní potřebují konstruktor JSON, jinak se neotevřou v aplikaci Dynamo 2.0.
Dokumentace rozhraní API aplikace Dynamo aktuálně pokrývá hlavní funkce: http://dynamods.github.io/DynamoAPI
Dávejte pozor na soubory DLL obsažené v balíčku, který je nahráván do správce balíčků. Pokud autor balíčku nevytvořil knihovnu .dll, musí mít práva na její sdílení.
Jestliže balíček obsahuje binární soubory, je nutné uživatele při stahování upozornit, že balíček obsahuje binární soubory.
Pokud umíte psát skripty v jazyce Python a chcete více funkcí, než vám mohou nabídnout standardní uzly jazyka Python aplikace Dynamo, můžete si pomocí funkce Zero-Touch vytvořit vlastní uzel. Začneme jednoduchým příkladem, který nám umožní předat skript jazyka Python jako řetězec uzlu Zero-Touch, kde se skript provede a vrátí se výsledek. Tato případová studie bude vycházet z ukázek a příkladů v části Začínáme. Pokud s tvorbou uzlů Zero-Touch úplně začínáte, podívejte se na ně.
Uzel Zero-Touch, který provede řetězec skriptu jazyka Python
Tento uzel se spoléhá na instanci skriptovacího modulu IronPython. K tomu potřebujeme odkazovat na několik dalších sestav. Podle následujících kroků nastavte základní šablonu v aplikaci Visual Studio:
Vytvořte nový projekt třídy aplikace Visual Studio.
Přidejte odkaz na soubor IronPython.dll
umístěný ve složce C:\Program Files (x86)\IronPython 2.7\IronPython.dll
.
Přidejte odkaz na soubor Microsoft.Scripting.dll
umístěný ve složce C:\Program Files (x86)\IronPython 2.7\Platforms\Net40\Microsoft.Scripting.dll
.
Zahrňte do třídy příkazy IronPython.Hosting
a Microsoft.Scripting.Hosting
using
.
Přidejte soukromý prázdný konstruktor, abyste zabránili přidání dalšího uzlu do knihovny aplikace Dynamo spolu s naším balíčkem.
Vytvořte novou metodu, která jako vstupní parametr přijímá jeden řetězec.
V rámci této metody vytvoříme novou instanci modulu jazyka Python a prázdný rozsah skriptu. Tento rozsah si můžete představit jako globální proměnné v rámci instance interpretu jazyka Python.
Poté pro modul volejte Execute
a jako parametry předejte vstupní řetězec a rozsah.
Nakonec načtěte a vraťte výsledky skriptu voláním GetVariable
pro modul a předáním názvu proměnné ze skriptu jazyka Python, která obsahuje hodnotu, kterou se pokoušíte vrátit. (Další podrobnosti naleznete v níže uvedeném příkladu.)
Následující kód představuje příklad výše uvedených kroků. Sestavením řešení se vytvoří nová knihovna .dll
umístěná ve složce bin našeho projektu. Tuto knihovnu .dll
lze nyní importovat do aplikace Dynamo jako součást balíčku nebo pomocí příkazu File < Import Library...
.
Skript jazyka Python vrací proměnnou output
, což znamená, že ve skriptu jazyka Python budeme potřebovat proměnnou output
. K otestování uzlu v aplikaci Dynamo použijte tento vzorový skript. Pokud jste někdy v aplikaci Dynamo použili uzel jazyka Python, měl by vám následující skript být povědomý. Další informace naleznete v části Python v příručce Primer.
Jedním z omezení standardních uzlů jazyka Python je, že mají pouze jeden výstupní port, takže pokud chceme vrátit více objektů, musíme sestavit seznam a načíst každý objekt v něm. Pokud upravíme výše uvedený příklad tak, aby vracel slovník, můžeme přidat libovolný počet výstupních portů. Další informace o slovnících naleznete v části Vrácení více hodnot v tématu Další práce s funkcí Zero-Touch.
Tento uzel umožňuje vrátit objem kvádru i jeho těžiště.
Upravte předchozí příklad pomocí následujících kroků:
Přidejte odkaz na knihovnu DynamoServices.dll
ze Správce balíčků NuGet.
Kromě předchozích sestav zahrňte System.Collections.Generic
a Autodesk.DesignScript.Runtime
.
Upravte návratový typ naší metody tak, aby vracela slovník, který bude obsahovat naše výstupy.
Každý výstup musí být z rozsahu načten jednotlivě (pro větší sady výstupů zvažte vytvoření jednoduché smyčky).
Do vzorového skriptu jazyka Python jsme také přidali další výstupní proměnnou (output2
). Mějte na paměti, že tyto proměnné mohou používat jakékoli dovolené konvence pojmenování v jazyce Python, název „output“ byl v tomto příkladu použit výhradně kvůli srozumitelnosti.
Po spuštění projektu v aplikaci Visual Studio si ukážeme, jak vytvořit vlastní uzel, který vytvoří obdélníkovou osnovu buněk. Ačkoli bychom ji mohli vytvořit pomocí několika standardních uzlů, jedná se o užitečný nástroj, který lze snadno umístit v uzlu Zero-Touch. Na rozdíl od čar osnovy lze velikost buněk měnit kolem středových bodů, dotazovat se na rohové vrcholy nebo je zabudovat do ploch.
V tomto příkladu si představíme několik funkcí a konceptů, které je třeba znát při vytváření uzlu Zero-Touch. Po vytvoření vlastního uzlu a jeho přidání do aplikace Dynamo si projděte stránku Další práce s funkcí Zero-Touch, kde naleznete podrobnější informace o výchozích vstupních hodnotách, vrácení více hodnot, dokumentaci, objektech, použití typů geometrií aplikace Dynamo a migraci.
Chcete-li začít vytvářet uzel osnovy, vytvořte nový projekt knihovny tříd aplikace Visual Studio. Podrobné informace o nastavení projektu naleznete na stránce Začínáme.
Vyberte
Class Library
pro typ projektu.Pojmenujte projekt jako
CustomNodes
.
Protože budeme vytvářet geometrii, je nutné odkazovat na příslušný balíček NuGet. Ze Správce balíčků NuGet nainstalujte balíček ZeroTouchLibrary. Tento balíček je nezbytný pro příkaz using Autodesk.DesignScript.Geometry;
.
Procházením vyhledejte balíček ZeroTouchLibrary.
Tento uzel použijeme v aktuálním sestavení aplikace Dynamo Studio, které je 1.3. Vyberte verzi balíčku, která odpovídá této verzi.
Všimněte si, že jsme také přejmenovali soubor třídy na
Grids.cs
.
Dále je potřeba vytvořit jmenný prostor a třídu, ve které bude umístěna metoda RectangularGrid. Uzel bude v aplikaci Dynamo pojmenován podle názvů metod a tříd. Tento kód ještě není nutné kopírovat do aplikace Visual Studio.
Autodesk.DesignScript.Geometry;
odkazuje na soubor ProtoGeometry.dll v balíčku ZeroTouchLibrary.System.Collections.Generic
je nutný k vytváření seznamů.
Nyní můžeme přidat metodu pro kreslení obdélníků. Soubor třídy by měl vypadat takto a lze jej zkopírovat do aplikace Visual Studio.
Pokud projekt vypadá podobně jako tento, pokračujte a zkuste sestavit knihovnu .dll
.
Zvolte Sestavit > Sestavit řešení.
Zkontrolujte složku projektu bin
pro knihovnu .dll
. Pokud bylo sestavení úspěšné, můžeme přidat knihovnu .dll
do aplikace Dynamo.
Vlastní uzel RectangularGrids v knihovně aplikace Dynamo
Vlastní uzel na kreslicí ploše
Tlačítko Přidat pro přidání knihovny
.dll
do aplikace Dynamo
Ve výše uvedeném příkladu jsme vytvořili poměrně jednoduchý uzel, který kromě metody RectangularGrids
nedefinoval nic dalšího. Můžeme však chtít vytvořit popisky pro vstupní porty nebo poskytnout uzlu souhrn jako u standardních uzlů aplikace Dynamo. Přidání těchto funkcí do vlastních uzlů usnadní jejich používání, zejména pokud je uživatel chce vyhledávat v knihovně.
Výchozí vstupní hodnota
Popisek pro vstup xCount
Uzel RectangularGrid potřebuje některé z těchto základních funkcí. V níže uvedeném kódu jsme přidali popisy vstupních a výstupních portů, souhrn a výchozí vstupní hodnoty.
Přiřazením hodnot parametrům metody přiřaďte vstupům výchozí hodnoty: RectangularGrid(int xCount = 10, int yCount = 10)
Vytvořte popisky vstupu a výstupu, klíčová slova pro vyhledávání a souhrn s dokumentací XML, před nimiž zadejte ///
.
K přidání popisků je potřeba soubor XML v adresáři projektu. V aplikaci Visual Studio je možné automaticky vytvořit soubor .xml
, pokud tuto možnost povolíte.
Zde povolte soubor dokumentace XML a zadejte cestu k souboru. Tím se vytvoří soubor XML.
A je to! Vytvořili jsme nový uzel s několika standardními funkcemi. Následující kapitola Základy funkce Zero-Touch obsahuje podrobnější informace o vývoji uzlů Zero-Touch a o problémech, na které je třeba dávat pozor.
Uzly založené na uzlech NodeModel poskytují podstatně větší flexibilitu a výkon než uzly Zero-Touch. V tomto příkladu posuneme uzel mřížky Zero-Touch na další úroveň přidáním integrovaného posuvníku, který náhodně nastaví velikost obdélníku.
Posuvník změní měřítko buněk vzhledem k jejich velikosti, takže uživatel nemusí zadávat posuvník se správným rozsahem.
Aplikace Dynamo je založena na vzoru architektury model-view-viewmodel (MVVM), aby bylo uživatelské rozhraní odděleno od back-endu. Při vytváření uzlů ZeroTouch aplikace Dynamo provádí vazbu dat mezi daty uzlu a jeho uživatelským rozhraním. Chcete-li vytvořit vlastní uživatelské rozhraní, je nutné přidat logiku vazby dat.
Vytvoření vztahu mezi modelem a pohledem (model-view) v aplikaci Dynamo se skládá ze dvou částí:
Třída NodeModel
slouží ke stanovení základní logiky uzlu („model“).
Třída INodeViewCustomization
slouží k přizpůsobení způsobu zobrazení třídy NodeModel
(„view“).
K objektům NodeModel je již přiřazen vzor view-model (NodeViewModel), takže se můžeme zaměřit pouze na model a pohled pro vlastní uživatelské rozhraní.
Uzly NodeModel mají několik významných rozdílů oproti uzlům Zero-Touch, kterými se budeme zabývat v tomto příkladu. Než přejdeme k přizpůsobení uživatelského rozhraní, začneme vytvořením logiky NodeModel.
1. Vytvoření struktury projektu:
Uzel NodeModel může volat pouze funkce, takže je potřeba rozdělit uzel NodeModel a funkce do různých knihoven. Standardním způsobem, jak to provést u balíčků aplikace Dynamo, je vytvořit pro každý z nich samostatné projekty. Začněte vytvořením nového řešení, které bude zahrnovat projekty.
Vyberte
File > New > Project
.Výběrem možnosti
Other Project Types
zobrazte možnost Řešení.Vyberte
Blank Solution
.Pojmenujte řešení jako
CustomNodeModel
.Klikněte na tlačítko
Ok
.
Vytvořte v řešení dva projekty knihovny třídy C#: jeden pro funkce a jeden pro implementaci rozhraní NodeModel.
Klikněte pravým tlačítkem na položku Řešení a vyberte
Add > New Project
.Vyberte knihovnu tříd.
Pojmenujte projekt jako
CustomNodeModel
.Klikněte na tlačítko
Ok
.Zopakujte tento postup a přidejte další projekt s názvem
CustomNodeModelFunctions
.
Dále je nutné přejmenovat knihovny tříd, které byly automaticky vytvořeny, a jednu přidat do projektu CustomNodeModel
. Třída GridNodeModel
implementuje abstraktní třídu NodeModel, třída GridNodeView
se používá k přizpůsobení pohledu a třída GridFunction
obsahuje všechny funkce, které je nutné volat.
Klikněte pravým tlačítkem na projekt
CustomNodeModel
, vyberte položkuAdd > New Item...
a výběrem položkyClass
přidejte další třídu.V projektu
CustomNodeModel
potřebujeme třídyGridNodeModel.cs
aGridNodeView.cs
.V projektu
CustomNodeModelFunction
potřebujeme tříduGridFunctions.cs
.
Než přidáme kód do tříd, přidejte potřebné balíčky pro tento projekt. Projekt CustomNodeModel
bude potřebovat ZeroTouchLibrary a WpfUILibrary a projekt CustomNodeModelFunction
bude potřebovat pouze ZeroTouchLibrary. Balíček WpfUILibrary bude použit při pozdějším přizpůsobení uživatelského rozhraní a balíček ZeroTouchLibrary bude použit k vytvoření geometrie. Balíčky lze přidávat jednotlivě pro projekty. Protože tyto balíčky mají závislosti, budou automaticky nainstalovány knihovny Core a DynamoServices.
Klikněte pravým tlačítkem na projekt a vyberte
Manage NuGet Packages
.Nainstalujte pouze balíčky požadované pro daný projekt.
Aplikace Visual Studio zkopíruje balíčky NuGet, na které jsme odkazovali v adresáři sestavení. Tuto možnost můžeme nastavit na hodnotu false, aby v balíčku nebyly žádné nepotřebné soubory.
Vyberte balíčky Dynamo NuGet.
Nastavte
Copy Local
na hodnotu False.
2. Zdědění třídy NodeModel
Jak bylo zmíněno výše, primárním aspektem, který odlišuje uzel NodeModel od uzlu ZeroTouch, je jeho implementace třídy NodeModel
. Uzel NodeModel vyžaduje několik funkcí z této třídy, které můžeme získat přidáním :NodeModel
za název třídy.
Zkopírujte následující kód do GridNodeModel.cs
.
Tento kód se liší od uzlů Zero-Touch. Podívejme se, co dělají jednotlivé části.
Zadejte atributy uzlu, jako jsou název, kategorie, názvy a typy vstupního/výstupního portu a popisy.
public class GridNodeModel : NodeModel
je třída, která dědí třídu NodeModel
z Dynamo.Graph.Nodes
.
public GridNodeModel() { RegisterAllPorts(); }
je konstruktor, který zaregistruje vstupy a výstupy uzlu.
BuildOutputAst()
vrací AST (abstraktní syntaktický strom), což je požadovaná struktura pro vrácení dat z uzlu NodeModel.
AstFactory.BuildFunctionCall()
volá funkci RectangularGrid z GridFunctions.cs
.
new Func<int, int, double, List<Rectangle>>(GridFunction.RectangularGrid)
určuje funkci a její parametry.
new List<AssociativeNode> { inputAstNodes[0], inputAstNodes[1], sliderValue });
mapuje vstupy uzlu na parametry funkce.
AstFactory.BuildNullNode()
vytvoří nulový uzel, pokud nejsou připojeny vstupní porty. Tím se vyhnete zobrazení upozornění na uzlu.
RaisePropertyChanged("SliderValue")
upozorní uživatelské rozhraní, když se změní hodnoty posuvníku.
var sliderValue = AstFactory.BuildDoubleNode(SliderValue)
vytvoří uzel v AST, který reprezentuje hodnotu posuvníku.
Změňte vstup na proměnnou sliderValue
v proměnné functionCall new List<AssociativeNode> { inputAstNodes[0], sliderValue });
.
3. Volání funkce
Projekt CustomNodeModelFunction
bude z projektu CustomNodeModel
vyčleněn do samostatné sestavy, aby jej bylo možné volat.
Zkopírujte následující kód do třídy GridFunction.cs
.
Tato třída funkce je velmi podobná případové studii funkce Zero-Touch – uzel osnovy s jedním rozdílem:
[IsVisibleInDynamoLibrary(false)]
brání aplikaci Dynamo v rozpoznání následující metody a třídy, protože funkce je již volána z projektu CustomNodeModel
.
Stejně jako jsme přidali odkazy na balíčky NuGet, bude nutné CustomNodeModel
odkazovat na CustomNodeModelFunction
, aby bylo možné volat funkci.
Příkaz using pro CustomNodeModel bude neaktivní, dokud neodkážeme na funkci.
Klikněte pravým tlačítkem na
CustomNodeModel
a vyberteAdd > Reference
.Zvolte
Projects > Solution
.Zaškrtněte políčko
CustomNodeModelFunction
.Klikněte na tlačítko
Ok
.
4. Přizpůsobení pohledu
Abychom mohli vytvořit posuvník, je nutné přizpůsobit uživatelské rozhraní implementací rozhraní INodeViewCustomization
.
Zkopírujte následující kód do GridNodeView.cs
.
public class CustomNodeModelView : INodeViewCustomization<GridNodeModel>
definuje nezbytné funkce pro přizpůsobení uživatelského rozhraní.
Po nastavení struktury projektu vytvořte pomocí návrhového prostředí aplikace Visual Studio uživatelský ovládací prvek a definujte jeho parametry v souboru .xaml
. Ze sady nástrojů přidejte posuvník do části <Grid>...</Grid>
.
Klikněte pravým tlačítkem na
CustomNodeModel
a vyberteAdd > New Item
.Vyberte
WPF
.Pojmenujte uživatelský ovládací prvek jako
Slider
.Klikněte na tlačítko
Add
Zkopírujte následující kód do souboru Slider.xaml
.
Parametry posuvníku jsou definovány v souboru .xaml
. Atributy Minimální a Maximální definují číselný rozsah tohoto posuvníku.
V části <Grid>...</Grid>
můžeme umístit různé uživatelské ovládací prvky ze sady nástrojů aplikace Visual Studio.
Když jsme vytvořili soubor Slider.xaml
, aplikace Visual Studio automaticky vytvořila soubor C# s názvem Slider.xaml.cs
, který inicializuje posuvník. Změňte jmenný prostor v tomto souboru.
Jmenný prostor by měl být CustomNodeModel.CustomNodeModel
.
Soubor GridNodeModel.cs
definuje logiku výpočtu posuvníku.
5. Konfigurace balíčku
Před vytvořením projektu je posledním krokem přidání souboru pkg.json
, aby aplikace Dynamo mohla načíst balíček.
Klikněte pravým tlačítkem na
CustomNodeModel
a vyberteAdd > New Item
.Vyberte
Web
.Vyberte
JSON File
.Pojmenujte soubor jako
pkg.json
.Klikněte na tlačítko
Add
Zkopírujte následující kód do souboru pkg.json
.
"name":
určuje název balíčku a jeho skupinu v knihovně aplikace Dynamo.
"keywords":
poskytuje vyhledávací termíny pro vyhledávání v knihovně aplikace Dynamo.
"node_libraries": []
definuje knihovny asociované s balíčkem.
Posledním krokem je vytvoření řešení a publikování jako balíčku aplikace Dynamo. Informace o tom, jak vytvořit místní balíček před publikováním online a jak sestavit balíček přímo z aplikace Visual Studio, naleznete v kapitole Rozmístění balíčku.
Když nyní víme, jak vytvořit projekt Zero-Touch, můžeme se podrobněji seznámit se specifiky vytváření uzlu a projít si příklad ZeroTouchEssentials na Githubu aplikace Dynamo.
Mnoho standardních uzlů aplikace Dynamo jsou v podstatě uzly Zero-Touch, například většina výše uvedených uzlů Math, Color a DateTime.
Nejprve si stáhněte projekt ZeroTouchEssentials z tohoto umístění: https://github.com/DynamoDS/ZeroTouchEssentials
V aplikaci Visual Studio otevřete soubor řešení ZeroTouchEssentials.sln
a sestavte řešení.
Soubor
ZeroTouchEssentials.cs
obsahuje všechny metody, které budeme importovat do aplikace Dynamo.
Otevřete aplikaci Dynamo a importujte knihovnu ZeroTouchEssentials.dll
, abyste získali uzly, na které budeme odkazovat v následujících příkladech.
Příklady kódu jsou získány ze souboru ZeroTouchEssentials.cs a obecně se s ním shodují. Dokumentace XML byla odstraněna, aby byl projekt stručnější, a každý příklad kódu vytvoří uzel na obrázku nad ním.
Aplikace Dynamo podporuje definici výchozích hodnot vstupních portů v uzlu. Tyto výchozí hodnoty budou do uzlu zadány, pokud porty nemají žádná připojení. Výchozí hodnoty jsou vyjádřeny pomocí mechanismu jazyka C# pro zadávání volitelných argumentů popsaném v Příručce programování v jazyce C#. Výchozí hodnoty jsou určeny následujícím způsobem:
Nastavte parametry metody na výchozí hodnotu: inputNumber = 2.0
Výchozí hodnota se zobrazí, když umístíte kurzor nad vstupní port uzlu.
Vracení více hodnot je o něco složitější než vytváření více vstupů a je třeba je vracet pomocí slovníku. Položky slovníku se stanou porty na výstupní straně uzlu. Porty vracející více hodnot se vytvářejí následujícím způsobem:
Přidejte using System.Collections.Generic;
pro použití položky Dictionary<>
.
Přidejte using Autodesk.DesignScript.Runtime;
pro použití atributu MultiReturn
. Tento kód odkazuje na knihovnu DynamoServices.dll z balíčku DynamoServices NuGet.
Přidejte do metody atribut [MultiReturn(new[] { "string1", "string2", ... more strings here })]
. Řetězce odkazují na klíče ve slovníku a stanou se názvy výstupních portů.
Vraťte Dictionary<>
z funkce s klíči, které odpovídají názvům parametrů v atributu: return new Dictionary<string, object>
Podívejte se na tento příklad kódu v souboru ZeroTouchEssentials.cs.
Uzel, který vrací více výstupů.
Všimněte si, že nyní existují dva výstupní porty pojmenované podle řetězců, které jsme zadali pro klíče slovníku.
Osvědčeným postupem je přidat k uzlům aplikace Dynamo dokumentaci, která popisuje funkci uzlu, vstupy, výstupy, vyhledávací štítky atd. To se provádí pomocí štítků dokumentace XML. Dokumentace XML je vytvořena následujícím způsobem:
Za dokumentaci se považuje jakýkoli text komentáře, kterému předcházejí tři lomítka.
Například: /// Documentation text and XML goes here
Za třemi lomítky vytvořte nad metodami štítky XML, které aplikace Dynamo přečte při importu knihovny DLL.
Například: /// <summary>...</summary>
Povolte dokumentaci XML v aplikaci Visual Studio výběrem možnosti Project > Project Properties > Build
a zaškrtnutím políčka XML documentation file
.
Aplikace Visual Studio vygeneruje soubor XML v zadaném umístění.
Typy štítků jsou následující:
/// <summary>...</summary>
je hlavní dokumentace pro uzel a zobrazí se jako popisek nad uzlem v levém postranním panelu vyhledávání.
/// <param name="inputName">...</param>
vytvoří dokumentaci pro specifické vstupní parametry.
/// <returns>...</returns>
vytvoří dokumentaci pro výstupní parametr.
/// <returns name = "outputName">...</returns>
vytvoří dokumentaci pro více výstupních parametrů.
/// <search>...</search>
porovná uzel s výsledky hledání na základě seznamu odděleného čárkou. Pokud například vytvoříme uzel, který rozdělí síť, může být vhodné přidat štítky jako „sít“, „dělení“ a „catmull-clark“.
Níže je uveden příklad uzlu s popisem vstupu a výstupu a také souhrnem, který se zobrazí v knihovně.
Podívejte se na tento příklad kódu v souboru ZeroTouchEssentials.cs.
Všimněte si, že kód pro tento vzorový uzel obsahuje:
Souhrn uzlu
Popis vstupu
Popis výstupu
Aplikace Dynamo nemá klíčové slovo new
, takže objekty bude nutné konstruovat pomocí statických konstrukčních metod. Objekty jsou konstruovány následujícím způsobem:
Změňte konstruktor na vnitřní internal ZeroTouchEssentials()
, pokud není vyžadováno jinak.
Konstruujte objekt pomocí statické metody, například public static ZeroTouchEssentials ByTwoDoubles(a, b)
.
Poznámka: Aplikace Dynamo používá předponu „By“ pro označení statické metody jako konstruktoru, a i když je to volitelné, použití předpony „By“ pomůže vaší knihovně lépe se přizpůsobit existujícímu stylu aplikace Dynamo.
Podívejte se na tento příklad kódu v souboru ZeroTouchEssentials.cs.
Po importu knihovny dll ZeroTouchEssentials bude v knihovně uzel ZeroTouchEssentials. Tento objekt lze vytvořit pomocí uzlu ByTwoDoubles
.
Knihovny aplikace Dynamo mohou jako vstupy použít nativní typy geometrie aplikace Dynamo a jako výstupy vytvořit novou geometrii. Typy geometrie se vytvářejí následujícím způsobem:
Odkaz na knihovnu ProtoGeometry.dll v projektu vložte pomocíusing Autodesk.DesignScript.Geometry;
na začátek souboru C# a přidáním balíčku ZeroTouchLibrary NuGet do projektu.
Důležité: Spravujte zdroje geometrie, které nejsou vráceny z funkcí. Další informace naleznete v části Příkazy dispose/using níže.
Poznámka: Objekty geometrie aplikace Dynamo jsou používány jako jakékoli jiné objekty předávané funkcím.
Podívejte se na tento příklad kódu v souboru ZeroTouchEssentials.cs.
Uzel, který získá délku křivky a zdvojnásobí ji.
Tento uzel přijímá jako vstup typ geometrie Křivka.
Zdroje geometrie, které nejsou vráceny z funkcí, bude nutné spravovat ručně, pokud nepoužíváte aplikaci Dynamo verze 2.5 nebo novější. V aplikaci Dynamo 2.5 a novějších verzích jsou zdroje geometrie interně zpracovány systémem, ale i přesto může být nutné odstranit geometrii ručně, pokud máte složitý případ použití nebo potřebujete omezit paměť v pevně dané době. Modul aplikace Dynamo zpracuje všechny zdroje geometrie, které jsou vráceny z funkcí. Zdroje geometrie, které nejsou vráceny, lze zpracovat ručně následujícími způsoby:
Pomocí příkazu using:
Příkaz using je zdokumentován zde.
Další informace o nových funkcích stability v aplikaci Dynamo 2.5 naleznete v části Vylepšení stability geometrie aplikace Dynamo.
Pomocí ručního volání příkazu Dispose:
Při publikování novější verze knihovny se mohou změnit názvy uzlů. Změny názvů lze zadat v souboru migrace, aby grafy vytvořené na základě předchozích verzí knihovny správně fungovaly i po aktualizaci. Migrace jsou implementovány následujícím způsobem:
Vytvořte soubor .xml
ve stejné složce jako soubor .dll
v následujícím formátu: „BaseDLLName“.Migrations.xml.
V souboru .xml
vytvořte jeden prvek <migrations>...</migrations>
.
V prvku migrace vytvořte prvky <priorNameHint>...</priorNameHint>
pro každou změnu názvu.
Pro každou změnu názvu zadejte prvek <oldName>...</oldName>
a <newName>...</newName>
.
Klikněte pravým tlačítkem myši a vyberte příkaz
Add > New Item
.Zvolte
XML File
.Pro tento projekt bychom soubor migrace pojmenovali
ZeroTouchEssentials.Migrations.xml
.
Tento vzorový kód sděluje aplikaci Dynamo, že každý uzel s názvem GetClosestPoint
má nyní název ClosestPointTo
.
Podívejte se na tento příklad kódu v souboru ProtoGeometry.Migrations.xml.
Funkce Zero-Touch v současné době nepodporuje použití generických typů. Lze je použít, ale ne v kódu, který je přímo importován tam, kde tento typ není nastaven. Metody, vlastnosti nebo třídy, které jsou obecné a nemají sadu typů, nelze zpřístupnit.
V níže uvedeném příkladu nebude importován uzel Zero-Touch typu T
. Pokud bude zbytek knihovny importován do aplikace Dynamo, budou existovat výjimky chybějících typů.
Použití obecného typu s typem nastaveným v tomto příkladu bude importováno do aplikace Dynamo.
Tato část obsahuje informace o problémech, se kterými se můžete setkat při migraci grafů, balíčků a knihoven do aplikace Dynamo 3.x.
Aplikace Dynamo 3.0 je hlavní verzí, ve které byla změněna nebo odstraněna některá rozhraní API. Největší změnou, která se vás jako vývojáře nebo uživatele aplikace Dynamo 3.x pravděpodobně dotkne, je přechod na rozhraní .NET 8.
Rozhraní .NET je modul runtime, který používá jazyk C#, v němž je aplikace Dynamo napsána. Spolu s ostatními částmi ekosystému Autodesk jsme aktualizovali na moderní verzi tohoto modulu runtime.
Další informace naleznete v .
Protože aplikace Dynamo 3.x nyní využívá rozhraní .NET 8, není u balíčků, které byly vytvořeny pro aplikaci Dynamo 2.x (pomocí rozhraní .NET 48), zaručeno, že budou fungovat v aplikaci Dynamo 3.x. Při pokusu o stažení balíčku v aplikaci Dynamo 3.x, který byl publikován z verze aplikace Dynamo nižší než 3.0, se zobrazí upozornění, že balíček pochází ze starší verze aplikace.
To neznamená, že balíček nebude fungovat. Jedná se pouze o upozornění, že může dojít k problémům s kompatibilitou, a obecně je vhodné zkontrolovat, zda existuje novější verze, která byla vytvořena speciálně pro aplikaci Dynamo 3.x.
Tento typ upozornění můžete také zaznamenat v souborech protokolu aplikace Dynamo při načítání balíčku. Pokud vše funguje správně, můžete ho ignorovat.
Je velmi nepravděpodobné, že balíček vytvořený pro aplikaci Dynamo 3.x (pomocí rozhraní .Net 8) bude fungovat v aplikaci Dynamo 2.x. Při stahování balíčků vytvořených pro novější verze systému Dynamo se při používání starší verze zobrazí upozornění.
Než se pustíte do vývoje, je důležité vybudovat pevné základy nového projektu. V komunitě vývojářů aplikace Dynamo existuje několik šablon projektů, které jsou vynikajícím východiskem pro zahájení práce, ale ještě cennější je porozumět tomu, jak začít projekt od začátku. Vytvoření projektu od základů umožní hlubší pochopení procesu vývoje.
Visual Studio je výkonné integrované vývojové prostředí, ve kterém můžeme vytvořit projekt, přidat odkazy, vytvořit knihovny .dlls
a provádět ladění. Při tvorbě nového projektu vytvoří aplikace Visual Studio také tzv. řešení, což je struktura pro uspořádání projektů. V rámci jednoho řešení může existovat více projektů, které lze vytvářet společně. Chcete-li vytvořit uzel ZeroTouch, bude nutné vytvořit nový projekt aplikace Visual Studio, do kterého zapíšeme knihovnu tříd C# a vytvoříme knihovnu .dll
.
Okno Nový projekt v aplikaci Visual Studio
Začněte otevřením aplikace Visual Studio a vytvořením nového projektu:
File > New > Project
.Vyberte šablonu projektu
Class Library
.Pojmenujte projekt (v tomto příkladu je název projektu MyCustomNode).
Nastavte cestu k souboru projektu. V tomto příkladu jej necháme ve výchozím umístění.
Klikněte na tlačítko
Ok
.
Aplikace Visual Studio automaticky vytvoří a otevře soubor v jazyce C#. Měli bychom mu dát vhodný název, nastavit pracovní prostor a nahradit výchozí kód touto metodou násobení.
Z nabídky
View
otevřete okna Průzkumník řešení a Výstup.V Průzkumníku řešení na pravé straně přejmenujte soubor
Class1.cs
naSampleFunctions.cs
.Přidejte výše uvedený kód pro funkci násobení. Způsob, jak aplikace Dynamo přečte vaše třídy C#, probereme později.
Průzkumník řešení: Poskytuje přístup ke všem položkám v projektu.
Okno Výstup: Později jej budeme potřebovat, abychom zjistili, zda bylo sestavení úspěšné.
Dalším krokem je sestavení projektu, ale před provedením tohoto kroku je třeba zkontrolovat několik nastavení. Nejprve se ujistěte, že jako cílová platforma je vybrána možnost Any CPU
nebo x64
a že ve vlastnostech projektu není zaškrtnuto políčko Prefer 32-bit
.
Otevřete vlastnosti projektu výběrem
Project > "ProjectName" Properties
.Vyberte stránku
Build
.V rozevírací nabídce vyberte možnost
Any CPU
nebox64
.Ujistěte se, že není zaškrtnuto políčko
Prefer 32-bit
.
Nyní můžeme sestavit projekt, který vytvoří knihovnu .dll
. To provedete buď výběrem položky Build Solution
v nabídce Build
nebo pomocí klávesové zkratky CTRL+SHIFT+B
.
Vyberte
Build > Build Solution
.Úspěšné sestavení projektu můžete ověřit v okně Výstup.
Pokud byl projekt úspěšně vytvořen, bude ve složce projektu bin
uvedena knihovna .dll
s názvem MyCustomNode
. V tomto příkladu jsme pro cestu k souborům projektu ponechali výchozí nastavení aplikace Visual Studio, tj. c:\users\username\documents\visual studio 2015\Projects
. Podívejme se na strukturu souborů projektu.
Složka
bin
obsahuje knihovnu.dll
vytvořenou z aplikace Visual Studio.Soubor projektu aplikace Visual Studio.
Soubor třídy.
Protože byla konfigurace řešení nastavena na
Debug
, bude knihovna.dll
vytvořena ve složcebin\Debug
.
Nyní můžeme otevřít aplikaci Dynamo a importovat knihovnu .dll
. Pomocí funkce Přidat přejděte do umístění projektu bin
a vyberte knihovnu .dll
, kterou chcete otevřít.
Klikněte na tlačítko Přidat, abyste mohli importovat knihovnu
.dll
.Přejděte do umístění projektu. Projekt se nachází ve výchozí cestě k souborům aplikace Visual Studio:
C:\Users\username\Documents\Visual Studio 2015\Projects\MyCustomNode
Vyberte soubor
MyCustomNode.dll
, který chcete importovat.Kliknutím na tlačítko
Open
načtěte soubor.dll
.
Pokud je v knihovně vytvořena kategorie s názvem MyCustomNode
, byla knihovna .dll úspěšně importována! Aplikace Dynamo však vytvořila dva uzly, přičemž my jsme chtěli mít pouze jeden uzel. V další části vysvětlíme, proč k tomu dochází a jak aplikace Dynamo načítá knihovnu .dll.
Kategorie MyCustomNode v knihovně aplikace Dynamo. Kategorie knihovny je určena názvem knihovny
.dll
.Uzel SampleFunctions.MultiplyByTwo na kreslicí ploše.
Když aplikace Dynamo načte knihovnu .dll, zobrazí všechny veřejné statické metody jako uzly. Konstruktory, metody a vlastnosti budou převedeny na uzly pro tvorbu, akci a dotazování. V našem příkladu násobení se metoda MultiplyByTwo()
v aplikaci Dynamo stane uzlem akce. Je tomu tak proto, že uzel byl pojmenován na základě své metody a třídy.
Vstup je pojmenován
inputNumber
na základě názvu parametru metody.Ve výchozím nastavení je výstup pojmenován
double
, protože se jedná o tento vrácený typ dat.Uzel je pojmenován
SampleFunctions.MultiplyByTwo
, protože se jedná o názvy tříd a metod.
Ve výše uvedeném příkladu byl vytvořen uzel tvorby SampleFunctions
, protože jsme explicitně neposkytli konstruktor, a proto byl vytvořen automaticky. Tomu se můžeme vyhnout vytvořením prázdného soukromého konstruktoru ve třídě SampleFunctions
.
Aplikace Dynamo naimportovala naši metodu jako uzel tvorby.
Uzel násobení je velmi jednoduchý a nejsou nutné žádné odkazy na aplikaci Dynamo. Pokud ale chceme získat přístup k některé z funkcí aplikace Dynamo, například k vytváření geometrie, bude nutné odkazovat na balíčky NuGet aplikace Dynamo.
Chcete-li v projektu aplikace Visual Studio odkazovat na tyto balíčky, stáhněte si požadovaný balíček z webu NuGet pomocí výše uvedených odkazů a ručně odkazujte na knihovny .dll, nebo použijte Správce balíčků NuGet v aplikaci Visual Studio. Nejprve si ukážeme, jak je nainstalovat pomocí Správce balíčků NuGet v aplikaci Visual Studio.
Otevřete Správce balíčků NuGet výběrem možnosti
Tools > NuGet Package Manager > Manage NuGet Packages for Solution...
.
Toto je Správce balíčků NuGet. Toto okno ukazuje, jaké balíčky byly pro projekt nainstalovány, a umožňuje uživateli vyhledat další. Pokud je vydána nová verze balíčku DynamoServices, lze odtud balíčky aktualizovat nebo vrátit ke starší verzi.
Klikněte na tlačítko Procházet a vyhledáním položky DynamoVisualProgramming zobrazte balíčky aplikace Dynamo.
Balíčky aplikace Dynamo Výběrem některého z nich zobrazíte jeho aktuální verzi a popis toho, co je uvnitř.
Vyberte verzi balíčku, kterou potřebujete, a klikněte na tlačítko Instalovat. Tím se nainstaluje balíček pro konkrétní projekt, se kterým pracujete. Protože používáme nejnovější stabilní verzi aplikace Dynamo, verzi 1.3, vyberte odpovídající verzi balíčku.
Chcete-li ručně přidat balíček stažený z prohlížeče, otevřete Správce odkazů z Průzkumníku řešení a vyhledejte požadovaný balíček.
Klikněte pravým tlačítkem myši na položku
References
a vyberte příkazAdd Reference
.Klikněte na tlačítko
Browse
a přejděte do umístění balíčku.
Nyní, když je aplikace Visual Studio správně nakonfigurována a úspěšně jsme přidali knihovnu .dll
do aplikace Dynamo, máme pevný základ pro další koncepty. Toto je pouze začátek, proto pokračujte dalším tématem, ve kterém se dozvíte více o tom, jak vytvořit vlastní uzel.
Aplikace Dynamo 2.0 je hlavní verzí, ve které byla změněna nebo odstraněna některá rozhraní API. Jednou z největších změn, která se dotkne autorů uzlů a balíčků, je přechod na formát souborů JSON.
Obecně platí, že autoři uzlů Zero Touch nebudou mít se zprovozněním svých balíčků ve verzi 2.0 mnoho práce.
Zprovoznění uzlů uživatelského rozhraní a uzlů, které se odvozují přímo z uzlu NodeModel, bude ve verzi 2.x vyžadovat větší úsilí.
Autoři rozšíření mohou také provést některé potenciální změny – v závislosti na tom, kolik rozhraní API jádra aplikace Dynamo používají ve svých rozšířeních.
Nezahrnujte do svých balíčků knihovny DLL aplikace Dynamo nebo Dynamo Revit. Tyto knihovny DLL již budou načteny aplikací Dynamo. Pokud přibalíte jinou verzi, než má uživatel načtenou (tj. distribuujete jádro aplikace Dynamo 1.3, ale uživatel spouští balíček v aplikaci Dynamo 2.0), bude docházet k neočekávaným chybám za běhu. To zahrnuje knihovny DLL jako DynamoCore.dll
, DynamoServices.dll
, DSCodeNodes.dll
a ProtoGeometry.dll
.
Pokud se tomu můžete vyhnout, nezahrnujte do svého balíčku knihovnu newtonsoft.json.net
a nedistribuujte ji. Tato knihovna DLL již bude načtena aplikací Dynamo 2.x. Může dojít ke stejnému problému jako výše.
Pokud se tomu můžete vyhnout, nezahrnujte do svého balíčku knihovnu CEFSharp
a nedistribuujte ji. Tato knihovna DLL již bude načtena aplikací Dynamo 2.x. Může dojít ke stejnému problému jako výše.
Obecně se vyhněte sdílení závislostí s aplikací Dynamo nebo Revit, pokud potřebujete kontrolovat verzi dané závislosti.
1) Po otevření grafu mají některé uzly více portů se stejným názvem, ale při uložení vypadal graf v pořádku. Tento problém může mít několik příčin.
Obvyklou hlavní příčinou je, že uzel byl vytvořen pomocí konstruktoru, který znovu vytvořil porty. Místo toho měl být použit konstruktor, který porty načte. Tyto konstruktory jsou obvykle označeny [JsonConstructor]
viz příklady níže.
K tomu může dojít z následujících důvodů:
Jednoduše nebyl nalezen odpovídající konstruktor [JsonConstructor]
nebo mu nebyly předány Inports
a Outports
ze souboru .dyn JSON.
Do stejného procesu byly načteny dvě verze rozhraní JSON.net současně, což způsobilo chybu modulu runtime rozhraní .net, takže atribut [JsonConstructor]
nebylo možné správně použít k označení konstruktoru.
K balíčku byl přibalen soubor DynamoServices.dll s jinou verzí, než je aktuální verze aplikace Dynamo, což způsobuje, že modul runtime rozhraní .net nedokáže identifikovat atribut [MultiReturn]
, takže u uzlů Zero Touch označených různými atributy nebudou tyto atributy použity. Může se stát, že uzel vrací jeden výstup slovníku místo více portů.
2) Při načítání grafu zcela chybí uzly a v konzoli se zobrazují chyby.
K tomu může dojít, pokud se z nějakého důvodu nezdařila deserializace. Je vhodné serializovat pouze vlastnosti, které potřebujete. Chcete-li ignorovat složité vlastnosti, které není nutné načíst nebo uložit, můžete použít [JsonIgnore]
. Jedná se o vlastnosti jako function pointer, delegate, action,
nebo event
atd. Tyto vlastnosti by neměly být serializovány, protože se je obvykle nepodaří deserializovat a způsobí chybu za běhu.
Známé problémy:
Komentáře budou namísto řádkových komentářů převedeny na blokové komentáře.
Krátké názvy typů budou nahrazeny úplnými názvy. Pokud jste například nezadali typ, při opětovném načtení vlastního uzlu se zobrazí var[]..[]
, protože se jedná o výchozí typ.
V aplikaci Dynamo 2.0 byly rozděleny typy seznamů a slovníků a byla změněna syntaxe pro vytváření seznamů a slovníků. Seznamy jsou inicializovány pomocí []
, zatímco slovníky používají {}
.
Pokud jste dříve používali atribut DefaultArgument
k označení parametrů v uzlech Zero Touch a používali syntaxi seznamu pro výchozí nastavení konkrétního seznamu, například someFunc([DefaultArgument("{0,1,2}")])
, toto již nebude platné a bude nutné upravit úryvek jazyka DesignScript, aby používal novou inicializační syntaxi pro seznamy.
Jak bylo uvedeno výše, nedistribuujte knihovny DLL aplikace Dynamo s balíčky (DynamoCore
, DynamoServices
atd.).
Uzly Node Model vyžadují při aktualizaci na verzi Dynamo 2.x nejvíce práce. Na vysoké úrovni budete kromě běžných konstruktorů nodeModel, které se používají k vytváření instancí nových instancí typů uzlů, muset implementovat konstruktory, které budou použity pouze k načtení uzlů ze JSON. K jejich rozlišení označte konstruktory načítání pomocí [JsonConstructor]
, což je atribut z rozhraní newtonsoft.Json.net.
Nejčastější změnou vyžadovanou k aktualizaci uzlů odvozených ze základní třídy NodeModel
(nebo jiných základních tříd jádra aplikace Dynamo, tj. DSDropDownBase
), je nutnost přidat do třídy konstruktor JSON.
Původní bezparametrický konstruktor bude stále schopen inicializovat nový uzel vytvořený v aplikaci Dynamo (například prostřednictvím knihovny). Konstruktor JSON je vyžadován k inicializaci uzlu, který je deserializován (načten) z uloženého souboru .dyn nebo .dyf.
Konstruktor JSON se liší od základního konstruktoru tím, že obsahuje parametry PortModel
pro inPorts
a outPorts
, které jsou poskytovány logikou načítání JSON. Volání k registraci portů pro uzel zde není vyžadováno, protože data existují v souboru .dyn. Příklad konstruktoru JSON vypadá následovně:
using Newtonsoft.Json; //New dependency for Json
………
[JsonConstructor] //Attribute required to identity the Json constructor
//Minimum constructor implementation. Note that the base method invocation must also be present.
FooNode(IEnumerable<PortModel> inPorts, IEnumerable<PortModel> outPorts) : base(inPorts, outPorts) { }
Tato syntaxe :base(Inports,outPorts){}
volá základní konstruktor nodeModel
a předává mu deserializované porty.
Jakékoli speciální logiky, které existovaly v konstruktoru třídy a zahrnují inicializaci specifických dat serializovaných do souboru .dyn (například nastavení registrace portů, strategie vázání atd.), není nutné v tomto konstruktoru opakovat, protože tyto hodnoty lze načíst ze JSON.
Jedná se o hlavní rozdíl mezi konstruktorem JSON a jinými konstruktory, pro vaše uzly nodeModel. Konstruktory JSON jsou vyvolány při načítání ze souboru a jsou jim předána načtená data. Ostatní uživatelská logika však musí být duplikována v konstruktoru JSON (například inicializace ovladačů událostí pro uzel nebo připojování).
[JsonProperty(PropertyName = "InputValue")]
public DSColor DsColor {...
Poznámka
Pokud vytvoříte vlastní třídu převodníku JSON.net, aplikace Dynamo v současné době nemá mechanismus, který by umožňoval jeho začlenění do metod načítání a ukládání, takže i když svou třídu označíte atributem [JsonConverter]
, nemusí být použita – místo toho můžete volat převodník přímo v metodě setter nebo getter. //Toto omezení je třeba potvrdit. Všechny důkazy jsou vítány.
[JsonProperty("MeasurementType"), JsonConverter(typeof(StringEnumConverter))]
public ConversionMetricUnit SelectedMetricConversion{...
Jak je uvedeno výše, metody SerializeCore
a DeserializeCore
se v minulosti používaly k ukládání a načítání uzlů do souboru xml s příponou .dyn. Kromě toho se také používaly a stále používají k ukládání a načítání stavu uzlu pro operace Zpět/Znovu. Pokud chcete pro uzel nodeModel uživatelského rozhraní implementovat složité funkce Zpět/Znovu, bude nutné tyto metody implementovat a serializovat do objektu dokumentu XML, který je těmto metodám poskytován jako parametr. To by měl být vzácný případ použití s výjimkou složitých uzlů uživatelského rozhraní.
Jednou z běžných událostí v uzlech nodeModel, kterých se týkají změny rozhraní API verze 2.0, je registrace portu v konstruktoru uzlu. Při prohlížení příkladů v úložišti Dynamo nebo DynamoSamples jste dříve mohli zaznamenat použití metod InPortData.Add()
nebo OutPortData.Add()
. V rozhraní API aplikace Dynamo byly dříve veřejné vlastnosti InPortData
a OutPortData
označeny jako zastaralé. Ve verzi 2.0 byly tyto vlastnosti odstraněny. Vývojáři by nyní měli používat metody InPorts.Add()
a OutPorts.Add()
. Kromě toho mají tyto dvě metody Add()
mírně odlišné signatury:
InPortData.Add(new PortData("Port Name", "Port Description")); //Old version valid in 1.3 but now deprecated
vs.
InPorts.Add(new PortModel(PortType.Input, this, new PortData("Port Name", "Port Description"))); //Recommended 2.0
Nyní si ukážeme aktualizaci uzlu uživatelského rozhraní verze 1.3 na verzi Dynamo 2.x.
Vše, co je potřeba udělat s touto třídou nodeModel
, aby se správně načítala a ukládala ve verzi 2.0, je přidat konstruktor jsonConstructor, který se stará o načítání portů. Jednoduše předáme porty základnímu konstruktoru a tato implementace je prázdná.
Poznámka: Nevolejte v konstruktoru JsonConstructor funkci RegisterPorts()
nebo některou její variantu – ta by použila atributy vstupních a výstupních parametrů třídy uzlů k vytvoření nových portů! To je nežádoucí chování, protože chceme používat načtené porty, které jsou předány konstruktoru.
Zde je složitější konstruktor pro uzel uživatelského rozhraní:
Když přidáme konstruktor JSON pro načtení tohoto uzlu ze souboru, je nutné znovu vytvořit část této logiky, ale všimněte si, že nezadáváme kód, který vytváří porty, nastavuje vázání nebo nastavuje výchozí hodnoty vlastností, které lze ze souboru načíst.
Všimněte si, že další veřejné vlastnosti, které byly serializovány do souboru JSON, jako ButtonText
a WindowText
, nebudou přidány jako explicitní parametry ke konstruktoru – jsou automaticky nastaveny rozhraním JSON.net pomocí metod setter pro tyto vlastnosti.
– Balíček pro vytváření knihoven uzlů Zero Touch pro aplikaci Dynamo, který obsahuje následující knihovny: DynamoUnits.dll a ProtoGeometry.dll.
– Balíček pro vytváření knihoven uzlů pro aplikaci Dynamo s vlastním uživatelským rozhraním ve WPF, který obsahuje následující knihovny: DynamoCoreWpf.dll, CoreNodeModels.dll a CoreNodeModelWpf.dll.
– Knihovna DynamoServices pro aplikaci Dynamo.
– Infrastruktura pro testování jednotek a systémů pro aplikaci Dynamo, která obsahuje následující knihovny: DSIronPython.dll, DynamoApplications.dll, DynamoCore.dll, DynamoInstallDetective.dll, DynamoShapeManager.dll, DynamoUtilities.dll, ProtoCore.dll a VMDataBridge.dll.
– Infrastruktura pro testování jednotek a systémů aplikace Dynamo, která obsahuje následující knihovny: DynamoCoreTests.dll, SystemTestServices.dll a TestServices.dll.
– Balíček pro vytváření hlavních uzlů pro aplikaci Dynamo, který obsahuje následující knihovny: Analysis.dll, GeometryColour.dll a DSCoreNodes.dll.
Shodný název vlastního uzlu a název kategorie na stejné úrovni v souboru librarie.js způsobuje neočekávané chování. – vyhněte se použití stejných názvů pro kategorie a uzly.
Názvy parametrů v konstruktoru by obecně měly odpovídat názvům vlastností JSON. Toto mapování se však komplikuje, pokud přepíšete názvy, které jsou serializovány, pomocí atributů [JsonProperty].
Příklady naleznete v úložišti DynamoSamples - > , nebo .
Dříve mohl vývojář serializovat a deserializovat konkrétní data modelu do dokumentu XML pomocí metod SerializeCore
a DeserializeCore
. Tyto metody v rozhraní API stále existují, ale v budoucí verzi aplikace Dynamo budou vyřazeny (příklad naleznete ). Díky implementaci rozhraní JSON.NET lze nyní vlastnosti public
odvozené třídy NodeModel serializovat přímo do souboru .dyn. Rozhraní JSON.Net poskytuje několik atributů pro řízení způsobu serializace vlastností.
Tento příklad, který určuje PropertyName
, naleznete v úložišti Dynamo.
Příklad, který určuje metodu serializace pro převod vlastnosti na řetězec, naleznete v úložišti Dynamo.
Vlastnostem public
, které nejsou určeny pro serializaci, musí mít přidán atribut [JsonIgnore]
. Při uložení uzlů do souboru .dyn je zajištěno, že tato data budou serializačním mechanismem ignorována a nezpůsobí neočekávané následky při dalším otevření grafu. Příklad si můžete prohlédnout v úložišti Dynamo.
Příklady převedeného kódu naleznete zde v úložišti Dynamo -> nebo .
Další běžný případ použití, který je ovlivněn změnami rozhraní API verze 2.0, se týká metod běžně používaných v metodě BuildAst()
k určení chování uzlu na základě přítomnosti nebo nepřítomnosti konektorů portů. Dříve se k ověření stavu připojeného portu používala metoda HasConnectedInput(index)
. Vývojáři by nyní měli kontrolovat stav připojení portu pomocí vlastnosti InPorts[0].IsConnected
. Příklad naleznete v souboru v úložišti Dynamo.
Tento příklad přidává minimální možné načítání konstruktoru JSON. Co když však potřebujeme provést složitější konstrukční logiku, například nastavit některé podprocesy naslouchání pro obsluhu událostí uvnitř konstruktoru. Další ukázka převzatá z
je uvedena výše v části JsonConstructors Section
tohoto dokumentu.
Rozšíření jsou v ekosystému aplikace Dynamo velmi účinným nástrojem pro vývoj. Umožňují vývojářům vytvářet vlastní funkce založené na interakcích a logice aplikace Dynamo. Rozšíření lze rozdělit na dvě hlavní kategorie: rozšíření a rozšíření pohledu. Jak již název napovídá, systém rozšíření pohledu umožňuje rozšířit uživatelské rozhraní aplikace Dynamo registrací vlastních položek nabídky. Běžná rozšíření fungují velmi podobným způsobem bez uživatelského rozhraní. Můžeme například vytvořit rozšíření, které bude do konzoly aplikace Dynamo zaznamenávat konkrétní informace. Tento scénář nevyžaduje žádné vlastní uživatelské rozhraní, a proto by jej bylo možné provést také pomocí rozšíření.
S využitím příkladu SampleViewExtension z úložiště DynamoSamples na Githubu projdeme kroky potřebné k vytvoření jednoduchého nemodálního okna, které zobrazuje aktivní uzly v grafu v reálném čase Rozšíření pohledu vyžaduje, abychom pro okno vytvořili uživatelské rozhraní a svázali hodnoty s modelem pohledu.
Okno rozšíření pohledu vytvořené podle příkladu SampleViewExtension v úložišti na Githubu.
Ačkoliv budeme tento příklad vytvářet od základů, můžete si také stáhnout a vytvořit úložiště DynamoSamples, které vám poslouží jako reference.
Úložiště DynamoSamples: https://github.com/DynamoDS/DynamoSamples
Tato ukázka bude konkrétně odkazovat na projekt s názvem SampleViewExtension, který se nachází v umístění
DynamoSamples/src/
.
Rozšíření pohledu má tři základní součásti:
Sestava obsahující třídu, která implementuje IViewExtension
, a třídu, která vytváří model pohledu.
Soubor .xml
, který aplikaci Dynamo říká, kde má tuto sestavu za běhu hledat a jaký typ rozšíření má hledat.
Soubor .xaml
, který sváže data s grafickým zobrazením a určuje vzhled okna.
1. Vytvoření struktury projektu
Začněte vytvořením nového projektu Class Library
s názvem SampleViewExtension
.
Vytvořte nový projekt výběrem možnosti
File > New > Project
.Vyberte
Class Library
.Pojmenujte projekt jako
SampleViewExtension
.Klikněte na tlačítko
Ok
.
V tomto projektu budeme potřebovat dvě třídy. Jedna třída implementuje IViewExtension
a druhá implementuje NotificationObject.
. IViewExtension
bude obsahovat všechny informace o tom, jak bude rozšíření nasazeno, načteno, odkazováno a zrušeno. NotificationObject
bude poskytovat oznámení o změnách v aplikaci Dynamo a IDisposable
. Pokud dojde ke změně, počet se odpovídajícím způsobem aktualizuje.
Soubor třídy s názvem
SampleViewExtension.cs
, který implementujeIViewExtension
.Soubor třídy s názvem
SampleWindowViewMode.cs
, který implementujeNotificationObject
.
K použití IViewExtension
budeme potřebovat balíček NuGet WpfUILibrary. Instalace tohoto balíčku automaticky nainstaluje balíčky Core, Services a ZeroTouchLibrary.
Vyberte balíček WpfUILibrary.
Kliknutím na tlačítko
Install
nainstalujte všechny závislé balíčky.
2. Implementace třídy IViewExtension
Ve třídě IViewExtension
určíme, co se stane při spuštění aplikace Dynamo, při načtení rozšíření a při ukončení aplikace Dynamo. Do souboru třídy SampleViewExtension.cs
přidejte následující kód:
Třída SampleViewExtension
vytvoří položku nabídky pro otevření okna, na kterou lze kliknout, a propojí ji k modelu pohledu a oknu.
public class SampleViewExtension : IViewExtension
SampleViewExtension
zdědí z rozhraní IViewExtension
vše, co je k vytvoření položky nabídky potřeba.
sampleMenuItem = new MenuItem { Header = "Show View Extension Sample Window" };
vytvoří objekt MenuItem a přidá jej do nabídky View
.
Položka nabídky
sampleMenuItem.Click += (sender, args)
aktivuje událost, která při kliknutí na položku nabídky otevře nové okno.
MainGrid = { DataContext = viewModel }
nastaví kontext dat pro hlavní osnovu v okně, s odkazem na Main Grid
v souboru .xaml
, který vytvoříme
Owner = p.DynamoWindow
nastaví jako vlastníka našeho místního okna aplikaci Dynamo. To znamená, že nové okno je závislé na aplikaci Dynamo, takže akce, například minimalizace, maximalizace a obnovení aplikace Dynamo, způsobí, že nové okno bude mít stejné chování.
window.Show();
zobrazí okno, kterému byly nastaveny další vlastnosti okna.
3. Implementace modelu pohledu
Nyní, když jsme zadali některé základní parametry okna, přidáme logiku pro reakci na různé události související s aplikací Dynamo a instruujeme uživatelské rozhraní, aby se aktualizovalo na základě těchto událostí. Do souboru třídy SampleWindowViewModel.cs
zkopírujte následující kód:
Tato implementace třídy modelu pohledu naslouchá CurrentWorkspaceModel
a aktivuje událost, když je uzel přidán nebo odstraněn z pracovního prostoru. To vyvolá změnu vlastnosti, která upozorní uživatelské rozhraní nebo vázané prvky, že data byla změněna a je nutné je aktualizovat. Je volán getter ActiveNodeTypes
, který interně volá další pomocnou funkcigetNodeTypes()
. Tato funkce iteruje všechny aktivní uzly na kreslicí ploše, vyplní řetězec obsahující názvy těchto uzlů a vrátí tento řetězec do vazby v souboru XAML, který se zobrazí v našem místním okně.
Po definování základní logiky rozšíření nyní zadáme podrobnosti týkající se vzhledu okna pomocí souboru .xaml
. Vše, co potřebujeme, je jednoduché okno, které zobrazí řetězec prostřednictvím vazby vlastnosti ActiveNodeTypes
v TextBlock
Text
.
Klikněte pravým tlačítkem na projekt a vyberte
Add > New Item...
.Vyberte šablonu User Control, kterou změníme a vytvoříme okno.
Pojmenujte nový soubor jako
SampleWindow.xaml
.Klikněte na tlačítko
Add
.
V kódu .xaml
okna bude nutné svázat SelectedNodesText
k textovému bloku. Přidejte následující kód do souboru SampleWindow.xaml
:
Text="{Binding ActiveNodeTypes}"
se váže k hodnotě vlastnosti ActiveNodeTypes
v souboru SampleWindowViewModel.cs
s hodnotou TextBlock
Text
v okně.
Nyní inicializujeme ukázkové okno v záložním souboru XAML C# SampleWindow.xaml.cs
. Přidejte následující kód do souboru SampleWindow.xaml
:
Rozšíření pohledu je nyní připraveno k sestavení a přidání do aplikace Dynamo. Aplikace Dynamo vyžaduje soubor xml
, aby bylo možné zaregistrovat výstup .dll
jako rozšíření.
Klikněte pravým tlačítkem na projekt a vyberte
Add > New Item...
.Vyberte soubor XML.
Pojmenujte soubor jako
SampleViewExtension_ViewExtensionDefinition.xml
.Klikněte na tlačítko
Add
.
Název souboru se řídí standardem aplikace Dynamo pro odkazování na sestavu rozšíření takto: "extensionName"_ViewExtensionDefinition.xml
V souboru xml
přidejte následující kód, který aplikaci Dynamo řekne, kde má hledat sestavu rozšíření:
V tomto příkladu jsme sestavu vytvořili do výchozí složky projektu aplikace Visual Studio. Nahraďte cíl <AssemblyPath>...</AssemblyPath>
umístěním sestavy.
Posledním krokem je zkopírování souboru SampleViewExtension_ViewExtensionDefinition.xml
do složky rozšíření pohledů aplikace Dynamo, která se nachází v instalačním adresáři jádra aplikace Dynamo C:\Program Files\Dynamo\Dynamo Core\1.3\viewExtensions
. Je důležité si uvědomit, že existují samostatné složky pro extensions
a viewExtensions
. Umístění souboru xml
do nesprávné složky může způsobit nesprávné načtení za běhu.
Soubor
.xml
, který jsme zkopírovali do složky rozšíření pohledů aplikace Dynamo.
Toto je základní úvod k rozšířením pohledu. Propracovanější případovou studii naleznete v balíčku DynaShape, projektu s otevřeným zdrojovým kódem na Githubu. Tento balíček používá rozšíření pohledu, které umožňuje živé úpravy v pohledu modelu aplikace Dynamo.
Instalační program balíčku DynaShape lze stáhnout z fóra aplikace Dynamo: https://forum.dynamobim.com/t/dynashape-published/11666
Zdrojový kód lze klonovat z Githubu: https://github.com/LongNguyenP/DynaShape