All pages
Powered by GitBook
1 of 3

Loading...

Loading...

Loading...

Fortgeschrittene Themen

Im Laufe der Zeit werden Sie möglicherweise Wissen über die Grundlagen von Dynamo hinaus benötigen und sich mit den fortgeschrittenen Funktionsweise von Dynamo vertraut machen müssen. Auf den Seiten in diesem Abschnitt erfahren Sie, wie Sie erweiterte Funktionen in Dynamo for Civil 3D nutzen und so Ihre Diagramme weiter optimieren können.

Objektbindung

Dynamo for Civil 3D verfügt über einen leistungsstarken Mechanismus, mit dem sich das Programm die von jedem Block erstellten Objekte "merken" kann. Dieser Mechanismus wird als Objektbindung bezeichnet und ermöglicht es einem Dynamo-Diagramm, bei jeder Ausführung im selben Dokument konsistente Ergebnisse zu erzielen. Dies ist in vielen Fällen sehr wünschenswert, aber es gibt auch andere Situationen, in denen Sie mehr Kontrolle über das Verhalten von Dynamo haben möchten. In diesem Abschnitt erfahren Sie, wie die Objektbindung funktioniert und wie Sie sie nutzen können.

Beispiel

Betrachten Sie dieses Diagramm, das einen Kreis im Modellbereich auf dem aktuellen Layer erstellt.

Ein einfaches Diagramm für die Erstellung eines Kreises

Achten Sie darauf, was passiert, wenn der Radius geändert wird.

Dies ist Objektbindung in Aktion. Dynamo ändert vorgabemäßig den Radius des Kreises, anstatt bei jeder Änderung der Radiuseingabe einen neuen Kreis zu erstellen. Dies liegt daran, dass sich der Block Object.ByGeometry "merkt", dass er diesen spezifischen Kreis bei jeder Ausführung des Diagramms erstellt hat. Außerdem speichert Dynamo diese Informationen, sodass sie beim nächsten Öffnen des Civil 3D-Dokuments und Ausführen des Diagramms genau das gleiche Verhalten aufweisen.

Ein weiteres Beispiel

Sehen wir uns ein Beispiel an, in dem Sie das vorgabemäßige Objektbindungsverhalten von Dynamo möglicherweise ändern möchten. Angenommen, Sie möchten ein Diagramm erstellen, das Text in der Mitte eines Kreises platziert. Sie möchten mit diesem Diagramm jedoch erreichen, dass es immer wieder ausgeführt und jedes Mal neuer Text in den ausgewählten Kreis eingefügt werden kann. So könnte dieses Diagramm aussehen.

Dies geschieht jedoch tatsächlich, wenn ein anderer Kreis ausgewählt wird.

Offenbar wird der Text gelöscht und mit jedem Durchlauf des Diagramms neu erstellt. In Wirklichkeit wird die Position des Texts geändert, abhängig davon, welcher Kreis ausgewählt ist. Es ist also derselbe Text, nur an einer anderen Stelle! Um jedes Mal neuen Text zu erstellen, müssen Sie die Einstellungen für die Objektbindung in Dynamo ändern, sodass keine Bindungsdaten beibehalten werden (siehe unten).

Nachdem wir diese Änderung vorgenommen haben, erhalten wir das gewünschte Verhalten.

Bindungseinstellungen

Dynamo for Civil 3D ermöglicht die Änderung des vorgegebenen Verhaltens für Objektbindungen über die Einstellungen für Bindungsdatenspeicherung im Menü Dynamo.

Beachten Sie, dass die Optionen für die Bindungsdatenspeicherung in Civil 3D 2022.1 und höher verfügbar sind.

Alle Optionen sind vorgabemäßig aktiviert. Hier finden Sie eine Zusammenfassung der Funktionen der einzelnen Optionen.

Option 1: Keine Bindungsdaten beibehalten

Wenn diese Option aktiviert ist, werden die Objekte, die beim letzten Ausführen des Diagramms erstellt wurden, von Dynamo "vergessen". Das Diagramm kann also in jeder beliebigen Zeichnung ausgeführt werden und erstellt jedes Mal neue Objekte.

Verwendung

Verwenden Sie diese Option, wenn Dynamo alle Aktionen aus früheren Durchläufen "vergessen" und jedes Mal neue Objekte erstellen soll.

Option 2: In Diagramm für Dynamo speichern

Diese Option bedeutet, dass Metadaten der Objektbindung in das Diagramm (DYN-Datei) serialisiert werden, wenn es gespeichert wird. Wenn Sie das Diagramm schließen/erneut öffnen und es in derselben Zeichnung ausführen, sollte alles wie beim letzten Mal funktionieren. Wenn Sie das Diagramm in einer anderen Zeichnung ausführen, werden die Bindungsdaten aus dem Diagramm entfernt und neue Objekte erstellt. Dies bedeutet, dass beim Öffnen der ursprünglichen Zeichnung und erneuten Ausführen des Diagramms neue Objekte zusätzlich zu den alten erstellt werden.

Verwendung

Verwenden Sie diese Option, wenn sich Dynamo die Objekte "merken" soll, die beim letzten Ausführen in einer bestimmten Zeichnung erstellt wurden.

Diese Option eignet sich am besten für Situationen, in denen eine 1:1-Beziehung zwischen einer bestimmten Zeichnung und einem Dynamo-Diagramm beibehalten werden kann. Optionen 1 und 3 eignen sich besser für Diagramme, die für die Ausführung in mehreren Zeichnungen ausgelegt sind.

Option 3: In Zeichnung für Dynamo speichern

Dies ähnelt Option 2, mit der Ausnahme, dass die Objektbindungsdaten in der Zeichnung und nicht im Diagramm (DYN-Datei) serialisiert werden. Wenn Sie das Diagramm schließen/erneut öffnen und es in derselben Zeichnung ausführen, sollte alles wie beim letzten Mal funktionieren. Wenn Sie das Diagramm in einer anderen Zeichnung ausführen, bleiben die Bindungsdaten in der ursprünglichen Zeichnung erhalten, da sie in der Zeichnung und nicht im Diagramm gespeichert werden.

Verwendung

Verwenden Sie diese Option, wenn Sie dasselbe Diagramm in mehreren Zeichnungen verwenden möchten und Dynamo sich dabei "merken" soll, wie es in jeder Zeichnung dargestellt wurde.

Option 4: In Zeichnung für Dynamo Player speichern

Bei dieser Option ist zunächst zu beachten, dass sie keine Auswirkung darauf hat, wie das Diagramm mit der Zeichnung interagiert, wenn das Diagramm über die Dynamo-Hauptbenutzeroberfläche ausgeführt wird. Diese Option ist nur dann relevant, wenn das Diagramm mit Dynamo Player ausgeführt wird.

Wenn Dynamo Player neu für Sie ist, finden Sie im Abschnitt weitere Informationen.

Wenn Sie das Diagramm über die Dynamo-Hauptbenutzeroberfläche ausführen, es schließen und anschließend mit Dynamo Player ausführen, werden zusätzlich zu den zuvor erstellten Objekten neue Objekte erstellt. Sobald das Diagramm jedoch einmal von Dynamo Player ausgeführt wurde, werden die Objektbindungsdaten in der Zeichnung serialisiert. Wenn Sie das Diagramm also mehrmals mit Dynamo Player ausführen, werden Objekte aktualisiert, statt neue zu erstellen. Wenn Sie das Diagramm mit Dynamo Player in einer anderen Zeichnung ausführen, bleiben die Bindungsdaten in der ursprünglichen Zeichnung erhalten, da sie in der Zeichnung und nicht im Diagramm gespeichert werden.

Verwendung

Verwenden Sie diese Option, wenn Sie ein Diagramm mit Dynamo Player über mehrere Zeichnungen hinweg ausführen und Dynamo Player sich dabei "merken" soll, wie es in jeder Zeichnung dargestellt wurde.

Dynamo Player
Ändern der Radiuseingabe in Dynamo
Ein einfaches Diagramm, das Text in der Mitte eines ausgewählten Kreises platziert
Vorgabemäßiges Verhalten von Dynamo bei Auswahl eines neuen Kreises
Einstellungen für Objektbindung
Verhalten bei deaktivierter Objektbindung
Objektbindung

Python und Civil 3D

Dynamo ist als visuelles Programmierwerkzeug zwar sehr leistungsstark, es ist jedoch auch möglich, nicht nur Blöcke und Drähte zu verwenden, sondern Code in Textform zu schreiben. Es gibt zwei Möglichkeiten, dies zu tun:

  1. Schreiben von DesignScript mithilfe eines Codeblocks

  2. Schreiben von Python mithilfe eines Python-Blocks

In diesem Abschnitt wird beschrieben, wie Sie Python in der Civil 3D-Umgebung einsetzen können, um die Vorteile der .NET-APIs von AutoCAD und Civil 3D zu nutzen.

Weitere allgemeine Informationen zur Verwendung von Python in Dynamo finden Sie im Abschnitt .

API-Dokumentation

AutoCAD und Civil 3D verfügen über mehrere APIs, mit denen Entwickler wie Sie das Kernprodukt um benutzerdefinierte Funktionen erweitern können. Im Kontext von Dynamo sind die verwalteten .NET-APIs relevant. Die folgenden Links sind wichtig, um die Struktur der APIs und ihre Funktionsweise zu verstehen.

Wenn Sie diesen Abschnitt durcharbeiten, werden Ihnen möglicherweise einige Konzepte begegnen, mit denen Sie nicht vertraut sind, z. B. Datenbanken, Transaktionen, Methoden, Eigenschaften usw. Viele dieser Konzepte sind für die Arbeit mit .NET-APIs wichtig und nicht spezifisch für Dynamo oder Python. Da diese Konzepte in diesem Abschnitt der Einführung nicht behandelt werden, empfehlen wir für weitere Informationen die oben genannten Links.

Code-Vorlage

Wenn Sie einen neuen Python-Block zum ersten Mal bearbeiten, wird er automatisch mit Vorlagencode gefüllt, um Ihnen den Einstieg zu erleichtern. Hier sehen Sie eine Aufschlüsselung der Vorlage mit Erläuterungen zu den einzelnen Blöcken.

  1. Importiert die Module sys und clr, die beide für die korrekte Funktionsweise des Python-Interpreters erforderlich sind. Insbesondere ermöglicht das clr-Modul, dass .NET-Namensbereiche im Wesentlichen wie Python-Pakete behandelt werden.

  2. Lädt die Standardbaugruppen (d. h. DLLs) für die Arbeit mit den verwalteten .NET-APIs für AutoCAD und Civil 3D.

Sie möchten die Software anpassen? Sie können die vorgabemäßige Python-Vorlage ändern, indem Sie die Datei PythonTemplate.py in C:\ProgramData\Autodesk\C3D <Version>\Dynamo bearbeiten.

Beispiel

Im Folgenden werden anhand eines Beispiels einige der grundlegenden Konzepte zum Schreiben von Python-Skripten in Dynamo for Civil 3D demonstriert.

Ziel

🎯 Ruft die Umgrenzungsgeometrie aller Einzugsgebiete in einer Zeichnung ab.

Datensatz

Hier sehen Sie Beispieldateien, die für diese Übung als Referenz dienen können.

Lösungsübersicht

Hier sehen Sie einen Überblick über die Logik in diesem Diagramm.

  1. Dokumentation zur Civil 3D-API ansehen

  2. Alle Einzugsgebiete im Dokument nach Layernamen auswählen

  3. Dynamo-Objekte "abwickeln", um auf die internen Civil 3D-API-Elemente zuzugreifen

Los gehts!

Überprüfen der API-Dokumentation

Bevor wir beginnen, unser Diagramm zu erstellen und Code zu schreiben, sollten wir uns die Dokumentation zur Civil 3D-API ansehen und einen Eindruck davon gewinnen, was die API uns zur Verfügung stellt. In diesem Fall gibt es eine , die die Umgrenzungspunkte des Einzugsgebiets zurückgibt. Beachten Sie, dass diese Eigenschaft ein Point3dCollection-Objekt zurückgibt. Dynamo kann diese Objektart nicht verarbeiten. Mit anderen Worten: Wir können keine PolyCurve aus einer Point3dCollection erstellen, daher müssen wir irgendwann alles in Dynamo-Punkte umwandeln. Doch mehr dazu später.

Abrufen aller Einzugsgebiete

Jetzt können wir mit der Erstellung der Diagrammlogik beginnen. Als Erstes müssen Sie eine Liste aller Einzugsgebiete im Dokument abrufen. Hierfür sind Blöcke verfügbar, sodass Sie dies nicht in das Python-Skript aufnehmen müssen. Die Verwendung von Blöcken bietet eine bessere Sichtbarkeit für andere Benutzer, die das Diagramm möglicherweise lesen (im Gegensatz zu in einem Python-Skript "verstecktem" Code). Außerdem konzentriert sich das Python-Skript auf eine Sache: die Rückgabe der Umgrenzungspunkte der Einzugsgebiete.

Beachten Sie, dass die Ausgabe des Blocks All Objects on Layer eine Liste von CivilObjects ist. Dies liegt daran, dass Dynamo for Civil 3D derzeit keine Blöcke für die Arbeit mit Einzugsgebieten hat. Aus diesem Grund müssen wir über Python auf die API zugreifen.

Abwickeln von Objekten

Bevor wir fortfahren, müssen wir noch kurz auf ein wichtiges Konzept eingehen. Im Abschnitt wurde erläutert, wie Objekte und CivilObjects miteinander verbunden sind. Eine weitere relevante Information ist, dass ein Dynamo-Objekt als Wrapper um ein AutoCAD-Objekt herum fungiert. In ähnlicher Weise ist ein Dynamo-CivilObject ein Wrapper um ein Civil 3D-Objekt herum. Sie können ein Objekt abwickeln, indem Sie auf seine InternalDBObject- oder InternalObjectId-Eigenschaften zugreifen.

Dynamo-Typ
Enthält im Wrapper

Als Faustregel gilt: Es ist in der Regel sicherer, die Objekt-ID über die Eigenschaft InternalObjectId abzurufen und dann in einer Transaktion auf das im Wrapper enthaltene Objekt zuzugreifen. Dies liegt daran, dass die Eigenschaft InternalDBObject ein AutoCAD-DBObject zurückgibt, das sich nicht in einem schreibbaren Status befindet.

Python-Skript

Hier sehen Sie das vollständige Python-Skript, das für den Zugriff auf die internen Einzugsgebietobjekte deren Umgrenzungspunkte abruft. Die hervorgehobenen Zeilen stehen für die Zeilen, die vom Vorgabevorlagencode geändert/hinzugefügt wurden.

Klicken Sie auf den unterstrichenen Text im Skript, um eine Erläuterung für jede Zeile anzuzeigen.

Als Faustregel sollten Sie den Großteil Ihrer Skriptlogik in eine Transaktion einschließen. Dadurch wird der sichere Zugriff auf die Objekte sichergestellt, die das Skript lesen und schreiben kann. In vielen Fällen kann das Auslassen einer Transaktion einen schwerwiegenden Fehler verursachen.

Erstellen von PolyCurves

An dieser Stelle sollte das Python-Skript eine Liste von Dynamo-Punkten ausgeben, die Sie in der Hintergrundvorschau sehen können. Der letzte Schritt besteht darin, einfach PolyCurves aus den Punkten zu erstellen. Beachten Sie, dass dies auch direkt im Python-Skript erfolgen kann. Wir haben dies jedoch absichtlich außerhalb des Skripts in einem Block platziert, damit es besser sichtbar ist. Hier sehen Sie, wie das fertige Diagramm aussieht.

Ergebnis

Hier sehen Sie die endgültige Dynamo-Geometrie.

🎉 Mission erfüllt!

IronPython vs. CPython

Hier noch eine kurze Anmerkung. Je nachdem, welche Version von Civil 3D Sie verwenden, ist der Python-Block möglicherweise anders konfiguriert. In Civil 3D 2020 und 2021 hat Dynamo das Werkzeug IronPython verwendet, um Daten zwischen .NET-Objekten und Python-Skripten zu verschieben. In Civil 3D 2022 wurde in Dynamo jedoch der standardmäßige native Python-Interpreter (auch CPython genannt) anstelle von Python 3 verwendet. Zu den Vorteilen dieser Umstellung zählen der Zugriff auf beliebte moderne Bibliotheken und neue Plattformfunktionen, grundlegende Wartung und Sicherheits-Patches.

Weitere Informationen zu dieser Umstellung und zum Aktualisieren älterer Skripte finden Sie im . Wenn Sie IronPython weiterhin verwenden möchten, müssen Sie lediglich das DynamoIronPython2.7 - Paket mithilfe des Dynamo Package Manager installieren.

Fügt Verweise zu den standardmäßigen AutoCAD- und Civil 3D-Namensbereichen hinzu. Diese entsprechen den Anweisungen using oder Imports in C# bzw. VB.NET.
  • Auf die Eingabeanschlüsse des Blocks kann über eine vordefinierte Liste mit dem Namen IN zugegriffen werden. Sie können auf die Daten in einem bestimmten Anschluss über die Indexnummer zugreifen, z. B. dataInFirstPort = IN[0].

  • Ruft das aktive Dokument und den aktiven Editor ab.

  • Sperrt das Dokument und initiiert eine Datenbanktransaktion.

  • Hier sollten Sie den Großteil der Skriptlogik platzieren.

  • Heben Sie die Auskommentierung dieser Zeile auf, um die Transaktion nach der Hauptarbeit zu bestätigen.

  • Wenn Sie Daten aus dem Block ausgeben möchten, weisen Sie diese der Variablen OUT am Ende des Skripts zu.

  • Dynamo-Punkte aus AutoCAD-Punkten erstellen
  • PolyCurves aus den Punkten erstellen

  • Objekt Autodesk.AutoCAD.DynamoNodes.Object

    Objekt Autodesk.AutoCAD.DatabaseServices.Entity

    CivilObject Autodesk.Civil.DynamoNodes.CivilObject

    Objekt Autodesk.Civil.DatabaseServices.Entity

    Python
    AutoCAD-.NET-API - Entwicklerhandbuch
    AutoCAD-.NET-API - Referenzhandbuch
    Civil 3D-.NET-API - Entwicklerhandbuch
    Civil 3D-.NET-API - Referenzhandbuch
    15KB
    Python_Catchments.dyn
    Open
    961KB
    Python_Catchments.dwg
    Open
    Eigenschaft in der Einzugsgebietklasse
    Blockbibliothek
    Dynamo-Blog
    Die vorgabemäßige Python-Vorlage in Civil 3D
    Abrufen aller Einzugsgebiete im Dokument nach Layer
    Das endgültige Diagramm
    Die resultierenden Dynamo-PolyCurves für die Einzugsgebietsgrenzen
    # Python-Standard- und DesignScript-Bibliotheken laden
    import sys
    import clr
    
    # Baugruppen für AutoCAD und Civil3D hinzufügen
    clr.AddReference('AcMgd')
    clr.AddReference('AcCoreMgd')
    clr.AddReference('AcDbMgd')
    clr.AddReference('AecBaseMgd')
    clr.AddReference('AecPropDataMgd')
    clr.AddReference('AeccDbMgd')
    
    clr.AddReference('ProtoGeometry')
    
    # Referenzen aus AutoCAD importieren
    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 *
    
    # Referenzen aus Civil3D importieren
    from Autodesk.Civil.ApplicationServices import *
    from Autodesk.Civil.DatabaseServices import *
    
    from Autodesk.DesignScript.Geometry import Point as DynPoint
    
    # Die Eingaben für diesen Block werden als Liste in den IN-Variablen gespeichert.
    objs = IN[0]
    
    output = [] 
    
    if objs is None:
        sys.exit("Die Eingabe ist null oder leer.")
    
    if not isinstance(objs, list):
        objs = [objs]
        
    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:              
                    id = obj.InternalObjectId
                    aeccObj = t.GetObject(id, OpenMode.ForRead)                
                    if isinstance(aeccObj, Catchment):
                        catchment = aeccObj
                        acPnts = catchment.BoundaryPolyline3d                    
                        dynPnts = []
                        for acPnt in acPnts:
                            pnt = DynPoint.ByCoordinates(acPnt.X, acPnt.Y, acPnt.Z)
                            dynPnts.append(pnt)
                        output.append(dynPnts)
                
                # Commit vor Beenden der Transaktion
                t.Commit()
                pass
                
    # Weisen Sie Ihre Ausgabe der OUT-Variable zu.
    OUT = output