Python a Civil 3D

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:

  1. Psát v jazyce DesignScript pomocí bloku kódu.

  2. 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 .

Dokumentace k rozhraní API

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.

Šablona kódu

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ů.

  1. Importuje moduly sys a clr, které jsou nezbytné pro správnou funkci interpretu jazyka Python. Modul clr zejména umožňuje, aby se se jmennými prostory .NET zacházelo v podstatě jako s balíčky jazyka Python.

  2. Načte standardní sestavy (tj. knihovny DLL) pro práci se spravovanými rozhraními .NET API pro aplikace AutoCAD a Civil 3D.

  3. Přidá odkazy na standardní jmenné prostory aplikací AutoCAD a Civil 3D. Jsou ekvivalentní direktivám using nebo Imports v jazyce C# nebo VB.NET (v uvedeném pořadí).

  4. 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říklad dataInFirstPort = IN[0].

  5. Vrátí aktivní dokument a editor.

  6. Uzamkne dokument a zahájí transakci databáze.

  7. Zde byste měli umístit většinu logiky skriptu.

  8. Zrušte komentář tohoto řádku, aby se po dokončení hlavní práce provedla transakce.

  9. 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.

Příklad

Pojďme si na příkladu ukázat některé základní koncepty psaní skriptů jazyka Python v aplikaci Dynamo for Civil 3D.

Cíl

🎯 Získejte geometrii hranic všech povodí ve výkresu.

Datová sada

Zde jsou příklady souborů, na které se můžete odkazovat v tomto cvičení.

Přehled řešení

Zde je uveden přehled logiky tohoto grafu.

  1. Zkontrolujte dokumentaci rozhraní API aplikace Civil 3D.

  2. Vyberte všechna povodí v dokumentu podle názvu hladiny.

  3. „Rozbalte“ objekty aplikace Dynamo a získejte přístup k interním prvkům rozhraní API aplikace Civil 3D.

  4. Vytvořte body aplikace Dynamo z bodů aplikace AutoCAD.

  5. Vytvořte pomocí bodů objekty PolyCurve.

Pojďme na to!

Kontrola dokumentace rozhraní API

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.

Načtení všech povodí

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.

Rozbalení objektů

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 DynamoZabalení

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.

Skript jazyka Python

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.

# Načtení standardní knihovny jazyka Python a knihovny jazyka DesignScript
import sys
import clr

# Přidání sestav pro aplikace AutoCAD a Civil3D
clr.AddReference('AcMgd')
clr.AddReference('AcCoreMgd')
clr.AddReference('AcDbMgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')



# Import referencí z aplikace AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *

# Import referencí z aplikace Civil 3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

from Autodesk.DesignScript.Geometry import Point as DynPoint

# Vstupy do tohoto uzlu budou uloženy jako seznam v proměnných IN.
 = IN[0]

 

if objs is None:
    

if not isinstance(objs, list):
    
    
adoc = Application.DocumentManager.MdiActiveDocument
editor = adoc.Editor

with adoc.LockDocument():
    with adoc.Database as db:
        
        with db.TransactionManager.StartTransaction() as t:
            for obj in objs:              
                
                aeccObj = t.GetObject(id, OpenMode.ForRead)                
                
                    catchment = aeccObj
                                        
                    dynPnts = []
                    
                        pnt = DynPoint.ByCoordinates(acPnt.X, acPnt.Y, acPnt.Z)
                        
                    output.append(dynPnts)
            
            # Provést před ukončením transakce
            
            pass
            
# Přiřazení výstupu k proměnné OUT.
OUT = output

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.

Vytvoření objektů PolyCurves

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.

Výsledek

A zde je výsledná geometrie aplikace Dynamo.

🎉 Úkol splněn!

IronPython vs. CPython

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.

  1. 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ů.

  2. 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ů.

Last updated