arrow-left

All pages
gitbookPowered by GitBook
1 of 3

Loading...

Loading...

Loading...

Argomenti avanzati

Con il tempo, si potrebbe avere bisogno di andare oltre le nozioni di base e di approfondire i meccanismi interni di Dynamo. Nelle pagine di questa sezione è fornito uno schema per sbloccare le funzionalità avanzate di Dynamo for Civil 3D, in modo da portare i grafici al livello successivo.

Binding di oggetti

Dynamo for Civil 3D contiene un meccanismo molto potente per "memorizzare" gli oggetti creati da ciascun nodo. Questo meccanismo è denominato unione di oggetti e consente di produrre un grafico di Dynamo con risultati coerenti ogni volta che viene eseguito nello stesso documento. Sebbene questo sia altamente auspicabile in molte situazioni, ce ne sono altre in cui si desidera avere un maggiore controllo sul funzionamento di Dynamo. Questa sezione aiuterà a capire come funziona il binding di oggetti e come è possibile sfruttarlo.

hashtag
Esempio

Considerare questo grafico che crea un cerchio nello spazio modello sul layer corrente.

Un grafico semplice per la creazione di un cerchio

Notare cosa succede quando il raggio viene modificato.

Questa è l'unione di oggetti in azione. Il funzionamento di default di Dynamo consiste nel modificare il raggio del cerchio, anziché creare un nuovo cerchio ogni volta che l'input del raggio viene modificato. Questo perché il nodo Object.ByGeometry "si ricorda" che ha creato questo cerchio specifico ogni volta che il grafico viene eseguito. Inoltre, Dynamo memorizzerà queste informazioni in modo che la volta successiva che si apre il documento di Civil 3D e si esegue il grafico, avrà esattamente lo stesso funzionamento.

hashtag
Un altro esempio

Vediamo un esempio in cui si potrebbe voler cambiare il funzionamento di default di Dynamo per l'unione di oggetti. Supponiamo di voler creare un grafico che posiziona il testo al centro di un cerchio. Tuttavia, l'intento con questo grafico è quello di poterlo eseguire più volte e di inserire ogni volta un nuovo testo per qualsiasi cerchio selezionato. Ecco come potrebbe apparire quel grafico.

Tuttavia, questo è ciò che accade quando viene selezionato un cerchio diverso.

Sembra che il testo venga eliminato e ricreato ad ogni esecuzione del grafico. In realtà, la posizione del testo viene modificata a seconda del cerchio selezionato. Quindi è lo stesso testo, in un punto diverso. Per creare un nuovo testo ogni volta, è necessario modificare le impostazioni dell'unione di oggetti di Dynamo in modo che non vengano mantenuti i dati di unione (vedere di seguito).

Dopo aver apportato questa modifica, otteniamo il funzionamento desiderato.

hashtag
Impostazioni di unione

Dynamo for Civil 3D consente di modificare il funzionamento di default dell'unione di oggetti tramite le impostazioni di Archivio dati di unione nel menu Dynamo.

circle-info

Notare che le opzioni di Archivio dati di unione sono disponibili in Civil 3D 2022.1 e versioni successive.

Tutte le opzioni sono attivate per default. Ecco un riepilogo delle funzionalità di ciascuna opzione.

hashtag
Opzione 1: Nessun dato di unione mantenuto

Quando questa opzione è attivata, Dynamo "dimentica" gli oggetti che ha creato l'ultima volta che il grafico è stato eseguito. Il grafico può essere eseguito in qualsiasi Carta in qualunque situazione e creerà nuovi oggetti ogni volta.

circle-info

Quando utilizzare

Utilizzare questa opzione quando si desidera che Dynamo "dimentichi" tutto ciò che ha svolto nelle esecuzioni precedenti e crei nuovi oggetti ogni volta.

hashtag
Opzione 2: Memorizza nel grafico per Dynamo

Questa opzione indica che i metadati dell'unione di oggetti verranno serializzati nel grafico (file .dyn) al momento del salvataggio. Se si chiude/riapre il grafico e lo si esegue nella stessa Carta, tutto dovrebbe funzionare come è stato lasciato. Se si esegue il grafico in una Carta diversa, i dati dell'unione verranno rimossi dal grafico e verranno creati nuovi oggetti. Ciò significa che se si apre la Carta originale ed si riesegue il grafico, verranno creati nuovi oggetti oltre a quelli precedenti.

circle-info

Quando utilizzare

Utilizzare questa opzione quando si desidera che Dynamo "memorizzi" gli oggetti che ha creato l'ultima volta che è stato eseguito in una Carta specifica.

circle-exclamation

Questa opzione è particolarmente adatta per le situazioni in cui è possibile mantenere un rapporto 1:1 tra una Carta specifica e un grafico di Dynamo. Le opzioni 1 e 3 sono più adatte per i grafici progettati per l'esecuzione su più disegni.

hashtag
Opzione 3: Memorizza nella Carta per Dynamo

Questa opzione è simile all'opzione 2, tranne per il fatto che i dati dell'unione di oggetti vengono serializzati nella Carta anziché nel grafico (file .dyn). Se si chiude/riapre il grafico e lo si esegue nella stessa Carta, tutto dovrebbe funzionare come è stato lasciato. Se il grafico viene eseguito in una Carta diversa, i dati dell'unione sono comunque mantenuti nel disegno originale poiché vengono salvati nel disegno e non nel grafico.

circle-info

Quando utilizzare

Utilizzare questa opzione quando si desidera utilizzare lo stesso grafico in più Carte e fare in modo che Dynamo "memorizzi"ciò che ha svolto in ciascuno.

hashtag
Opzione 4: Memorizza nella Carta per Lettore Dynamo

La prima cosa da notare con questa opzione è che non ha alcun effetto sul modo in cui il grafico interagisce con la Carta quando si esegue il grafico tramite l'interfaccia principale di Dynamo. Questa opzione è valida solo quando il grafico viene eseguito utilizzando il Lettore Dynamo.

circle-info

Se non si conosce il Lettore Dynamo, consultare la sezione .

Se si esegue il grafico utilizzando l'interfaccia principale di Dynamo e quindi si chiude ed esegue lo stesso grafico utilizzando il Lettore Dynamo, verranno creati nuovi oggetti sopra a quelli creati in precedenza. Tuttavia, una volta eseguito il grafico, il Lettore Dynamo serializzerà i dati dell'unione di oggetti nella Carta. Pertanto, se si esegue il grafico più volte tramite il Lettore Dynamo, gli oggetti verranno aggiornati anziché creati di nuovi. Se si esegue il grafico tramite il Lettore Dynamo in una Carta diversa, i dati dell'unione sono comunque mantenuti nella Carta originale poiché vengono salvati nella Carta e non nel grafico.

circle-info

Quando utilizzare

Utilizzare questa opzione quando si desidera eseguire un grafico utilizzando il Lettore Dynamo in più Carte e fare in modo che "memorizzi" ciò che ha svolto in ciascuno.

Lettore Dynamo
Modifica dell'input del raggio in Dynamo
Un grafico semplice che posiziona il testo al centro di un cerchio selezionato
Funzionamento di default di Dynamo quando si seleziona un nuovo cerchio
Impostazioni dell'unione di oggetti
Funzionamento con l'unione di oggetti disattivata
Binding di oggetti

Python e Civil 3D

Sebbene Dynamo sia estremamente potente come strumento di programmazione visiva, è anche possibile andare oltre i nodi e i fili e scrivere il codice in forma testuale. Esistono due modi per eseguire questa operazione:

  1. Scrivere DesignScript utilizzando un blocco di codice

  2. Scrivere Python utilizzando un nodo Python

In questa sezione verrà descritto come utilizzare Python nell'ambiente Civil 3D per sfruttare le API .NET di AutoCAD e Civil 3D.

circle-info

Per ulteriori informazioni generali sull'utilizzo di Python in Dynamo, consultare la sezione .

hashtag
Documentazione sull'API

Sia AutoCAD che Civil 3D dispongono di diverse API che consentono agli sviluppatori di estendere il prodotto principale con funzionalità personalizzate. Nel contesto di Dynamo, sono rilevanti le API .NET gestite. I collegamenti riportati di seguito sono essenziali per comprendere la struttura delle API e il loro funzionamento.

circle-info

Nel corso di questa sezione, è possibile che vi siano alcuni concetti con cui non si ha familiarità, come i database, le transazioni, i metodi, le proprietà, ecc. Molti di questi concetti sono fondamentali per l'utilizzo delle API .NET e non sono specifici di Dynamo o Python. Non è compito di questa sezione della Guida introduttiva discutere in dettaglio queste voci, per cui si consiglia di consultare spesso i collegamenti riportati sopra per ulteriori informazioni.

hashtag
Modello di codice

Quando si modifica per la prima volta un nuovo nodo Python, questo verrà precompilato con il codice modello per iniziare. Ecco una schematizzazione del modello con spiegazioni su ciascun blocco.

  1. Importa i moduli sys e clr, entrambi necessari per il corretto funzionamento dell'interprete Python. In particolare, il modulo clr consente di trattare gli spazi dei nomi .NET essenzialmente come pacchetti Python.

  2. Carica gli assiemi standard (ad esempio, DLL) per l'utilizzo delle API .NET gestite per AutoCAD e Civil 3D.

circle-info

Personalizzazione È possibile modificare il modello Python di default modificando il file PythonTemplate.py che si trova in C:\ProgramData\Autodesk\C3D <versione>\Dynamo.

hashtag
Esempio

Esaminiamo un esempio per dimostrare alcuni dei concetti essenziali della scrittura di script Python in Dynamo for Civil 3D.

hashtag
Scopo

🎯 Ottenere la geometria del contorno di tutti i drenaggi di un disegno.

hashtag
Set di dati

Di seguito sono riportati alcuni file di esempio a cui è possibile fare riferimento per questo esercizio.

hashtag
Panoramica della soluzione

Ecco una panoramica della logica di questo grafico.

  1. Rivedere la documentazione sull'API di Civil 3D

  2. Selezionare tutti i drenaggi nel documento in base al nome del layer

  3. Annullamento del wrapping degli oggetti di Dynamo per accedere ai membri interni dell'API di Civil 3D

Procediamo!

hashtag
Revisione della documentazione sull'API

Prima di iniziare a costruire il grafico e scrivere il codice, è consigliabile esaminare la documentazione sull'API di Civil 3D e avere un'idea di ciò che è disponibile nell'API. In questo caso, è presente una che restituirà i punti di contorno del drenaggio. Tenere presente che questa proprietà restituisce un oggetto Point3dCollection, di cui Dynamo non sa che farsene. In altre parole, non sarà possibile creare una PolyCurve da un Point3dCollection, quindi alla fine sarà necessario convertire tutto in punti di Dynamo. Vedere più avanti per saperne di più.

hashtag
Recupero di tutti i drenaggi

Ora è possibile iniziare a costruire la logica del grafico. La prima cosa da fare è ottenere un elenco di tutti i drenaggi nel documento. Sono disponibili nodi per questo, pertanto non è necessario includerli nello script Python. L'utilizzo dei nodi offre una migliore visibilità per un altro utente che potrebbe leggere il grafico (anziché aggiungere codice eccessivo in uno script Python) e mantiene lo script Python concentrato su una cosa: restituire i punti di contorno dei drenaggi.

Notare che l'output del nodo All Objects on Layer è un elenco di CivilObject. Questo perché Dynamo for Civil 3D non dispone attualmente di nodi per l'utilizzo dei drenaggi, che è il motivo completo per cui è necessario accedere all'API tramite Python.

hashtag
Annullamento del wrapping di oggetti

Prima di proseguire, occorre parlare brevemente di un concetto importante. Nella sezione , è stata descritta la relazione tra Object e CivilObject. Per aggiungere un po' più di dettagli a questo argomento, un Object di Dynamo è un wrapper intorno ad un Entity di AutoCAD. Analogamente, un CivilObject di Dynamo è un wrapper intorno ad un Entity di Civil 3D. È possibile annullare il wrapping di un oggetto accedendo alle relative proprietà InternalDBObject o InternalObjectId.

Tipo di Dynamo
Wrapping
circle-exclamation

In genere, è più sicuro ottenere l'ID oggetto utilizzando la proprietà `InternalObjectId` e quindi accedere all'oggetto con wrapping in una transazione. Questo perché la proprietà `InternalDBObject` restituisce un DBObject di AutoCAD non in stato scrivibile.

hashtag
Script Python

Ecco l'intero script Python che esegue il lavoro di accesso agli oggetti Catchment interni, che ottengono i loro punti di contorno. Le righe evidenziate rappresentano quelle modificate/aggiunte dal codice modello di default.

circle-info

Fare clic sul testo sottolineato nello script per una spiegazione di ogni riga.

circle-exclamation

In genere, è consigliabile includere la maggior parte della logica di script all'interno di una transazione. In questo modo si garantisce l'accesso sicuro agli oggetti che lo script sta leggendo/scrivendo. In molti casi, omettere una transazione può causare un errore irreversibile.

hashtag
Creazione di PolyCurve

In questa fase, lo script Python dovrebbe generare un elenco di punti di Dynamo che è possibile vedere nell'anteprima di sfondo. L'ultimo passaggio consiste nel creare semplicemente PolyCurve dai punti. Si noti che questa operazione potrebbe essere effettuata anche direttamente nello script Python, ma noi l'abbiamo volutamente inserita al di fuori dello script in un nodo, in modo che sia più visibile. Ecco come appare il grafico finale.

hashtag
Risultato

Ed ecco la geometria finale di Dynamo.

🎉 Missione compiuta!

hashtag
Confronto tra IronPython e CPython

Solo una breve nota prima di concludere. A seconda della versione di Civil 3D in uso, il nodo Python potrebbe essere configurato in modo diverso. In Civil 3D 2020 e 2021, Dynamo ha utilizzato uno strumento denominato IronPython per spostare i dati tra gli oggetti .NET e gli script Python. In Civil 3D 2022, tuttavia, Dynamo è passato a utilizzare l'interprete Python nativo standard (noto anche come CPython) anziché Python 3. I vantaggi di questa transizione includono l'accesso alle librerie moderne più diffuse e alle nuove funzionalità della piattaforma, alla manutenzione essenziale e alle patch di sicurezza.

circle-info

È possibile leggere ulteriori informazioni su questa transizione e su come aggiornare gli script precedenti nel . Se si desidera continuare ad utilizzare IronPython, sarà sufficiente installare il pacchetto DynamoIronPython2.7 utilizzando Dynamo Package Manager.

Aggiunge riferimenti agli spazi dei nomi standard di AutoCAD e Civil 3D. Sono equivalenti alle direttive using o Imports rispettivamente in C# o VB.NET.

  • Le porte di input del nodo sono accessibili utilizzando un elenco predefinito denominato IN. È possibile accedere ai dati in una porta specifica utilizzando il relativo numero di indice, ad esempio dataInFirstPort = IN[0].

  • Ottiene il documento e l'editor attivi.

  • Blocca il documento e avvia una transazione di database.

  • Questo è il punto in cui si dovrebbe inserire la maggior parte della logica dello script.

  • Annullare i commenti di questa riga per eseguire il commit della transazione dopo il completamento del lavoro principale.

  • Se si desidera eseguire l'output di eventuali dati dal nodo, assegnarli alla variabile OUT alla fine dello script.

  • Creare punti di Dynamo da punti di AutoCAD

  • Crea PolyCurve dai punti

  • Object Autodesk.AutoCAD.DynamoNodes.Object

    Entity Autodesk.AutoCAD.DatabaseServices.Entity

    CivilObject Autodesk.Civil.DynamoNodes.CivilObject

    Entity Autodesk.Civil.DatabaseServices.Entity

    Python
    AutoCAD .NET API Developer's Guidearrow-up-right
    Manuale di riferimento dell'API di AutoCAD .NETarrow-up-right
    Civil 3D .NET API Developer's Guidearrow-up-right
    Civil 3D .NET API Reference Guidearrow-up-right
    file-download
    15KB
    Python_Catchments.dyn
    arrow-up-right-from-squareOpen
    file-download
    961KB
    Python_Catchments.dwg
    arrow-up-right-from-squareOpen
    proprietà nella classe Catchmentarrow-up-right
    Libreria di nodi
    blog di Dynamoarrow-up-right
    Modello Python di default in Civil 3D
    Recupero di tutti i drenaggi nel documento in base al layer
    Il grafico finale
    Le PolyCurve di Dynamo risultanti per i contorni di drenaggio
    # Load the Python Standard and DesignScript Libraries
    import sys
    import clr
    
    # Add Assemblies for AutoCAD and Civil3D
    clr.AddReference('AcMgd')
    clr.AddReference('AcCoreMgd')
    clr.AddReference('AcDbMgd')
    clr.AddReference('AecBaseMgd')
    clr.AddReference('AecPropDataMgd')
    clr.AddReference('AeccDbMgd')
    
    clr.AddReference('ProtoGeometry')
    
    # Import references from 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 references from Civil3D
    from Autodesk.Civil.ApplicationServices import *
    from Autodesk.Civil.DatabaseServices import *
    
    from Autodesk.DesignScript.Geometry import Point as DynPoint
    
    # The inputs to this node will be stored as a list in the IN variables.
    objs = IN[0]
    
    output = [] 
    
    if objs is None:
        sys.exit("The input is null or empty.")
    
    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 before end transaction
                t.Commit()
                pass
                
    # Assign your output to the OUT variable.
    OUT = output