V této části příručky Primer jsou uvedeny některé osvědčené postupy. Obsahuje několik zkušenostmi a výzkumem prověřených strategií, které pomohou dosáhnout kvalitních pracovních postupů. Jako konstruktéři a programátoři měříme kvalitu zejména z hlediska udržitelnosti, použitelnosti a efektivity našich nástrojů. Ačkoliv se v následujících příkladech probírají osvědčené postupy pro vizuální nebo textové programování, lze je uplatnit ve všech programovacích prostředích a pracovních postupech.
Před touto kapitolou se příručka Primer zabývala implementací výkonných funkcí vizuálního skriptování v aplikaci Dynamo. Správné pochopení těchto možností je pevným základem a prvním krokem ve vytváření robustních vizuálních programů. Když vizuální programy používáme v ostrém provozu, sdílíme je s kolegy, řešíme chyby nebo zkoušíme meze, vyvstávají další problémy, které je třeba řešit. Pokud váš program bude používat někdo jiný nebo očekáváte, že jej otevřete až za šest měsíců, je v obou případech nutné, aby vše bylo ihned graficky a logicky přehledné. Aplikace Dynamo nabízí mnoho nástrojů ke správě složitosti programu a tato kapitola se zabývá pokyny k tomu, jak tyto nástroje použít.
Při vývoji grafu aplikace Dynamo a zkušebních nápadů může rychle dojít k nárůstu složitosti i velikosti grafu. I když je důležité vytvořit fungující program, je stejně důležité, aby byl co nejjednodušší. Nejenže graf bude fungovat rychleji a předvídatelněji, ale v případě otevření po nějakém čase vy i ostatní uživatelé rychleji porozumí logice grafu. Zde je několik způsobů, které vám pomohou vyjasnit logiku grafu.
Skupiny vám při tvorbě programu umožní vytvářet funkčně odlišné součásti.
Skupiny umožňují přesouvat velké části programu při zachování modularity a zarovnání.
Můžete změnit barvu skupiny k rozlišení toho, co je účelem skupiny (vstupy vs. funkce).
Pomocí skupin můžete vytvořit organizaci grafu ke zjednodušení tvorby uživatelských uzlů.
Barvy v tomto programu určují účel každé skupiny. Pomocí této strategie je možné vytvořit hierarchii v libovolných grafických normách nebo šablonách, které vyvíjíte.
Skupina funkcí (modrá)
Skupina vstupů (oranžová)
Skupina skriptů (zelená)
Informace o tom, jak používat skupiny, naleznete v části Správa programu.
Někdy můžete použít blok kódu k rychlejšímu zadání čísla nebo metody uzlu než při vyhledávání (Point.ByCoordinates, Number, String, Formula).
Bloky kódu jsou užitečné, pokud chcete definovat vlastní funkce v jazyce DesignScript, aby se snížil počet uzlů v grafu.
Vzor 1 i 2 provádí stejnou funkci. Bylo však mnohem rychlejší napsat několik řádků kódu, než vyhledávat a přidávat jednotlivé uzly. Blok kódu je také mnohem výstižnější.
Kód jazyka DesignScript zapsaný v bloku kódu
Ekvivalentní program v uzlech
Informace o použití bloku kódu naleznete v části Co je blok kódu.
Složitost grafu můžete snížit pomocí možnosti Uzel na kód, která vezme kolekci jednoduchých uzlů a zapíše odpovídající skript DesignScript do jednoho bloku kódu.
Možnost Uzel na kód** může zhustit kód, aniž by došlo k porušení přehlednosti programu**.
Následují klady použití možnosti Uzel na kód:
Snadno zhustí kód do jedné komponenty, kterou je stále možné upravit
Může zjednodušit významnou část grafu
Užitečná, pokud „miniprogram“ nebude často upravován
Užitečná k zahrnutí dalších funkcí bloku kódu, například funkce
Následují zápory použití možnosti Uzel na kód:
Obecné pojmenování snižuje čitelnost
Pro některé uživatele je obtížnější na porozumění
Neexistuje snadný způsob, jak se vrátit k verzi vizuálního programování
Existující program
Blok kódu vytvořený pomocí možnosti Uzel na kód
Informace o tom, jak používat možnost Uzel na kód, naleznete v části Syntaxe jazyka DesignScript.
Funkce List@Level pomáhá snížit složitost grafu nahrazením uzlů List.Map a List.Combine, které mohou zabírat značné množství místa na pracovní ploše.
Funkce List@Level nabízí** rychlejší způsob, jak vytvořit logiku uzlu konstrukce, než u uzlů List.Map a List.Combine**, umožněním přístupu k datům na libovolné úrovni v seznamu přímo ze vstupního portu uzlu.
Můžeme ověřit, kolik hodnot True vrátí metoda BoundingBox.Contains a ve kterých seznamech, a to aktivováním funkce List@Level u vstupu seznamu funkce CountTrue. List@Level umožňuje uživateli určit, ze které úrovně se bude přebírat vstup. Použití funkce List@Level je flexibilní, efektivní a vysoce podporované u jiných metod zahrnujících metody List.Map a List.Combine.
Počítání hodnot True na úrovni seznamu 2
Počítání hodnot True na úrovni seznamu 3
Informace o tom, jak používat funkci List@Level, naleznete v části Seznamy seznamů.
Kromě zjednodušení a zefektivnění grafu nejvíce, jak je to možné, snažte se dbát i na grafickou přehlednost. Navzdory nejlepšímu úsilí o intuitivnost grafu s logickými seskupeními nemusí být vztahy zjevné. Jednoduchá poznámka uvnitř skupiny nebo přejmenování posuvníku vám nebo jinému uživateli může ušetřit zbytečné nejasnosti nebo procházení grafu. Následuje několik způsobů, jak uvnitř grafů i mezi nimi zavést grafickou konzistenci.
Chcete-li si ušetřit práci po dokončení tvorby grafu, měli byste se snažit zajistit čitelnost rozvržení uzlů častým zarovnáváním uzlů během práce.
Pokud s grafem budou pracovat i ostatní, měli byste se před jeho odesláním ujistit, že rozvržení drátů a uzlů je přehledné.
Chcete-li si usnadnit zarovnání, použijte funkci Rozvržení uzlů vyčištění k automatickému zarovnání grafu, zarovnání však bude méně přesné, než když je uděláte sami.
Neuspořádaný graf
Zarovnaný graf
Informace o tom, jak používat zarovnání uzlů, naleznete v části Správa programu.
Přejmenování vstupů může ostatním usnadnit porozumění vašemu grafu, zejména pokud jejich vstup nebude vidět na obrazovce.
Buďte opatrní při přejmenovávání jiných uzlů než vstupů. Alternativou je vytvoření vlastního uzlu ze shluku uzlů a jeho přejmenování; bude zřejmé, že obsahuje něco jiného.
Vstupy pro manipulaci s povrchem
Vstupy architektonických parametrů
Vstupy pro skript simulace odvodnění
Chcete-li uzel přejmenovat, klikněte pravým tlačítkem na jeho název a vyberte příkaz „Přejmenovat uzel...“.
Pokud něco v grafu vyžaduje vysvětlení v jednoduchém jazyce, které není možné vyjádřit uzly, měli byste přidat poznámku.
Poznámka by měla být přidána, pokud je kolekce uzlů nebo skupina příliš velká nebo složitá a není možné jí ihned porozumět.
Poznámka popisující část programu, která vrací nezpracované vzdálenosti posunu
Poznámka popisující kód, který mapuje tyto hodnoty na sinusovou vlnu
Postup přidání poznámky naleznete v části Správa programu.
Při tvorbě vizuálního skriptu je důležité ověřit, zda skript vrací očekávaný výstup. Ne všechny chyby nebo problémy způsobí chybu celého programu, zejména hodnoty null nebo nulové hodnoty, které by mohly ovlivnit něco dále v programu. Tato strategie je také popsána v kontextu textového skriptování v části Strategie skriptování. Následující postup vám pomůže zajistit, že skript vrátí očekávaný výstup.
Pomocí uzlů Watch a bublin náhledů můžete při sestavování programu** ověřit, zda se na klíčových výstupech vrací očekávané hodnoty**.
K porovnání se použijí uzly Watch:
Nezpracované vzdálenosti posunu
Hodnoty, které prošly rovnicí sinu
Postup použití sledování naleznete v části Knihovna.
Je vysoce pravděpodobné, váš program otevře i někdo jiný, a to i v případě, že pracujete nezávisle. I tito lidé by měli být schopni rychle porozumět, co program potřebuje na svých vstupech a co vytváří na svých výstupech. Toto je důležité zejména při vývoji vlastního uzlu, který má být sdílen s komunitou aplikace Dynamo a používán v programu jiného uživatele. Tyto postupy vedou k robustním, opakovaně použitelným programům a uzlům.
Aby byla zajištěna čitelnost a škálovatelnost, měli byste se pokusit co nejvíce minimalizovat vstupy a výstupy.
Ještě před přidáním jakéhokoli uzlu na plátno byste se měli pokusit stanovit strategii, jak budete logiku vytvářet, a to tak, že nejprve vytvoříte hrubý náčrt toho, jak by logika mohla fungovat. Při vývoji hrubého obrysu byste měli sledovat, které vstupy a výstupy budou vloženy do skriptů.
Pokud existují konkrétní možnosti nebo podmínky, které chcete do grafu vložit, měli byste použít předvolby, abyste k těmto položkám měli rychlý přístup.
Pomocí předvoleb můžete také snížit složitost ukládáním specifických hodnot posuvníku do mezipaměti u grafu s dlouhou dobou běhu.
Postup použití předvoleb naleznete v části Správa dat s předvolbami.
Pokud je možné program shromáždit do jednoho kontejneru, měli byste použít vlastní uzel.
Vlastní uzel byste měli použít i v případě, že se část grafu často znovu používá v jiných aplikacích.
Pokud chcete sdílet funkce s komunitou aplikace Dynamo, měli byste použít vlastní uzel.
Shromáždění programu sloužícího k převodu bodů do vlastního uzlu učiní robustní, jedinečný program přenositelným a mnohem snadnějším na pochopení. Dobře pojmenované vstupní porty pomohou ostatním uživatelům porozumět tomu, jak tento uzel používat. Nezapomeňte přidávat popisy a požadované typy dat pro každý vstup.
Existující program atraktoru
Vlastní uzel, který tento program shromažďuje, PointGrid
Informace o použití vlastních uzlů naleznete v části Úvod do vlastních uzlů.
Můžete vytvořit šablony pro stanovení grafických standardů ve vizuálních grafech, aby spolupracovníci měli standardizovaný způsob, jak grafům porozumět.
Při tvorbě šablony můžete standardizovat barvy skupin a velikosti písem a kategorizovat tak typy pracovních postupů nebo akcí s daty.
Při tvorbě šablony můžete dokonce standardizovat, jakým způsobem chcete v grafu označovat, barvit nebo stylizovat rozdíly mezi front-end a back-end pracovními postupy.
Uživatelské rozhraní nebo front-end programu obsahuje název projektu, posuvníky vstupu a importovanou geometrii.
Back-end programu.
Seskupení kategorií podle barev (obecný návrh, vstupy, skriptování v jazyce Python, importovaná geometrie).
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Nyní, když bylo stanoveno několik osvědčených postupů, použijeme tyto postupy na rychle sestavený program. I když program při generování střechy uspěje, stav grafu je „mapou mysli“ autora. Chybí jakákoli organizace a popis použití. Projdeme si nejlepší postupy organizace, popisu a analýzy programu, aby ostatní uživatelé mohli porozumět tomu, jak se tento program používá.
Program funguje, ale graf není uspořádán.
Začneme určením dat a geometrie vrácené programem.
Porozumění tomu, kdy dochází k velkým změnám dat, je velmi důležité ke stanovení logického dělení nebo modularity. Zkuste zkontrolovat zbytek programu pomocí uzlů Watch, čímž zjistíte, zda můžete před přechodem na další krok určit skupiny.
Tento blok kódu s matematickou rovnicí vypadá jako klíčový prvek programu. Uzel Watch zobrazuje, že vrací seznamy vzdáleností posunu.
Účel této oblasti není zcela zřejmý. Uspořádání hodnot True na úrovni seznamu L2 z výstupu uzlu BoundingBox.Contains a přítomnost položky List.FilterByBoolMask naznačuje, že jsme vzorkovali část osnovy bodů.
Když teď rozumíte základním prvkům programu, můžeme je umístit do skupin.
Skupiny umožňují uživateli vizuální rozlišení částí programu.
Import 3D modelu pozemku
Osnova převodu bodů založená na rovnici sinu
Ukázková část bodové osnovy
Tvorba povrchu architektonické střechy
Tvorba skleněného obvodového pláště
Jakmile budou skupiny stanoveny, zarovnejte uzly, tak aby vznikla vizuální spojitost přes celý graf.
Vizuální spojitost zlepšuje pro uživatele viditelnost toku programu a implicitních vztahů mezi uzly.
Zlepšete přístup k programu přidáním další hladiny grafických vylepšení. Přidáním poznámek popisujete, jak určitá oblast programu funguje, zadejte u vstupů vlastní názvy a přiřaďte k různým typům skupin barvy.
Tato grafická vylepšení sdělují uživateli více o tom, co program dělá. Různé barvy skupin pomáhají rozlišit vstupy od funkcí.
Poznámky
Vstupy s popisnými názvy
Před zhuštěním programu, je třeba najít strategické umístění, kde představíme simulátor odvodnění ve skriptu jazyka Python. Výstup prvního povrchu střechy s měřítkem připojte k odpovídajícímu vstupu skriptování.
V této části programu jsme se rozhodli integrovat skriptování, aby simulace odvodnění mohla být spuštěna na původním, jediném povrchu střechy. Tento konkrétní povrch není zobrazen v náhledu, ale ušetří krok výběru horního povrchu u zkoseného objektu Polysurface.
Zdrojová geometrie pro vstup skriptu
Uzel jazyka Python
Posuvníky vstupů
„Přepínač“ zapnutí/vypnutí
Nyní, když je vše připraveno, zjednodušíme graf.
Berte v potaz, že program s využitím možnosti Uzel na kód a vlastního uzlu značně zmenšil velikost grafu. Skupiny, které tvoří povrch střechy a stěny, byly převedeny na kód, protože jsou pro tento program velmi specifické. Skupina převodu bodů je obsažena ve vlastním uzlu, protože by mohla být využita i v jiném programu. Ve vzorovém souboru vytvořte vlastní uzel ze skupiny převodu bodů.
Vlastní uzel, který má obsahovat skupinu „osnovy převodu bodů“
Možnost Uzel na kód ke zhuštění skupin „tvorby povrchu architektonické střechy a obvodového pláště“
Jako poslední krok vytvořte předvolby pro ukázkové tvary střechy.
Tyto vstupy jsou primárními ovladači tvaru střechy a díky nim uživatel snadněji pochopí potenciál programu.
Program s pohledy dvou předvoleb.
Vzory odvodnění střechy nabízí uživateli analytický pohled příslušných předvoleb.
Vizuální programování může být kreativní činnost, tok programu a uživatelské vstupy se však můžou velmi rychle stát složitými a na pracovní ploše nepřehlednými. Podívejme se na některé osvědčené postupy pro správu programu.
Jakmile na pracovní plochu přidáte několik uzlů, můžete je chtít přeuspořádat, aby byly přehledné. Výběrem více než jednoho uzlu a kliknutím pravým tlačítkem myši na pracovní plochu se v místním okně zobrazí nabídka Zarovnat výběr s možnostmi pro zarovnání a rozmístění po osách X a Y.
Vyberte více než jeden uzel.
Klikněte pravým tlačítkem myši na pracovní plochu.
Použijte možnosti funkce Zarovnat výběr.
S trochou zkušeností můžeme vizuální program „číst“ tak, že se podíváme na názvy uzlů a budeme sledovat tok programu. Dobrým zvykem je vkládat na pracovní plochu popisy. Aplikace Dynamo obsahuje uzel Notes s upravitelným textovým polem. Poznámky lze na pracovní plochu přidávat dvěma způsoby:
Přejděte do nabídky Upravit > Vytvořit poznámku
Použijte kombinaci kláves Ctrl+W
Po přidání poznámky na pracovní plochu se zobrazí textové pole pro úpravu textu. Po vytvoření lze poznámku upravit dvojitým kliknutím nebo kliknutím pravým tlačítkem na uzel Note.
S tím, jak se vizuální program zvětšuje, může být užitečné označit větší kroky jako celky. Větší kolekce uzlů můžeme zvýraznit jako skupinu a označit je barevným obdélníkem na pozadí a názvem. Pokud je vybrán více než jeden uzel, skupinu lze vytvořit třemi způsoby:
Přejděte do nabídky Upravit > Vytvořit skupinu
Použijte kombinaci kláves Ctrl+G
Klikněte pravým tlačítkem myši na pracovní plochu a vyberte možnost „Vytvořit skupinu“
Po vytvoření skupiny je možné upravit její nastavení, například název a barvu.
Tip: Použití poznámek a skupin je účinný způsob, jak zvýšit přehlednost a srozumitelnost v souboru.
Zde je příklad programu s přidanými poznámkami a skupinami:
Poznámka: „Parametry mřížky“
Poznámka: „Body mřížky“
Skupina: „Tvorba mřížky z bodů“
Skupina: „Tvorba bodu atraktoru“
Poznámka: „Kalibrace hodnot vzdálenosti“
Poznámka: „Proměnná mřížka kružnic“
Tato referenční stránka rozšiřuje doporučené postupy popsané ve skriptovacích strategiích, které obsahují podrobnější informace o knihovnách kódů, opatřování popisky a stylech. Budeme používat jazyk Python k ilustraci níže uvedených koncepcí, ale stejné zásady by platily v jazyce C#(Zerotouch), ale s jinou syntaxí.
Standardní knihovny jsou externí pro aplikaci Dynamo a jsou k dispozici v programovacích jazycích Python a C# (Zerotouch). Aplikace Dynamo má také vlastní sadu knihoven, které přímo odpovídají hierarchii uzlu aplikace Dynamo, což uživateli umožňuje vytvořit v kódu cokoliv, co by mohlo být vytvořeno pomocí uzlů a drátů. V následující části je uveden postup, jak jednotlivé knihovny aplikace Dynamo poskytují přístup a kdy mají používat standardní knihovnu.
Standardní knihovny a knihovny aplikace Dynamo
K vytvoření pokročilých dat a toků struktur v prostředí aplikace Dynamo lze použít i standardní knihovny jazyků Python a C#.
Knihovny aplikace Dynamo přímo odpovídají hierarchii uzlů pro vytváření geometrie a dalších objektů aplikace Dynamo.
Knihovny aplikace Dynamo
ProtoGeometry*
Funkce: Arc, Bounding Box, Circle, Cone, Coordinate System, Cuboid, Curve, Cylinder, Edge, Ellipse, Ellipse Arc ,Face, Geometry, Helix, Index Group, Line, Mesh, Nurbs Curve, Nurbs Surface, Plane, Point, Polygon, Rectangle, Solid, Sphere, Surface, Topology, TSpline, UV, Vector, Vertex.
Způsob importu: import Autodesk.DesignScript.Geometry
``
DSCoreNodes
Funkce: Color, Color Range 2D, Date Time, Time Span, IO, Formula, Logic, List, Math, Quadtree, String, Thread.
Způsob importu: import DSCore
Mozaikování
Funkce: Convex Hull, Delaunay, Voronoi.
Způsob importu: import Tessellation
DSOffice
Funkce: Excel.
Způsob importu: import DSOffice
*Poznámka: Při použití knihovny protoGeometry prostřednictvím jazyka Python nebo C# vytváříte nespravované objekty, které vyžadují ruční správu paměti. Další informace najdete níže v části Nespravované objekty.
Během skriptování používáme identifikátory k označení různých položek, jako jsou proměnné, typy, funkce a další entity. Pomocí tohoto systému symbolické notace, můžeme při vytváření algoritmů využít informace pomocí popisků – obvykle tvořených posloupností znaků. Názorné pojmenování věcí hraje důležitou roli v psaní kódu, který mohou snadno číst a chápat i ostatní uživatelé, stejně jako vaše budoucí já. Zde jsou tipy, které vám pomohou při pojmenování položek ve skriptu:
Zkratky jsou v pořádku, ale vysvětlete je pomocí komentáře:
Vyhněte se nadbytečnému označování popisky:
Místo záporné logiky použijte pro názvy proměnných kladnou logiku:
Upřednostňujte „obrácenou poznámku“:
Z hlediska struktury je to rozumnější.
Zkratky by se měly používat ke zkrácení příliš dlouhých a často opakovaných řetězců:
Používání zkratek může rychle vést k velmi matoucím a nestandardním programům.
Používejte pouze nezbytná slova:
„Všechno by mělo být co nejjednodušší, ale ne jednodušší.“ – Albert Einstein
Obecně řečeno, existuje více než jeden způsob, jak něco programovat, proto je váš „osobní styl“ skriptování výsledkem nespočtu malých rozhodnutí, která se rozhodnete udělat (nebo nedělat) v průběhu práce. To znamená, že čitelnost a udržitelnost kódu jsou přímým výsledkem jeho vnitřní konzistence a dodržování všeobecných stylistických konvencí. Jako orientační pravidlo by měl kód, který vypadá stejně na dvou místech, fungovat stejně. Zde je několik tipů pro zápis jasného a konzistentního kódu.
Konvence pojmenování: (Vyberte jednu z níže uvedených konvencí pro každý typ entity v kódu a držte se jí.)
Proměnné, funkce, metody, balíčky, moduly:
lower_case_with_underscores
Třídy a výjimky:
CapWords
Chráněné metody a vnitřní funkce:
_single_leading_underscore(self, ...)
Soukromé metody:
__double_leading_underscore(self, ...)
Konstanty:
ALL_CAPS_WITH_UNDERSCORES
Tip: Vyhněte se jednopísmenným proměnným (zvláště I, O, I) kromě velmi krátkých bloků, kdy je význam zřetelně viditelný z bezprostředního kontextu.
Použití prázdných řádků:
Definice funkcí a tříd nejvyšší úrovně obklopte dvěma prázdnými řádky.
Definice metody uvnitř třídy jsou obklopeny jedním prázdným řádkem.
Pro oddělení skupin souvisejících funkcí lze použít (střídmě) další prázdné řádky.
Vyhněte se nadbytečným prázdným znakům:
Bezprostředně uvnitř závorek:
Bezprostředně před čárkou, středníkem nebo dvojtečkou:
Bezprostředně před otevřenou závorkou, která začíná seznam argumentů volání funkce:
Bezprostředně před otvírací závorkou, která začíná indexování nebo řezy:
Vždy obklopte tyto binární operátory jednou mezerou na obou stranách:
Dávejte pozor na délku řádků:
Nepřekračujte cca 79 znaků.
Omezení požadované šířky okna editoru umožňuje, aby bylo více souborů otevřeno vedle sebe, a funguje správně při použití nástrojů pro kontrolu kódu, které představují dvě verze v sousedních sloupcích.
Dlouhé řádky lze rozdělit na více řádků zalomením výrazů v závorkách:
Vyhněte se zjevným a nadbytečným komentářům:
Někdy méně komentářů znamená čitelnější kód. Zvláště pokud vás nutí místo toho použít smysluplné názvy symbolů.
Přijetí kvalitních kódovacích návyků snižuje závislost na komentářích:
Tip: Komentáře vám vysvětlují proč, kód vám říká jak.
Podívejte se na otevřený zdrojový kód:
Projekty s otevřeným zdrojovým kódem jsou založeny na spolupráci mnoha vývojářů. Tyto projekty musí udržovat vysokou úroveň čitelnosti kódu, aby tým mohl pracovat co nejúčinněji. Proto je vhodné procházet zdrojový kód těchto projektů a sledovat, co tito vývojáři provádějí.
Vylepšete své konvence:
Je třeba se ptát, zda každá konvence funguje pro současné potřeby.
Je ohrožena funkčnost/účinnost?
Na těchto stránkách Wiki naleznete rady pro psaní C# pro Zerotouch a přispívání do aplikace Dynamo:
Tato nápověda Wiki obsahuje některé obecné standardy kódování pro dokumentaci a testování vašeho kódu: https://github.com/DynamoDS/Dynamo/wiki/Coding-Standards
Tato nápověda Wiki se týká zejména norem pojmenování knihoven, kategorií, názvů uzlů, názvů portů a zkratek: https://github.com/DynamoDS/Dynamo/wiki/Naming-Standards
Nespravované objekty:
Při používání knihovny geometrie aplikace Dynamo (ProtoGeometry) z geometrických objektů v jazyce Python nebo C# nebudou vytvářené objekty spravovány virtuálním počítačem a paměť po mnoha těchto objektech bude nutné vyčistit ručně. Chcete-li vyčistit nativní nebo nespravované objekty, můžete použít metodu Dispose nebo klíčové slovo using. Přehled najdete v této položce Wiki: https://github.com/DynamoDS/Dynamo/wiki/Zero-Touch-Plugin-Development#dispose--using-statement.
Je nutné pouze uvolnit nespravované zdroje, které se nevrací do grafu, nebo se na ně neukládá odkaz. Ve zbytku této části odkazujeme na tyto objekty jako mezilehlou geometrii. Příklad této třídy objektu je uveden v příkladu kódu níže. Tato funkce Zero Touch jazyka C# singleCube vrací jednu krychli, ale během provádění vytvoří 10 000 dalších krychlí. Můžeme předstírat, že tato jiná geometrie byla použita jako mezilehlá konstrukční geometrie.
Tato funkce Zero Touch pravděpodobně způsobí selhání aplikace Dynamo. Protože jsme vytvořili 10 000 těles, ale pouze jedno z nich bylo uloženo a pouze toto bylo vráceno. Místo toho bychom měli odstranit všechny mezilehlé krychle, kromě té, kterou vrátíme. Nechceme odstranit tu, kterou vrátíme, protože bude propagována do grafu a použita jinými uzly.
Opravený kód by vypadal jako:
Obecně platí, že je nutné pouze odstranit geometrii, jako je Surfaces
, Curves
a Solids
. Pro jistotu však můžete odstranit všechny typy geometrie (Vectors
, Points
, CoordinateSystems
).
Textové skriptování v prostředí vizuálního skriptování umožňuje tvorbu výkonných a vizuálních vztahů pomocí jazyků DesignScript, Python a ZeroTouch (C#). Uživatel může odhalovat prvky, například posuvníky vstupů, zhustit rozsáhlé operace do aplikace DesignScript a umožnit přístup k výkonným nástrojům a knihovnám prostřednictvím jazyka Python nebo C#, a to ve stejném pracovním prostoru. Pokud jsou strategie efektivně spravovány, mohou díky jejich kombinaci do celého programu zavést značné množství možností, přizpůsobení, ale také přehlednosti a efektivity. Následuje sada pokynů, které vám pomohou vylepšit vizuální skript pomocí textového skriptu.
Textové skriptování může vytvořit vztahy vyšší složitosti než vizuální programování, ale jejich možnosti se také značně překrývají. Toto dává smysl, protože uzly jsou efektivně předem zabalený kód a pravděpodobně bychom mohli napsat celý program aplikace Dynamo v aplikaci DesignScript nebo v jazyce Python. Vizuální skriptování však používáme kvůli tomu, že rozhraní uzlů a drátů vytváří intuitivní tok grafických informací. Pokud víte, kde možnosti textového skriptování jdou nad rámec vizuálního skriptování, budete mít k dispozici hlavní vodítka pro případy, kdy by se mělo textové skriptování použít, aniž by bylo nutné předvídat intuitivní povahu uzlů a drátů. Níže jsou uvedeny pokyny, kdy se má skriptovat a jaký jazyk k tomu použít.
Textové skriptování použijte pro:
Smyčky
Rekurze
Přístup k externím knihovnám
Vyberte jazyk:
Při skriptování v aplikaci Dynamo, což je nezbytně parametrické prostředí, je rozumné strukturovat kód podle systému uzlů a drátů, ve kterých bude kód existovat. Uzel obsahující textový skript je třeba považovat za uzel jako každý jiný v programu s několika specifickými vstupy, funkcí a předpokládaným výstupem. Kód uvnitř uzlu díky tomu ihned obdrží malou sadu proměnných, se kterými se bude pracovat, což je klíč k čistě parametrickému systému. Zde jsou některé pokyny pro lepší integraci kódu do vizuálního programu.
Určení externích proměnných:
Zkuste určit dané parametry v problému návrhu, tak aby bylo možné vytvořit model, který je přímo sestaven mimo tato data.
Před psaním kódu identifikujte proměnné:
Minimální sadu vstupů
Zamýšlený výstup
Konstanty
Před zapsáním kódu bylo vytvořeno několik proměnných.
Povrch, na kterém bude probíhat simulace dešťové srážky.
Požadovaný počet dešťových kapek (agentů).
Jak velkou vzdálenost mají dešťové kapky urazit.
Přepínač mezi sestupem po nejstrmější cestě a přechodem po povrchu.
Uzel jazyka Python s příslušným počtem vstupů.
Blok kódu pro nastavení vrácených oblouků na modrou barvu.
Návrh vnitřních vztahů:
Parametrismus umožňuje úpravu určitých parametrů nebo proměnných, aby bylo možné manipulovat s koncovým výsledkem rovnice nebo systému, případně tento výsledek změnit.
Kdykoli spolu entity ve skriptu logicky souvisí, je třeba je definovat jako vzájemné funkce. Tímto způsobem se při úpravě jedné funkce může proporcionálně aktualizovat druhá funkce.
Minimalizujte počet vstupů tím, že zobrazíte pouze klíčové parametry:
Pokud je možné sadu parametrů odvodit z více nadřazených parametrů, zobrazte pouze nadřazené parametry jako vstupy skriptu. Tím se zvýší použitelnost skriptu, protože se sníží složitost jeho rozhraní.
Vstupy.
Interní proměnné skriptu.
Smyčka, která pomocí těchto vstupů a proměnných provádí svou funkci.
Tip: Na proces klaďte tak velký důraz, jaký kladete na řešení.
Pokud máte ve skriptu více způsobů vyjádření stejné věci, duplicitní reprezentace v určitém bodě vypadnou ze synchronizace, což může vést k velkým potížím s údržbou, slabému faktorování a vnitřním rozporům.
Princip DRY zní takto: „Veškeré vědomosti musí mít v systému jedinou jednoznačnou, autoritativní reprezentaci“:
Pokud je tento princip úspěšně použit, všechny související prvky ve skriptu se mění předvídatelně a jednotně a nesouvisející prvky nezpůsobí u sebe navzájem logické následky.
Tip: Před duplikováním entit ve skriptu (například konstanty ve výše uvedeném příkladu) si můžete položit dotaz, zda se místo toho můžete připojit ke zdroji.
Během toho, jak se kód rozrůstá a zesložiťuje, „hlavní myšlenka“ neboli zastřešující algoritmus se postupně stává méně čitelným. Je také obtížnější sledovat, co (a kde) se konkrétně děje, hledat chyby v případě, že skript funguje chybně, integrovat jiný kód a přiřadit vývojové úkoly. Aby se těmto problémům zabránilo, je moudré psát kód v modulech, což je organizační strategie rozdělující kód na části podle úlohy jakou jednotlivé části vykonávají. Zde je několik tipů, které vám usnadní správu skriptů pomocí modularizace.
Zápis kódu v modulech:
„module“ je skupina kódu, která provádí určitou úlohu, podobně jako uzel aplikace Dynamo v pracovním prostoru.
Může to být cokoli, co by mělo být vizuálně odděleno od přilehlého kódu (funkce, třída, skupina vstupů nebo importované knihovny).
Vývoj kódu v modulech prováže vizuální, intuitivní kvalitu uzlů a také složité vztahy, kterých je možné dosáhnout pouze pomocí textového skriptování.
Tyto smyčky volají třídu s názvem „agent“, která bude vytvořena v tomto cvičení.
Modul kódu, který definuje počáteční bod každého agenta.
Modul kódu, který aktualizuje agenta.
Modul kódu, který kreslí stopu pro cestu agenta.
Využití opakovaného použití kódu:
Pokud zjistíte, že kód dělá stejnou (nebo velmi podobnou) věc více než jednou, najděte způsoby, jak tuto věc sloučit do jedné funkce, kterou je možné volat.
„Správcovské“ funkce řídí tok programu a primárně obsahují volání „pracovních“ funkcí, které zpracovávají detaily na nízké úrovni, například přesouvání dat mezi strukturami.
Tento příklad vytvoří koule s poloměry a barvou podle hodnoty Z středů.
Dvě „pracovní“ nadřazené funkce: jedna, která vytváří koule s poloměry, a jedna, která zobrazí barvy, obojí podle hodnoty Z středu.
„Správcovská“ nadřazená funkce, která kombinuje dvě pracovní funkce. Zavoláním této funkce zavoláte i funkce uvnitř ní.
Zobrazujte pouze to, co je potřeba vidět:
Rozhraní modulu vyjadřuje prvky, které jsou nabízené a vyžadované modulem.
Jakmile jsou definována rozhraní mezi jednotkami, podrobný návrh každé jednotky může probíhat samostatně.
Oddělitelnost/Nahraditelnost:
Moduly o sobě vzájemně neví a vzájemně se o sebe nestarají.
Obecné formy modularizace:
Seskupení kódů:
Funkce:
Třídy:
Při vývoji textových skriptů v aplikaci Dynamo je moudré neustále kontrolovat, že to, co se vytváří, je v souladu s tím, co očekáváte. Tím se zajistí, že nepředvídané události, jako jsou syntaktické chyby, logické nesrovnalosti, nepřesnosti hodnot, anomální výstupy atd, budou rychle odhaleny a řešeny v okamžiku, kdy se objeví, a ne všechny najednou na konci. Vzhledem k tomu, že jsou textové skripty uloženy uvnitř uzlů na pracovní ploše, jsou již integrovány do datového toku vašeho vizuálního programu. Díky tomu můžete snadno sledovat skript, přičemž budete přiřazovat data, která budou na výstupu, spouštět program a vyhodnocovat vytvořený výstup skriptu pomocí uzlu Watch. Následují několik tipů pro průběžnou kontrolu skriptů při jejich tvorbě.
Během tvorby provádějte testy:
Kdykoli dokončíte určitý celek funkcionality:
Vracejte se zpět a přitom kontrolujte kód.
Buďte kritičtí. Mohl by spolupracovník pochopit, co tento kód dělá? Je třeba toto dělat? Je možné tuto funkci provést efektivněji? Vytvářím nepotřebné duplicitní položky nebo závislosti?
Rychle proveďte test, abyste se ujistili, že skript vrací data, která „dávají smysl“.
Přiřaďte jako výstup nejaktuálnější data, se kterými budete ve skriptu pracovat, aby uzel při aktualizaci skriptu vždy prováděl výstup relevantních dat:
Zkontrolujte, zda jsou všechny hrany tělesa, kolem kterého se má vytvořit hraniční kvádr, vráceny jako křivky.
Zkontrolujte, zda jsou vstupní hodnoty počtu úspěšně převedeny na rozsahy.
Zkontrolujte, zda byly souřadnicové systémy v této smyčce správně převedeny a otočeny.
Předvídejte „okrajové případy“:
Při skriptování změňte vstupní parametry na minimální a maximální hodnoty jejich přidělené domény, aby bylo možné zkontrolovat, zda program stále funguje i za extrémních podmínek.
I v případě, že program pracuje v krajních hodnotách, zkontrolujte, zda vrací neúmyslné hodnoty null, prázdné hodnoty nebo nulové hodnoty.
Chyby, které odhalí některé základní problémy se skriptem, se někdy projeví pouze v těchto okrajových případech.
Zjistěte, co způsobuje chybu, a poté se rozhodněte, zda je nutné ji opravit interně nebo zda je nutné doménu parametrů předefinovat, aby se tomuto problému zabránilo.
Tip: Vždy předpokládejte, že uživatel použije všechny kombinace všech možných vstupních hodnot, které mu zpřístupníte. Tímto můžete zabránit nežádoucím překvapením
.
Ladění je proces, při kterém se ze skriptu odstraňují chyby. Mezi chyby patří chybová hlášení, neefektivity, nepřesnosti nebo neočekávané výsledky. Řešení chyby může být velmi jednoduché, protože může spočívat třeba jen v nesprávně napsaném názvu proměnné, který při opravě může vyřešit rozšířené, konstrukční problémy skriptu. V ideálním případě může kontrola skriptu během jeho tvorby pomoci ke včasnému zachycení potenciálních problémů, nezaručí však absolutní bezchybnost. Následuje přehled několika osvědčených postupů, které vám pomohou řešit chyby systematicky.
Využijte sledovací bublinu:
Kontrolujte data vrácená na různých místech kódu přiřazením do proměnné OUT, podobně jako při kontrole dat programu.
Pište smysluplné komentáře:
Pokud je požadovaný výstup jasně popsán, modul kódu tohoto výstupu bude možné ladit o dost snadněji.
Normálně by se jednalo o příliš rozsáhlé komentování a mnoho prázdných řádků, u ladění však tento postup může být užitečný k rozebrání problému na spravovatelné celky.
Využijte modularitu kódu:
Zdroj problému může být izolován v určitých modulech.
Po zjištění, který modul je chybný, je řešení problému značně jednodušší.
Pokud je nutné program upravit, kód, který byl vyvinut v modulech, bude mnohem snadnější změnit:
Do existujícího programu můžete vložit nové nebo vyladěné moduly a přitom se spolehnout na to, že se zbytek programu nezmění.
Vstupní geometrie vrací hraniční obdélník, který je větší než její vlastní velikost, což je vidět po přiřazení proměnných xDist a yDist do proměnné OUT.
Křivky hran vstupní geometrie vrátí odpovídající hraniční obdélník se správnými vzdálenostmi v proměnných xDist a yDist.
Byl vložen „modul“ kódu, abychom vyřešili problém s hodnotou xDist a yDist.
Kliknutím na odkaz níže si stáhněte vzorový soubor.
Úplný seznam vzorových souborů najdete v dodatku.
Pojďme napsat skript simulace deště a přitom se budeme řídit našimi nejlepšími postupy textového skriptování. I když bylo možné použít nejlepší metody na neorganizovaný vizuální program ve strategiích grafů, je mnohem obtížnější to provést pomocí textového skriptování. Logické vztahy zavedené v textovém skriptování jsou méně viditelné a v neuspořádaném kódu může být téměř nemožné je rozluštit. S textovým skriptováním přichází i větší zodpovědnost v organizaci. Projdeme si nyní každý krok a během toho budeme používat ty nejlepší postupy.
Skript byl použit na povrch deformovaný atraktorem.
Nejprve je nutné importovat nezbytné knihovny aplikace Dynamo. Pokud na začátku provedete tento krok, získáte globální přístup k funkcím aplikace Dynamo v jazyce Python.
Všechny knihovny, které chceme použít, je nutné importovat zde.
Dále je potřeba definovat vstupy a výstup skriptu, které se zobrazí jako porty u uzlu. Tyto externí vstupy jsou základem pro náš skript a klíčem k vytvoření parametrického prostředí.
Je třeba definovat vstupy, které odpovídají proměnným ve skriptu jazyka Python, a určit požadovaný výstup:
Povrch, který chceme projít.
Počet agentů, které chceme projít.
Maximální počet kroků, které mohou agenti provést.
Možnost jít nejkratší cestou po povrchu, nebo jej přejít.
Uzel jazyka Python se vstupními identifikátory, které odpovídají vstupům ve skriptu (IN[0], IN[1]).
Výstupní křivky, které je možné zobrazit jinou barvou.
Nyní pomocí praktiky modularity vytvoříme tělo skriptu. Simulace nejkratší cesty dolů po povrchu pro více počátečních bodů je důležitým úkolem, který bude vyžadovat několik funkcí. Místo toho, abychom volali různé funkce v celém skriptu, můžeme upravit kód shromážděním funkcí do jedné třídy, což bude agent. Různé funkce této třídy nebo „modulu“ je možné volat s různými proměnnými nebo je dokonce znovu použít v jiném skriptu.
Je potřeba definovat pro agenta třídu (neboli plán činnosti) s úmyslem pohybu dolů po povrchu, a to výběrem varianty pohybu směrem s největší strmostí při každém kroku:
Název.
Globální atributy, které sdílejí všichni agenti.
Atributy instance, které jsou jedinečné pro každého agenta.
Funkce pro vykonání kroku.
Funkce pro katalogizaci pozice každého kroku do seznamu trajektorií.
Inicializujeme agenty definováním jejich počátečního umístění. Toto je dobrá příležitost pro kontrolu skriptu a ujištění se, že třída agentů funguje.
Bude nutné vytvořit instance všech agentů, u kterých chceme sledovat jejich průchod po povrchu, a definovat jejich počáteční atributy:
Nový prázdný seznam trajektorií.
Kde začnou svou cestu po povrchu.
Jako výstup jsme přiřadili seznam agentů, abychom zkontrolovali, co zde skript vrací. Vrací se správný počet agentů, později však bude potřeba zkontrolovat data skriptu znovu, aby se ověřila geometrie, kterou vrátí.
V každém kroku aktualizujte každého agenta. Poté bude nutné u každého agenta v každém kroku vstoupit do vnořené smyčky, ve které se aktualizuje a zaznamená pozice do jejich seznamu trajektorií. V každém kroku se také ujistíme, že agent nedosáhl bodu na povrchu, kde nemůže provést další krok, který by mu umožnil sestup. Pokud bude tato podmínka splněna, cesta tohoto agenta bude ukončena.
Nyní, když jsou agenti plně aktualizováni, vrátíme geometrii, která je reprezentuje. Jakmile všichni agenti dosáhnou svého meze sestupu nebo maximálního počtu kroků, vytvoříme křivku PolyCurve pomocí bodů v jejich seznamu trajektorií a vypíšeme trajektorie PolyCurve.
Náš skript sloužící k nalezení nejstrmějších cest.
Předvolba, která simuluje déšť na základním povrchu.
Místo hledání nejstrmější cesty mohou být agenti přepnuti, tak aby mohli procházet přes základní povrch.
Úplný skript v jazyce Python.
Seznam toho, k čemu vám jednotlivé knihovny aplikace Dynamo poskytují přístup, naleznete v části .
Moduly kódu z příkladu v .
Ladění vzorového souboru z .
Smyčky | Rekurze | Zhuštění uzlů | Ext. knihovny | Zkratka |
DesignScript | Ano | Ano | Ano | No | Ano |
Python | Ano | Ano | Částečně | Ano | Ne |
ZeroTouch (C#) | Ne | Ne | Ne | Ano | Ne |