Python a Civil 3D
Last updated
Last updated
Aplikace Dynamo je sice jako nástroj pro vizuální programování extrémně výkonná, ale můžete jít také nad rámec uzlů a drátů a psát kód v textové podobě. To lze provést dvěma způsoby:
Psát v jazyce DesignScript pomocí bloku kódu.
Psát v jazyce Python pomocí uzlu jazyka Python.
V této části se zaměříme na to, jak lze pomocí jazyka Python v prostředí aplikace Civil 3D efektivně využívat rozhraní .NET API aplikací AutoCAD a Civil 3D.
Další obecné informace o používání jazyka Python v aplikaci Dynamo naleznete v části Python .
Aplikace AutoCAD i Civil 3D mají k dispozici několik rozhraní API, která umožňují vývojářům, jako jste vy, rozšířit základní produkt o vlastní funkce. V kontextu aplikace Dynamo jsou relevantní spravovaná rozhraní .NET API. Následující odkazy jsou důležité pro pochopení struktury rozhraní API a způsobu jejich fungování.
Příručka pro vývojáře rozhraní .NET API pro aplikaci AutoCAD
Referenční příručka rozhraní .NET API pro aplikaci AutoCAD
Příručka pro vývojáře rozhraní .NET API pro aplikaci Civil 3D
Referenční příručka rozhraní .NET API pro aplikaci Civil 3D
Při procházení této části se můžete setkat s pojmy, které neznáte, jako jsou databáze, transakce, metody, vlastnosti atd. Mnoho z těchto pojmů tvoří základ pro práci s rozhraním .NET API a nejsou specifické pro aplikaci Dynamo nebo jazyk Python. Podrobné rozebírání těchto pojmů přesahuje rámec této části příručky Primer, proto doporučujeme často vyhledávat další informace na výše uvedených odkazech.
Při první úpravě nového uzlu jazyka Python bude tento uzel předvyplněn kódem šablony, abyste mohli začít. Zde je rozpis šablony s vysvětlením jednotlivých bloků.
Importuje moduly
sys
aclr
, které jsou nezbytné pro správnou funkci interpretu jazyka Python. Modulclr
zejména umožňuje, aby se se jmennými prostory .NET zacházelo v podstatě jako s balíčky jazyka Python.Načte standardní sestavy (tj. knihovny DLL) pro práci se spravovanými rozhraními .NET API pro aplikace AutoCAD a Civil 3D.
Přidá odkazy na standardní jmenné prostory aplikací AutoCAD a Civil 3D. Jsou ekvivalentní direktivám
using
neboImports
v jazyce C# nebo VB.NET (v uvedeném pořadí).Vstupní porty uzlu jsou přístupné pomocí předdefinovaného seznamu s názvem
IN
. K datům v určitém portu můžete přistupovat pomocí jeho čísla indexu, napříkladdataInFirstPort = IN[0]
.Vrátí aktivní dokument a editor.
Uzamkne dokument a zahájí transakci databáze.
Zde byste měli umístit většinu logiky skriptu.
Zrušte komentář tohoto řádku, aby se po dokončení hlavní práce provedla transakce.
Pokud chcete z uzlu získat výstup libovolných dat, přiřaďte je na konci skriptu proměnné
OUT
.
Chcete si šablonu přizpůsobit?
Výchozí šablonu jazyka Python si můžete přizpůsobit úpravou souboru PythonTemplate.py
, který se nachází v umístění C:\ProgramData\Autodesk\C3D <version>\Dynamo
.
Pojďme si na příkladu ukázat některé základní koncepty psaní skriptů jazyka Python v aplikaci Dynamo for Civil 3D.
🎯 Získejte geometrii hranic všech povodí ve výkresu.
Zde jsou příklady souborů, na které se můžete odkazovat v tomto cvičení.
Zde je uveden přehled logiky tohoto grafu.
Zkontrolujte dokumentaci rozhraní API aplikace Civil 3D.
Vyberte všechna povodí v dokumentu podle názvu hladiny.
„Rozbalte“ objekty aplikace Dynamo a získejte přístup k interním prvkům rozhraní API aplikace Civil 3D.
Vytvořte body aplikace Dynamo z bodů aplikace AutoCAD.
Vytvořte pomocí bodů objekty PolyCurve.
Pojďme na to!
Než začneme vytvářet graf a psát kód, je vhodné se podívat do dokumentace rozhraní API aplikace Civil 3D a získat představu o tom, co nám rozhraní API zpřístupňuje. V tomto případě existuje vlastnost ve třídě Catchment, která vrátí hraniční body povodí. Všimněte si, že tato vlastnost vrací objekt Point3dCollection
, který aplikace Dynamo nezná. Jinými slovy, z objektu Point3dCollection
nebude možné vytvořit objekt PolyCurve, takže nakonec bude nutné vše převést na body aplikace Dynamo. K tomu se vrátíme později.
Nyní můžeme začít vytvářet logiku grafu. Nejprve je nutné získat seznam všech povodí v dokumentu. Pro tuto operaci jsou k dispozici uzly, takže ji nemusíme zahrnovat do skriptu jazyka Python. Použití uzlů nabízí lepší přehlednost pro někoho, kdo by mohl graf číst (místo procházení velkého množství kódu ve skriptu jazyka Python), a také udržuje skript jazyka Python zaměřený na jednu věc: vrácení hraničních bodů povodí.
Všimněte si, že výstup z uzlu All Objects on Layer je seznam objektů CivilObject. Je tomu tak proto, že aplikace Dynamo for Civil 3D aktuálně nemá žádné uzly pro práci s povodími, což je celý důvod, proč přistupovat k rozhraní API prostřednictvím jazyka Python.
Než budeme pokračovat, musíme se krátce zastavit u důležitého pojmu. V části Knihovna uzlů jsme se zmínili, jak spolu souvisí objekty (Object) a objekty aplikace Civil 3D (CivilObject). Abychom to dále upřesnili, objekt aplikace Dynamo je obálka kolem entity aplikace AutoCAD. Podobně platí, že objekt Dynamo CivilObject je obálka kolem entity aplikace Civil 3D. Objekt můžete „rozbalit“ přístupem k jeho vlastnostem InternalDBObject
nebo InternalObjectId
.
Typ aplikace Dynamo | Zabalení |
---|---|
Objekt Autodesk.AutoCAD.DynamoNodes.Object | Entita Autodesk.AutoCAD.DatabaseServices.Entity |
CivilObject Autodesk.Civil.DynamoNodes.CivilObject | Entita Autodesk.Civil.DatabaseServices.Entity |
Obecně je bezpečnější získat ID objektu pomocí vlastnosti InternalObjectId
a poté získat přístup k zabalenému objektu v transakci. Důvodem je, že vlastnost InternalDBObject
vrátí objekt DBObject aplikace AutoCAD, který není v zapisovatelném stavu.
Zde je úplný skript jazyka Python, který provádí přístup k vnitřním objektům povodí a získává jejich hraniční body. Zvýrazněné řádky jsou upraveny/přidány oproti výchozímu kódu šablony.
Kliknutím na podtržený text ve skriptu zobrazíte popis k jednotlivým řádkům.
Pravidlem je, že většinu logiky skriptu je vhodné zahrnout do transakce. Tím zajistíte bezpečný přístup k objektům, které váš skript čte/zapisuje. V mnoha případech může vynechání transakce způsobit závažnou chybu.
V této fázi by měl skript jazyka Python vygenerovat seznam bodů aplikace Dynamo, který si můžete prohlédnout v náhledu na pozadí. Posledním krokem je jednoduché vytvoření objektů PolyCurve z těchto bodů. To lze provést také přímo ve skriptu jazyka Python, ale záměrně jsme tento krok umístili mimo skript do uzlu kvůli lepší přehlednosti. Zde je výsledný graf.
A zde je výsledná geometrie aplikace Dynamo.
🎉 Úkol splněn!
Jen stručná poznámka, než skončíme toto téma. V závislosti na používané verzi aplikace Civil 3D může být uzel jazyka Python konfigurován odlišně. V aplikacích Civil 3D 2020 a 2021 používala aplikace Dynamo k přesunu dat mezi objekty .NET a skripty jazyka Python nástroj IronPython. V aplikaci Civil 3D 2022 však aplikace Dynamo používá standardní nativní interpret jazyka Python (neboli CPython), který používá jazyk Python 3. Mezi výhody přechodu na tento interpret patří přístup k oblíbeným moderním knihovnám a novým funkcím platformy, nezbytná údržba a bezpečnostní opravy.
Další informace o tomto přechodu a o upgradu starších skriptů naleznete na blogu aplikace Dynamo. Pokud chcete i nadále používat nástroj IronPython, stačí nainstalovat balíček DynamoIronPython2.7 pomocí nástroje Dynamo Package Manager.
Tento řádek získá konkrétní třídu, kterou potřebujeme, z knihovny geometrie aplikace Dynamo. Všimněte si, že zde uvádíme import Point as DynPoint
místo import *
, protože druhá možnost by mohla způsobit kolizi názvů.
Zde přesně určíme, který vstupní port obsahuje požadovaná data, namísto výchozího zadání IN
, které odkazuje na celý seznam všech vstupů.