Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Dynamo è un'applicazione di programmazione visiva che può essere scaricata ed eseguita in modalità "Sandbox" indipendente o come plug-in per altri software come Revit, FormIt o Civil 3D.
Ulteriori informazioni sulla differenza tra Dynamo Core/Revit/Sandbox.
Dynamo consentirà di lavorare all'interno di un processo di programmazione visiva in cui si collegano gli elementi per definire le relazioni e le sequenze di azioni che compongono algoritmi personalizzati. Si possono utilizzare gli algoritmi per una vasta gamma di applicazioni, dall'elaborazione dei dati alla generazione della geometria, il tutto in tempo reale e senza dover scrivere una riga di code
.
Nodi e fili sono i componenti chiave di Dynamo per supportare un processo di programmazione visiva. Consente di stabilire forti relazioni visive e sistemiche tra le parti di un progetto. Con un semplice clic del mouse è possibile collegare facilmente i nodi, sviluppando e ottimizzando il workflow di progettazione.
Dall'utilizzo della programmazione visiva per i workflow dei progetti allo sviluppo di strumenti personalizzati, Dynamo è un aspetto integrante di un'ampia gamma di applicazioni straordinarie.
Dalle sue origini come componente aggiuntivo per il Building Information Modeling (BIM) in Revit, Dynamo è maturato fino a diventare molte cose. Soprattutto, è una piattaforma che consente ai progettisti di esplorare la programmazione visiva, risolvere i problemi e creare i loro strumenti. Per iniziare il viaggio con Dynamo, occorre impostare un contesto: che cos'è e come utilizzarlo?
L'interfaccia utente per Dynamo è organizzata in cinque aree principali. Verrà illustrata brevemente la panoramica qui e verranno descritte ulteriormente l'area di lavoro e la Libreria nelle sezioni seguenti.
Menu
Barra degli strumenti
Libreria
Area di lavoro
Barra di esecuzione
Di seguito sono riportati i menu per le funzionalità di base dell'applicazione Dynamo. Come la maggior parte del software Windows, i primi due menu sono relativi alla gestione dei file, alle operazioni di selezione e modifica del contenuto. I menu rimanenti sono più specifici di Dynamo.
Informazioni generali e impostazioni sono disponibili nel menu a discesa di Dynamo.
Informazioni su: indica la versione di Dynamo installata nel computer in uso.
Contratto per raccogliere dati di usabilità: consente di aderire o meno alla condivisione dei dati utente per migliorare Dynamo.
Preferenze: include impostazioni quali la definizione della precisione decimale e della qualità di rendering della geometria dell'applicazione.
Chiudi Dynamo.
Se si è bloccati, consultare il menu ?. È possibile accedere ad uno dei siti Web di riferimento di Dynamo tramite il browser Internet.
Introduzione: mostra una breve introduzione all'utilizzo di Dynamo.
Guide interattive -
Esempi: fornisce file di esempio di riferimento.
Dizionario di Dynamo: rappresenta una risorsa con documentazione su tutti i nodi.
Sito Web di Dynamo: consente di visualizzare il progetto di Dynamo su GitHub.
Wiki progetto di Dynamo: consente di visitare la pagina Wiki per informazioni sullo sviluppo mediante l'API di Dynamo, gli strumenti e le librerie di supporto.
Visualizza pagina iniziale: consente di tornare alla pagina iniziale di Dynamo quando ci si trova all'interno di un documento.
Segnala un bug: consente di aprire un problema in GitHub.
La barra degli strumenti di Dynamo contiene una serie di pulsanti per l'accesso rapido ai file, nonché i comandi Annulla [CTRL+Z] e Ripeti [CTRL+Y]. All'estrema destra è presente un altro pulsante che consente di esportare un'istantanea dell'area di lavoro, che è estremamente utile per la documentazione e la condivisione.
La Libreria di Dynamo è una raccolta di librerie funzionali, ciascuna contenente nodi raggruppati per categoria. È costituita da librerie di base che vengono aggiunte durante l'installazione di default di Dynamo. Nel corso dell'introduzione del suo l'utilizzo, verrà illustrato come estendere le funzionalità di base con nodi personalizzati e pacchetti aggiuntivi. La sezione Libreria fornirà una guida più dettagliata sull'utilizzo di questa funzionalità.
L'area di lavoro è il luogo dove vengono creati i programmi visivi; è possibile modificare anche l'impostazione Anteprima per visualizzare le geometrie 3D da qui. Per ulteriori dettagli, fare riferimento a Area di lavoro.
Eseguire lo script di Dynamo da qui. Fare clic sull'icona dell'elenco a discesa sul pulsante di esecuzione per passare da una modalità all'altra.
Automatico: consente di eseguire automaticamente lo script. Le modifiche vengono aggiornate in tempo reale.
Manuale: lo script viene eseguito solo quando si fa clic sul pulsante Esegui. È utile per quando si apportano modifiche ad uno script complesso e "pesante".
Periodico: questa opzione è disattivata per default. È disponibile solo quando viene utilizzato il nodo DateTime.Now. È possibile impostare l'esecuzione automatica del grafico ad un intervallo specificato.
Questa guida introduttiva include capitoli sviluppati con Mode Lab. Questi capitoli sono incentrati sugli elementi essenziali necessari per imparare a sviluppare i propri programmi visivi con Dynamo e sulle informazioni essenziali su come far evolvere Dynamo.
Questa guida è stata progettata per fornire ai lettori contenuti su diversi livelli di esperienza e competenza. L'introduzione generale sull'impostazione di Dynamo, sull'interfaccia utente e sui concetti chiave è disponibile nelle seguenti sezioni. Si consiglia ai nuovi utenti di approfondire i seguenti argomenti:
Per gli utenti che desiderano sviluppare una comprensione più approfondita di ciascun elemento, ad esempio un nodo specifico e il concetto che sta alla base, vengono trattati i concetti fondamentali nel capitolo dedicato.
Se si desidera visualizzare la dimostrazione dei workflow di Dynamo, sono stati inclusi alcuni grafici nella sezione Esempi di workflow. Seguire le istruzioni allegate per creare grafici di Dynamo personalizzati.
Nei capitoli successivi sono disponibili altri esercizi specifici per gli argomenti, poiché vengono trattati argomenti diversi su Dynamo. Gli esercizi sono in genere disponibili nell'ultima sezione di ogni pagina.
Dynamo non sarebbe quello che è senza un forte gruppo di utenti avidi e collaboratori attivi. Per coinvolgere la comunità, è possibile seguire il blog, aggiungere il proprio lavoro alla galleria o discutere di Dynamo nel forum.
Dynamo è concepito come uno strumento di programmazione visiva per i progettisti che consente di realizzare strumenti i quali sfruttano le librerie esterne o qualsiasi prodotto Autodesk dotato di un'API. Con Dynamo Sandbox è possibile sviluppare programmi in un'applicazione di tipo "sandbox", ma l'ecosistema di Dynamo continua a crescere.
Il codice sorgente del progetto è open source e permette di estenderne le funzionalità nel modo desiderato. È possibile consultare il progetto su GitHub e individuare le iniziative in corso di personalizzazione di Dynamo da parte degli utenti.
È possibile sfogliare, creare una copia tramite fork e iniziare ad estendere Dynamo in base alle proprie esigenze.
Dynamo è una piattaforma di programmazione visiva open source per progettisti.
È appena stata aperta Dynamo Primer, una guida completa alla programmazione visiva in Autodesk Dynamo. Questa guida introduttiva è un progetto in corso per condividere i principi fondamentali della programmazione. Gli argomenti trattati includono: uso della geometria computazionale, procedure ottimali per la progettazione basata su regole, applicazioni di programmazione interdisciplinari e altro ancora con la piattaforma Dynamo.
La potenza di Dynamo si trova in un'ampia gamma di attività correlate alla progettazione. Dynamo consente di accedere ad un elenco in espansione di modi facilmente accessibili per iniziare:
Esplorare la programmazione visiva per la prima volta
Connettere i workflow in diversi tipi di software
Coinvolgere una comunità attiva di utenti, collaboratori e sviluppatori
Sviluppare una piattaforma open source per un miglioramento costante
Nell'ambito di questa attività e per l'interessante opportunità di lavorare con Dynamo, occorre un documento dello stesso calibro, Dynamo Primer.
Fare riferimento alla Guida introduttiva per scoprire cosa ci si può aspettare di imparare da questo documento.
Stiamo migliorando costantemente Dynamo, pertanto alcune funzionalità potrebbero avere un aspetto diverso da quello rappresentato in questa guida introduttiva. Tuttavia, tutte le modifiche alle funzionalità verranno rappresentate correttamente.
Il progetto Dynamo Primer è open source. Siamo dedicati a fornire contenuto di qualità e apprezziamo qualsiasi eventuale feedback fornito. Se si desidera segnalare un problema su qualsiasi aspetto, pubblicare il messaggio nella pagina dei problemi su GitHub: https://github.com/DynamoDS/DynamoPrimer/issues
Per contribuire ad una nuova sezione, a modifiche o a qualsiasi altro elemento del progetto, controllare il repository su GitHub per iniziare: https://github.com/DynamoDS/DynamoPrimer.
Dynamo Primer è un progetto open source avviato da Matt Jezyk e dal team di sviluppo di Dynamo di Autodesk.
Mode Lab è stata incaricata di scrivere la prima edizione della Guida introduttiva. La ringraziamo per tutti gli sforzi profusi nel creare questa preziosa risorsa.
John Pierson del team Parallax è stato incaricato di aggiornare la Guida introduttiva in modo che rifletta le revisioni di Dynamo 2.0.
Matterlab è stato incaricato di aggiornare la Guida introduttiva in modo che rifletta le revisioni di Dynamo 2.13.
Matterlab è stato incaricato di aggiornare la Guida introduttiva in modo che rifletta le revisioni di Dynamo 2.17.
Wood Rodgers è stato incaricato di aggiornare la Guida introduttiva con il contenuto per Dynamo for Civil 3D.
Un ringraziamento speciale va a Ian Keough per aver avviato e guidato il progetto Dynamo.
Grazie a Matt Jezyk, Ian Keough, Zach Kron, Racel Amour e Colin McCrone per la collaborazione entusiasta e l'opportunità di partecipare ad un'ampia gamma di progetti Dynamo.
Dynamo Consultare i seguenti siti per la release stabile più recente di Dynamo.
http://dynamobim.com/download/ o http://dynamobuilds.com
*Nota: a partire da Revit 2020, Dynamo è incluso con le release di Revit e pertanto non è necessaria l'installazione manuale. Ulteriori informazioni sono disponibili in questo post del blog.
DynamoBIM La migliore fonte per ulteriori informazioni, contenuto di formazione e forum è il sito Web di DynamoBIM.
http://dynamobim.org
Dynamo GitHub Dynamo è un progetto di sviluppo open source su GitHub. Per contribuire, visitare la pagina di DynamoDS.
https://github.com/DynamoDS/Dynamo
Contatto In caso di eventuali problemi relativi a questo documento, è possibile contattarci.
Dynamo@autodesk.com
Copyright 2023 Autodesk
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Nuovo: consente di creare un nuovo file .dyn.
Apri: consente di aprire un file .dyn (area di lavoro) o .dyf (nodo personalizzato) esistente.
Salva/Salva con nome: consente di salvare il file .dyn o .dyf attivo.
Annulla: consente di annullare l'ultima azione.
Ripeti: consente di ripetere l'azione successiva.
Esporta area di lavoro come immagine: consente di esportare l'area di lavoro visibile come file PNG.
In questa sezione, vengono introdotti i nodi essenziali disponibili nella libreria di Dynamo che consentono di creare un programma visivo personalizzato come un professionista.
Geometria per la progettazione computazionale: come si lavora con gli elementi geometrici in Dynamo? Si esplorano diversi modi per creare geometrie semplici o complesse da primitive.
Elementi di base di programmi: che cosa sono i "dati" e quali sono i tipi di elementi fondamentali che è possibile iniziare a utilizzare nei programmi? Inoltre, è descritto come incorporare le operazioni matematiche e logiche nel workflow di progettazione.
Progettazione con elenchi: come gestire e coordinare le strutture di dati? Sono fornite ulteriori informazioni sul concetto di elenco e su come utilizzarlo per gestire i dati di progettazione in modo efficiente.
Dizionari in Dynamo: che cosa sono i dizionari? È descritto come utilizzare i dizionari per cercare dati e valori specifici dai risultati esistenti.
Dynamo è un progetto di sviluppo open source attivo. Scoprire l'elenco di software che supporta Dynamo.
Dynamo viene preinstallato con software come Revit3D, FormIt, Civil3D e così via.
Per ulteriori informazioni sull'utilizzo di Dynamo con un software specifico, si consiglia di consultare le seguenti sezioni:
Se si desidera utilizzare Dynamo come applicazione indipendente, continuare la lettura per ottenere consigli sul download di Sandbox.
L'applicazione Dynamo è disponibile nel sito Web di Dynamo. Le versioni ufficiali, passate o pre-rilasciate sono disponibili nella pagina di download. Visitare la pagina Get Dynamo e fare clic su Download per la versione ufficiale rilasciata.
Se si cercano release di sviluppo precedenti o "bleeding edge", tutte le versioni sono disponibili nella sezione inferiore della stessa pagina.
La release di sviluppo "bleeding edge" potrebbe includere alcune funzionalità nuove e sperimentali che non sono ancora state testate completamente, quindi potrebbe essere instabile. Utilizzando questo strumento, si potrebbero scoprire bug o problemi; per aiutarci a migliorare l'applicazione segnalare i problemi al nostro team.
Ai principianti viene consigliato di scaricare la release ufficiale stabile.
Prima di avviare qualsiasi versione scaricata, è necessario decomprimere il contenuto nella cartella scelta.
Scaricare e installare 7zip nel computer per questo passaggio.
Fare clic con il pulsante destro del mouse sul file .zip e selezionare Estrai tutto.
Scegliere una destinazione per decomprimere tutti i file.
Nella cartella di destinazione, fare doppio clic su DynamoSandbox.exe per avviarlo.
Verrà visualizzata la schermata di avvio di Dynamo Sandbox come indicato di seguito.
Congratulazioni, è stata completata l'installazione per l'utilizzo di Dynamo Sandbox.
Geometry è una funzionalità aggiuntiva in Dynamo Sandbox che è disponibile solo per gli utenti che dispongono di una licenza o di un abbonamento corrente per il seguente software Autodesk: Revit, Robot Structural Analysis, FormIt e Civil 3D. Geometry consente agli utenti di importare, creare, modificare ed esportare la geometria da Dynamo Sandbox.
In Dynamo, i nodi sono gli oggetti collegati per formare un programma visivo. Ogni nodo esegue un'operazione; talvolta può essere semplice come memorizzare un numero o può essere un'azione più complessa come creare o sottoporre a query la geometria.
La maggior parte dei nodi in Dynamo è composta da cinque parti. Sebbene vi siano eccezioni, ad esempio i nodi di input, la struttura di ogni nodo può essere descritta come segue:
Nome: il nome del nodo con una convenzione di denominazione
Category.Name
.Corpo principale: il corpo principale del nodo. Facendo clic con il pulsante destro del mouse qui vengono visualizzate le opzioni a livello dell'intero nodo.
Porte (entrata e uscita): i ricettori dei fili che forniscono i dati di input al nodo e i risultati dell'azione del nodo.
Valore di default: fare clic con il pulsante destro del mouse su una porta di input. Alcuni nodi presentano valori di default che è possibile utilizzare o meno.
Icona di collegamento: indica l'opzione Collegamento specificata per gli input dell'elenco corrispondenti (verranno fornite ulteriori informazioni in seguito).
Gli input e gli output per i nodi sono denominati porte e fungono da prese per i fili. I dati entrano nel nodo mediante le porte a sinistra e fuoriescono dal nodo dopo che è stata eseguita l'operazione a destra.
Si prevede che le porte ricevano dati di un certo tipo. Ad esempio, se si collega un numero come 2.75 alle porte su un nodo Point.ByCoordinates, la creazione di un punto verrà eseguita correttamente. Se tuttavia si specifica Red nella stessa porta, verrà generato un errore.
Suggerimento Posizionare il cursore su una porta per visualizzare una descrizione comando contenente il tipo di dati previsto.
Etichetta della porta
Descrizione comando
Tipo di dati
Default Value
In Dynamo viene fornita un'indicazione dello stato di esecuzione del programma visivo tramite il rendering dei nodi con diversi schemi di colori basati sullo stato di ogni nodo. La gerarchia degli stati segue questa sequenza: Errore > Avviso > Informazioni > Anteprima.
Se si posiziona il cursore o si fa clic con il pulsante destro del mouse sul nome o sulle porte, vengono visualizzate informazioni e opzioni aggiuntive.
Input soddisfatti: un nodo con barre verticali blu sulle relative porte di input è collegato correttamente e tutti i relativi input sono connessi correttamente.
Input non soddisfatti: è necessario che tali input siano collegati ad un nodo con una barra verticale rossa su una o più porte di input.
Funzione: un nodo che genera una funzione e presenta una barra verticale grigia su una porta di output è un nodo di funzione.
Selezionato: i nodi attualmente selezionati hanno un'evidenziazione verde acqua sul bordo.
Congelato: un nodo blu traslucido viene congelato, sospendendo l'esecuzione del nodo.
Avviso: una barra di stato gialla sotto il nodo indica lo stato di avviso, ovvero nel nodo se risultano mancanti dati di input o se sono presenti tipi di dati errati.
Errore: una barra di stato rossa sotto il nodo indica che il nodo si trova in uno stato di errore.
Informazioni: una barra di stato blu al di sotto del nodo indica lo stato Informazioni, che contrassegna le informazioni utili sui nodi. Questo stato può essere attivato quando si avvicina ad un valore massimo supportato dal nodo, utilizzando un nodo in un modo che ha potenziali impatti sulle prestazioni e così via.
Suggerimento Con queste informazioni sulla descrizione comando, esaminare i nodi a monte per verificare se la struttura di dati o il tipo di dati richiesto è errato.
Descrizione comando di avviso: impossibile interpretare un valore "null" o i dati come Double, ossia un numero.
Utilizzare il nodo Watch per esaminare i dati di input.
A monte il nodo Number memorizza Red e non un numero.
In alcune situazioni, è possibile impedire l'esecuzione di nodi specifici nel programma visivo. A tale scopo, è possibile congelare il nodo, un'opzione presente nel menu di scelta rapida del nodo.
Congelando un nodo si congelano anche i nodi a valle. In altre parole, verranno congelati anche tutti i nodi che dipendono dall'output di un nodo congelato.
I fili si collegano tra i nodi per creare relazioni e stabilire il flusso del programma visivo. Si può pensare ai fili letteralmente come fili elettrici che trasmettono impulsi di dati da un oggetto a quello successivo.
I fili collegano la porta di output di un nodo alla porta di input di un altro nodo. Questa direzionalità definisce il flusso di dati nel programma visivo.
Le porte di input sono sul lato sinistro e le porte di output si trovano sul lato destro dei nodi, pertanto, è possibile generalmente affermare che il flusso del programma si sposta da sinistra a destra.
Creare un filo facendo clic con il pulsante sinistro del mouse su una porta, quindi facendo clic con il pulsante sinistro del mouse sulla porta di un altro nodo per creare un collegamento. Mentre è in corso il processo di creazione di un collegamento, il filo risulterà tratteggiato e verrà eseguito lo snap per diventare linee continue quando è stato collegato correttamente.
I dati fluiscono sempre attraverso questo filo dall'output all'input. È tuttavia possibile creare il filo in entrambe le direzioni in termini di una sequenza di clic sulle porte collegate.
Spesso è necessario regolare il flusso di programma nel programma visivo modificando i collegamenti rappresentati dai fili. Per modificare un filo, fare clic sulla porta di input del nodo già collegato. Si hanno ora a disposizione due opzioni:
Per modificare il collegamento in una porta di input, fare clic con il pulsante sinistro del mouse su un'altra porta di input.
Per rimuovere il filo, trascinarlo e fare clic con il pulsante sinistro del mouse sull'area di lavoro.
Ricollegare più fili utilizzando MAIUSC+clic con pulsante sinistro del mouse.
Duplicare un filo mediante CTRL+clic con il pulsante sinistro del mouse.
Per default, i fili verranno visualizzati in anteprima con un tratto di colore grigio. Quando si seleziona un nodo, verrà eseguito il rendering di qualsiasi filo collegato con la stessa evidenziazione di color azzurro del nodo.
Filo evidenziato
Filo di default
Occultamento di fili per default
Se si preferisce nascondere i fili nel grafico, è possibile trovare questa opzione da Vista > Connettori > deselezionare Mostra connettori.
Con questa impostazione, solo i nodi selezionati e i relativi fili di unione verranno mostrati con una leggera evidenziazione verde acqua.
È anche possibile nascondere solo il filo selezionato facendo clic con il pulsante destro del mouse sull'output Nodi > selezionare Nascondi fili.
La Libreria contiene tutti i nodi caricati, compresi i dieci nodi delle categorie di default forniti con l'installazione, nonché eventuali pacchetti o nodi personalizzati caricati aggiuntivi. I nodi della Libreria sono organizzati in modo gerarchico all'interno di librerie, categorie e, se necessario, sottocategorie.
Nodi di base: vengono forniti con l'installazione di default.
Nodi personalizzati: consentono di memorizzare le routine o il grafico speciale utilizzati più di frequente come nodi personalizzati. È inoltre possibile condividere i nodi personalizzati con la community.
Nodi di Package Manager: raccolta di nodi personalizzati pubblicati.
Si esamineranno le categorie della gerarchia dei nodi, si mostreranno come eseguire ricerche rapide dalla libreria e si apprenderanno delle informazioni su alcuni dei nodi utilizzati più di frequente tra di essi.
Sfogliare queste categorie è il modo più rapido per comprendere la gerarchia di ciò che è possibile aggiungere all'area di lavoro e il modo migliore per scoprire nuovi nodi non utilizzati in precedenza.
Sfogliare la Libreria facendo clic sui menu per espandere ogni categoria e la relativa sottocategoria.
Geometry è un menu di grande utilità per iniziare ad esplorare poiché contiene la maggior quantità di nodi.
Libreria
Categoria
Sottocategoria
Nodo
Questi consentono di suddividere ulteriormente i nodi nella stessa sottocategoria in base al fatto se i nodi creano dei dati, eseguono un'Azione o una Query sui dati.
Posizionare il cursore del mouse su un nodo per visualizzare informazioni più dettagliate oltre al nome e all'icona. Questo offre un modo rapido per comprendere cosa fa il nodo, cosa richiederà per gli input e cosa verrà fornito come output.
Descrizione: descrizione con linguaggio normale del nodo
Icona: versione più grande dell'icona nel menu Libreria
Input: nome, tipo di dati e struttura di dati
Output: tipo di dati e struttura
Se si conosce con relativa specificità il nodo che si desidera aggiungere all'area di lavoro, digitare nel campo di ricerca per cercare tutti i nodi corrispondenti.
Scegliere facendo clic sul nodo che si desidera aggiungere o premere INVIO per aggiungere i nodi evidenziati al centro dell'area di lavoro.
Oltre a utilizzare le parole chiave per cercare di trovare i nodi, è possibile digitare la gerarchia separata con un punto nel campo di ricerca o con i Code Block (che utilizzano il linguaggio testuale di Dynamo).
La gerarchia di ogni libreria si riflette nel nome dei nodi aggiunti all'area di lavoro.
Digitando parti differenti della posizione del nodo nella gerarchia della Libreria nel formato library.category.nodeName
, vengono restituiti risultati diversi:
library.category.nodeName
category.nodeName
nodeName
o keyword
In genere, il nome del nodo nell'area di lavoro verrà sottoposto a rendering nel formato category.nodeName
, con alcune eccezioni significative, in particolare nelle categorie Input e View.
Tenere presente i nodi denominati in modo simile e osservare la differenza della categoria:
I nodi della maggior parte delle librerie includeranno il formato della categoria.
Point.ByCoordinates
e UV.ByCoordinates
hanno lo stesso nome ma provengono da categorie differenti.
Eccezioni importanti includono funzioni integrate, Core.Input, Core.View e operatori.
Con centinaia di nodi inclusi nell'installazione di base di Dynamo, quali sono essenziali per lo sviluppo dei programmi visivi? Ci si concentrerà su quelli che consentono di definire i parametri del programma (Input), vedere i risultati dell'azione di un nodo (Watch) e definire gli input o le funzionalità mediante una scorciatoia (Code Block).
I nodi di input sono il mezzo principale per l'utente del programma visivo, sia che si tratti dell'utente corrente sia di qualcun altro, per interfacciarsi con i parametri chiave. Di seguito sono riportate alcune informazioni disponibili nella Libreria principale:
Boolean
Numero
String
Number Slider
Directory Path
Integer Slider
File Path
I nodi Watch sono essenziali per gestire i dati che fluiscono nel programma visivo. È possibile visualizzare il risultato di un nodo tramite l'anteprima dei dati del nodo posizionando il cursore del mouse sul nodo.
Sarà utile per mantenere la visualizzazione in un nodo Watch.
In alternativa, è possibile visualizzare i risultati della geometria tramite un nodo Watch 3D.
Entrambi sono disponibili nella categoria View della libreria Core.
Suggerimento Talvolta l'anteprima 3D può distrarre l'utente quando il programma visivo contiene molti nodi. Per visualizzare l'anteprima della geometria, è consigliabile deselezionare l'opzione Mostra anteprima sfondo 3D nel menu Impostazioni e utilizzare un nodo Watch 3D.
I nodi Code Block possono essere utilizzati per definire un blocco di codice con righe separate da punti e virgola. Può essere semplice come X/Y
.
È inoltre possibile utilizzare i Code Block come scorciatoia per definire un input numerico o chiamare la funzionalità di un altro nodo. La sintassi per eseguire questa operazione segue la convenzione di denominazione del linguaggio testuale di Dynamo, DesignScript.
Di seguito è disponibile una semplice dimostrazione (con le istruzioni) per l'utilizzo di Code Block nello script.
Fare doppio clic per creare un nodo Code Block.
Circle.ByCenterPointRadius(x,y);
Tipo
Fare clic sull'area di lavoro per annullare la selezione e aggiungere automaticamente gli input x
e y
.
Creare un nodo Point.ByCoordinates e Number Slider, quindi collegarli agli input di Code Block.
Il risultato dell'esecuzione del programma visivo viene mostrato come cerchio nell'anteprima 3D.
L'area di lavoro di Dynamo è costituita da quattro elementi principali.
Tutte le schede attive.
Modalità anteprima
Controlli di zoom/panoramica
Nodo nell'area di lavoro
Quando si apre un nuovo file, per default, viene aperta una nuova area di lavoro iniziale.
È possibile creare un nodo personalizzato e aprirlo in un'area di lavoro del nodo personalizzato.
È consentita una sola area di lavoro iniziale in ogni finestra di Dynamo, ma è possibile avere più aree di lavoro del nodo personalizzato aperte nelle schede.
Sono disponibili tre metodi per passare da un'anteprima all'altra:
a. Utilizzando le icone in alto a destra
b. Fare clic con il pulsante destro del mouse nell'area di lavoro
Passare dall'anteprima 3D all'anteprima del grafico
Passare dall'anteprima del grafico all'anteprima 3D
c. Utilizzando i tasti di scelta rapida (CTRL+B)
È possibile utilizzare le icone o un mouse per spostarsi all'interno di una delle due aree di lavoro.
a. In modalità di anteprima del grafico
Utilizzando le icone:
Utilizzando il mouse:
Fare clic con il pulsante sinistro del mouse - Seleziona
Fare clic con il pulsante sinistro del mouse e trascinare - Casella di selezione per selezionare più nodi
Scorrere il pulsante centrale del mouse su/giù - Zoom avanti/indietro
Fare clic con il pulsante centrale del mouse e trascinare - Panoramica
Fare clic con il pulsante destro del mouse in un punto qualsiasi dell'area di disegno - Aprire la casella di ricerca nell'area di disegno
b. In modalità di anteprima 3D
Utilizzando le icone:
Utilizzando il mouse:
Scorrere il pulsante centrale del mouse su/giù - Zoom avanti/indietro
Fare clic con il pulsante centrale del mouse e trascinare - Panoramica
Fare clic con il pulsante destro del mouse e trascinare - Orbita
Fare clic con il pulsante sinistro del mouse per selezionare un nodo qualsiasi.
Per selezionare più nodi, fare clic e trascinare per creare un riquadro di selezione.
Come ambiente di programmazione visiva, Dynamo consente di definire il modo in cui vengono elaborati i dati. I dati sono numeri o testo, ma così è anche la geometria. Come indicato dal computer, la geometria, o talvolta denominata geometria computazionale, rappresenta i dati che è possibile utilizzare per creare modelli straordinari, complessi o basati sulle prestazioni. A tale scopo, è necessario comprendere gli input e gli output dei vari tipi di geometria utilizzabili.
La geometria è il linguaggio per la progettazione. Quando un ambiente o un linguaggio di programmazione ha un kernel geometrico alla base, si possono sfruttare le possibilità di progettazione di modelli precisi ed efficienti, di automazione delle routine di progettazione e di generazione delle iterazioni di progettazione con algoritmi.
La comprensione dei tipi di geometria e della consente di spostarsi all'interno della raccolta di nodi della geometria disponibili nella libreria. I nodi della geometria sono organizzati in ordine alfabetico, anziché gerarchico. Qui vengono visualizzati in modo simile al loro layout nell'interfaccia di Dynamo.
Inoltre, la realizzazione di modelli in Dynamo e la connessione dell'anteprima di ciò che viene visualizzato nell'anteprima sfondo al flusso di dati nel grafico dovrebbero diventare più intuitive nel tempo.
Si noti il sistema di coordinate presunto sottoposto a rendering mediante griglia e assi colorati.
I nodi selezionati eseguiranno il rendering della geometria corrispondente (se il nodo crea la geometria) nel colore di evidenziazione dello sfondo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
La geometria, tradizionalmente definita, è lo studio della forma, della dimensione, della posizione relativa delle figure e delle proprietà dello spazio. Questo campo ha una ricca storia che risale a migliaia di anni fa. Con l'avvento e la diffusione del computer, si è ottenuto un potente strumento per definire, esplorare e generare la geometria. È ora così semplice calcolare il risultato di interazioni geometriche complesse; il fatto che lo stiamo facendo è quasi trasparente.
Se si è curiosi di vedere come la geometria complessa e diversificata possa utilizzare la potenza del computer, eseguire una rapida ricerca sul Web del coniglio Stanford, un modello canonico utilizzato per testare gli algoritmi.
La comprensione della geometria nel contesto di algoritmi, elaborazione e complessità può sembrare scoraggiante; tuttavia, esistono alcuni principi chiave, relativamente semplici, che si possono stabilire come concetti fondamentali per iniziare a creare applicazioni più avanzate:
La geometria riguarda dati: per il computer e Dynamo, un coniglio non è poi così diverso da un numero.
La geometria si basa sull'astrazione: fondamentalmente, gli elementi geometrici sono descritti da numeri, relazioni e formule all'interno di un determinato sistema di coordinate spaziali.
La geometria ha una gerarchia: i punti sono uniti per creare linee, le linee si uniscono per creare superfici e così via.
La geometria descrive contemporaneamente sia la parte che il tutto: quando si ha una curva, è sia la forma che tutti i punti possibili lungo di essa.
In pratica, questi principi implicano che bisogna essere consapevoli di ciò che si sta utilizzando (quale tipo di geometria, com'è stata creata, ecc.) in modo da poter comporre, scomporre e ricomporre in modo fluido diverse geometrie durante lo sviluppo di modelli più complessi.
Sarà esaminata la relazione tra le descrizioni astratte e gerarchiche della geometria. Poiché questi due concetti sono correlati, ma non sempre ovvi all'inizio, è possibile arrivare rapidamente ad una barriera concettuale quando si iniziano a sviluppare modelli o workflow più profondi. Per i principianti, verrà utilizzata la dimensionalità come un facile descrittore del "materiale" che si modella. Il numero di dimensioni necessarie per descrivere una forma offre una finestra che mostra come la geometria è organizzata gerarchicamente.
Un punto (definito dalle coordinate) non ha dimensioni; sono solo numeri che descrivono ogni coordinata.
Una linea (definita da due punti) ora presenta una dimensione: è possibile "percorrere" la linea in avanti (direzione positiva) o all'indietro (direzione negativa).
Un piano (definito da due linee) presenta due dimensioni: ora è possibile passeggiare più a sinistra o più a destra.
Un parallelepipedo (definito da due piani) ha tre dimensioni: è possibile definire una posizione rispetto all'alto o al basso.
La dimensionalità è un metodo comodo per iniziare a classificare la geometria, ma non è necessariamente il migliore. Dopotutto, non si modellano solo con punti, linee, piani e parallelepipedi. E se si desidera qualcosa di curvo? Inoltre, esiste un'altra categoria di tipi geometrici che sono completamente astratti, ossia definiscono proprietà quali l'orientamento, il volume o le relazioni tra le parti. Non è possibile afferrare un vettore in modo da definirlo rispetto a ciò che viene visualizzato nello spazio? Una categorizzazione più dettagliata della gerarchia geometrica dovrebbe riflettere la differenza tra tipi astratti o "helper", ognuno dei quali può essere raggruppato in base alle operazioni che essi consentono di fare e ai tipi che consentono di descrivere la forma degli elementi del modello.
La creazione di modelli in Dynamo non è limitata a ciò che è possibile generare con i nodi. Di seguito sono riportati alcuni metodi chiave per portare il processo al livello successivo con la geometria:
Dynamo consente di importare file. Provare ad utilizzare un file CSV per le nuvole di punti o un file SAT per l'importazione di superfici.
Quando si utilizza Revit, è possibile fare riferimento ad elementi di Revit da utilizzare in Dynamo.
Se si desidera costruire modelli più complessi che non possono essere creati da una singola superficie o se si vuole definire un volume esplicito, occorre ora entrare nel regno dei (e delle PolySurface). Anche un cubo semplice è sufficientemente complesso da richiedere sei superfici, una per ogni faccia. I solidi introducono due concetti chiave a differenza delle superfici: una descrizione topologica più rifinita (facce, spigoli, vertici) e operazioni booleane.
Si possono utilizzare le per modificare i solidi. Si utilizzeranno alcune operazioni booleane per creare una palla riccio.
Sphere.ByCenterPointRadius: creare il solido di base.
Topology.Faces, Face.SurfaceGeometry: eseguire una query sulle facce del solido e convertirle in geometria di superficie. In questo caso, la sfera presenta un'unica faccia.
Cone.ByPointsRadii: costruire coni utilizzando punti sulla superficie.
Solid.UnionAll: unire i coni e la sfera.
Topology.Edges: eseguire una query sugli spigoli del nuovo solido.
Solid.Fillet: raccordare gli spigoli della palla riccio.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Le operazioni booleane sono complesse e possono essere lente da calcolare. È possibile utilizzare la funzionalità Congela per sospendere l'esecuzione dei nodi selezionati e dei nodi a valle interessati.
1. Utilizzare il menu contestuale accessibile con il pulsante destro del mouse per congelare l'operazione di unione dei solidi.
2. Il nodo selezionato e tutti i nodi a valle verranno visualizzati in anteprima in modalità semitrasparente di colore grigio chiaro e i fili interessati verranno visualizzati come linee tratteggiate. Anche l'anteprima della geometria interessata sarà semitrasparente. È ora possibile modificare i valori a monte senza calcolare l'unione booleana.
3. Per scongelare i nodi, fare clic con il pulsante destro del mouse e deselezionare Congela.
4. Tutti i nodi interessati e le anteprime della geometria associata verranno aggiornati e ripristineranno la modalità di anteprima standard.
I solidi sono costituiti da una o più superfici che contengono volume mediante un contorno chiuso che definisce l'"entrata" o l'"uscita". Indipendentemente dal numero di superfici presenti, è necessario che formino un volume "ermetico" per essere considerate un solido. È possibile creare solidi unendo superfici o PolySurface o utilizzando operazioni quali loft, sweep e rivoluzione. Anche le primitive sfera, cubo, cono e cilindro sono solidi. Un cubo con almeno una faccia rimossa viene considerato come PolySurface, che presenta proprietà simili, ma non è un solido.
Un piano è composto da una singola superficie e non è un solido.
Una sfera è costituita da una superficie, ma è un solido.
Un cono è composto da due superfici unite per creare un solido.
Un cilindro è composto da tre superfici unite per creare un solido.
Un cubo è composto da sei superfici unite per creare un solido.
I solidi sono costituiti da tre tipi di elementi: vertici, spigoli e facce. Le facce sono le superfici che compongono il solido. Gli spigoli sono le curve che definiscono il collegamento tra facce adiacenti, mentre i vertici rappresentano i punti iniziale e finale di tali curve. Questi elementi possono essere sottoposti a query utilizzando i nodi della topologia.
Facce
Spigoli
Vertici
I solidi possono essere modificati raccordando o smussando i loro spigoli per eliminare angoli acuti. L'operazione di smusso crea una superficie rigata tra due facce, mentre un raccordo si unisce tra le facce per mantenere la tangenza.
Cubo
Cubo smussato
Cubo raccordato
Le operazioni booleane sui solidi sono metodi per combinare due o più solidi. Una singola operazione booleana significa in realtà eseguire quattro operazioni:
Intersecare due o più oggetti.
Dividerli in corrispondenza delle intersezioni.
Eliminare le parti della geometria indesiderate.
Unire tutto di nuovo insieme.
Unione: consente di rimuovere le parti sovrapposte dei solidi e di unirle in un unico solido.
Differenza: consente di sottrarre un solido da un altro. Il solido da sottrarre è noto come strumento. Si noti che è possibile cambiare il solido che costituisce lo strumento per mantenere il volume inverso.
Intersezione: consente di mantenere solo il volume intersecante dei due solidi.
UnionAll: operazione di unione con sfera e coni rivolti verso l'esterno.
DifferenceAll: operazione di differenza con sfera e coni rivolti verso l'interno.
Il è una rappresentazione dell'intensità e della direzione, che è possibile visualizzare come una freccia che accelera verso una specifica direzione ad una determinata velocità. È un componente chiave per i modelli in Dynamo. Notare che, poiché si trovano nella categoria astratta di "helper", quando si crea un vettore, non verrà visualizzato alcun elemento nell'anteprima sfondo.
È possibile utilizzare una linea come supporto in un'anteprima vettoriale.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Sebbene siano astratti, i piani hanno una posizione di origine in modo da poterli posizionare nello spazio.
In Dynamo, il rendering dei piani viene eseguito nell'anteprima sfondo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Sebbene siano astratti, anche i sistemi di coordinate hanno una posizione di origine in modo da poterli individuare nello spazio.
In Dynamo, i sistemi di coordinate vengono sottoposti a rendering nell'anteprima sfondo come punto (origine) e linee che definiscono gli assi (X è rosso, Y è verde e Z è blu in base alla seguente convenzione).
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Vettori, piani e sistemi di coordinate costituiscono il gruppo principale dei tipi di geometria astratta. Aiutano a definire la posizione, l'orientamento e il contesto spaziale della geometria di cui è necessario determinare la forma. Se dico che sono a New York, tra la 42° strada e Broadway (sistema di coordinate), a livello strada (piano), guardando verso nord (vettore), ho utilizzato questi "helper" per definire dove sono. Lo stesso vale per una custodia per il cellulare o un grattacielo. Per sviluppare il modello, è necessario questo contesto.
Un vettore è una quantità geometrica che descrive la direzione e l'intensità. I vettori sono astratti, ossia rappresentano una quantità, non un elemento geometrico. I vettori possono essere facilmente confusi con i punti perché sono entrambi composti da un elenco di valori. Tuttavia, esiste una differenza fondamentale: i punti descrivono una posizione in un determinato sistema di coordinate, mentre i vettori descrivono una differenza relativa nella posizione, che è identica a quella indicata come "direzione".
Se l'idea della differenza relativa è confusa, pensare al vettore AB come "Sono in piedi nel punto A, guardando verso il punto B." La direzione, da qui (A) a qui (B), è il vettore.
Suddividere ulteriormente i vettori nelle loro parti utilizzando la stessa notazione AB:
Il punto iniziale del vettore è denominato base.
Il **punto finale **del vettore è denominato punta o senso.
Il vettore AB non è uguale al vettore BA, il quale punta nella direzione opposta.
Per una visione in chiave comica dei vettori (e della loro definizione astratta), guardare la commedia classica L'aereo più pazzo del mondo e ascoltare la frase ironica, citata spesso:
Roger, Roger. Qual è il nostro vettore, Victor?
I piani sono "helper" astratti bidimensionali. Più in particolare, i piani sono concettualmente "piatti" e si estendono all'infinito in due direzioni. In genere, viene eseguito il rendering di un rettangolo più piccolo vicino all'origine.
Si potrebbe pensare: "Aspetta! Origine? Sembra un sistema di coordinate... come quello che utilizzo per modellare nel mio software CAD!"
Ed è corretto. La maggior parte del software di modellazione sfrutta i piani di costruzione o i "livelli" per definire un contesto bidimensionale locale in cui disegnare. Il piano XY, XZ, YZ (o nord, sudest) potrebbe sembrare più familiare. Sono tutti piani, che definiscono un contesto "piatto" infinito. I piani non hanno profondità, ma ci aiutano a descrivere anche la direzione.
Se si sono ben compresi i piani, non è difficile capire i sistemi di coordinate. Un piano ha tutte le stesse parti di un sistema di coordinate, a condizione che si tratti di un sistema di coordinate "euclideo" o "XYZ" standard.
Sono presenti, tuttavia, altri sistemi di coordinate alternativi, ad esempio cilindrici o sferici. Come si vedrà nelle sezioni successive, anche i sistemi di coordinate possono essere applicati ad altri tipi di geometria per definire una posizione su tale geometria.
Aggiunta di sistemi di coordinate alternativi - cilindrici, sferici
Si utilizza una nel modello per rappresentare gli oggetti presenti nel mondo tridimensionale. Mentre le curve non sono sempre piane, ossia sono tridimensionali, lo spazio che definiscono è sempre associato ad una dimensione. Le superfici offrono un'altra dimensione e una raccolta di proprietà aggiuntive utilizzabili in altre operazioni di modellazione.
Importare e valutare una superficie in corrispondenza di un parametro in Dynamo per vedere il tipo di informazioni che è possibile estrarre.
Surface.PointAtParameter restituisce il punto in corrispondenza di una coordinata UV specificata.
Surface.NormalAtParameter restituisce il vettore normale in corrispondenza di una determinata coordinata UV.
Surface.GetIsoline restituisce la curva isoparametrica in corrispondenza di una coordinata U o V. Notare l'input isoDirection.
Scaricare i file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Una superficie è una forma matematica definita da una funzione e due parametri. Anziché t
per le curve, si utilizzano U
e V
per descrivere lo spazio del parametro corrispondente. Ciò significa che sono presenti più dati geometrici in base a cui eseguire disegni quando si utilizza questo tipo di geometria. Ad esempio, le curve hanno vettori tangenti e piani normali (che possono ruotare o torcersi per la lunghezza della curva), mentre le superfici hanno vettori normali e piani tangenti che saranno coerenti nel loro orientamento.
Superficie
Isocurva U
Isocurva V
Coordinata UV
Piano perpendicolare
Vettore normale
Dominio di superficie: un dominio di superficie viene definito come intervallo di parametri (U,V) che vengono valutati in un punto tridimensionale su tale superficie. Il dominio in ogni dimensione (U o V) viene in genere descritto come due numeri (U minimo a U massimo) e (V da minimo a V massimo).
Sebbene la forma della superficie non sembri "rettangolare" e localmente potrebbe avere un insieme di isocurve più serrato o più ampio, lo "spazio" definito dal relativo dominio è sempre bidimensionale. In Dynamo, le superfici sono sempre note per aver un dominio definito da un minimo di 0.0 e un massimo di 1.0 in entrambe le direzioni U e V. Le superfici piane o tagliate possono avere domini diversi.
Isocurva (o curva isoparametrica): una curva definita da un valore U o V costante sulla superficie e da un dominio di valori per l'altra direzione U o V corrispondente.
Coordinata UV: il punto nello spazio del parametro UV definito da U, V e talvolta W.
Piano perpendicolare: un piano perpendicolare ad entrambe le isocurve U e V in corrispondenza di una determinata coordinata UV.
Vettore normale: un vettore che definisce la direzione di "alto" rispetto al piano perpendicolare.
Le superfici NURBS sono molto simili alle curve NURBS. Le superfici NURBS possono essere considerate come una griglia di curve NURBS che vanno in due direzioni. La forma di una superficie NURBS è definita da diversi punti di controllo e dal grado di tale superficie nelle direzioni U e V. Gli stessi algoritmi vengono utilizzati per calcolare la forma, le normali, le tangenti, le curvature e altre proprietà mediante punti di controllo, spessori e grado.
Nel caso delle superfici NURBS, vi sono due direzioni implicite nella geometria, poiché le superfici NURBS sono, indipendentemente dalla forma vista, griglie rettangolari dei punti di controllo. Anche se queste direzioni sono spesso arbitrarie rispetto al sistema di coordinate globale, verranno utilizzate di frequente per analizzare i modelli o generare altra geometria in base alla superficie.
Grado (U,V) = (3,3)
Grado (U,V) = (3,1)
Grado (U,V) = (1,2)
Grado (U,V) = (1,1)
Le PolySurface sono costituite da superfici unite su uno spigolo. Le PolySurface offrono più di una definizione UV bidimensionale nel senso che ora è possibile muoversi tra le forme collegate tramite la loro topologia.
Sebbene la "topologia" in genere descriva un concetto che illustra come le parti sono collegate e/o la topologia correlata, in Dynamo è anche un tipo di geometria. In particolare, si tratta di una categoria principale per superfici, PolySurface e solidi.
Talvolta chiamate superfici chiuse, unire le superfici in questo modo consente di creare forme più complesse e definire i dettagli attraverso la giuntura. Comodamente è possibile applicare un'operazione di raccordo o smusso agli spigoli di una PolySurface.
Un è definito da niente di più che uno o più valori denominati coordinate. Il numero di valori delle coordinate necessari per definire il punto dipende dal sistema di coordinate o dal contesto in cui si trova.
Il tipo di punto più comune in Dynamo è presente nel sistema di coordinate globali tridimensionale e dispone di tre coordinate [X,Y,Z] (punto 3D in Dynamo).
Un punto 2D in Dynamo ha due coordinate [X,Y].
I parametri per le curve e le superfici sono continui e si estendono oltre il bordo della geometria specificata. Poiché le forme che definiscono lo spazio del parametro risiedono in un sistema di coordinate globali tridimensionale, è sempre possibile convertire una coordinata parametrica in una coordinata "globale". Il punto [0.2, 0.5] sulla superficie, ad esempio, è uguale al punto [1.8, 2.0, 4.1] nelle coordinate globali.
Punto nelle coordinate XYZ globali supposte
Punto rispetto ad un determinato sistema di coordinate (cilindrico)
Punto come coordinata UV su una superficie
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Se la geometria è il linguaggio di un modello, i punti sono l'alfabeto. I punti sono la base su cui vengono create tutte le altre geometrie: sono necessari almeno due punti per creare una curva, almeno tre punti per creare un poligono o una faccia della mesh e così via. La definizione della posizione, dell'ordine e della relazione tra i punti (provare una funzione seno) consente di definire una geometria di ordine più alto, ad esempio oggetti riconosciuti come cerchi o curve.
Un cerchio che utilizza le funzioni
x=r*cos(t)
ey=r*sin(t)
Una curva seno che utilizza le funzioni
x=(t)
ey=r*sin(t)
I punti possono esistere anche in un sistema di coordinate bidimensionale. La convenzione ha una notazione di lettere diversa a seconda del tipo di spazio impiegato. È possibile che si stia utilizzando [X,Y] su un piano o [U,V] se si è su una superficie.
Un punto nel sistema di coordinate euclideo: [X,Y,Z]
Un punto in un sistema di coordinate di parametri delle curve: [t]
Un punto in un sistema di coordinate di parametri delle superfici: [U,V]
Le sono il primo tipo di dati geometrici descritto e hanno un insieme più familiare di proprietà descrittive della forma. Quanto curve o diritte? Quanto lunghe o corte? Ricordarsi che i punti sono ancora i blocchi predefiniti per definire qualsiasi elemento da una linea ad una spline e tutti i tipi di curva compresi tra loro.
Linea
Polilinea
Arco
Cerchio
Ellisse
Curva NURBS
PolyCurve
NurbsCurve.ByControlPoints utilizza l'elenco di punti come punti di controllo.
NurbsCurve.ByPoints disegna una curva attraverso l'elenco di punti.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Il termine curva è generalmente un elemento interessante per tutte le diverse forme curve (anche se diritte). La Curva con la "C" maiuscola è la categorizzazione principale per tutti questi tipi di forma: linee, cerchi, spline e così via. Più tecnicamente, una curva descrive ogni possibile punto che si può trovare immettendo "t" in una raccolta di funzioni, che possono variare dal semplice (x = -1.26*t, y = t
) alle funzioni che prevedono il calcolo infinitesimale. Indipendentemente dal tipo di curva utilizzata, questo parametro denominato "t" è una proprietà che è possibile valutare. Inoltre, indipendentemente dall'aspetto della forma, tutte le curve hanno anche un punto iniziale e un punto finale, che si allineano in modo coincidente con i valori t minimo e massimo utilizzati per creare la curva. Questo aiuta anche a capire la sua direzionalità.
È importante notare che Dynamo presuppone che il dominio dei valori "t" per una curva sia compreso tra 0.0 e 1.0.
Tutte le curve presentano inoltre diverse proprietà o caratteristiche che possono essere utilizzate per descriverle o analizzarle. Quando la distanza tra i punti iniziale e finale è pari a zero, la curva è "chiusa". Inoltre, ogni curva presenta diversi punti di controllo; se tutti questi punti si trovano nello stesso piano, la curva è "planare". Alcune proprietà si applicano alla curva nel suo insieme, mentre altre si applicano solo a punti specifici lungo la curva. Ad esempio, la planarità è una proprietà globale, mentre un vettore tangente in corrispondenza di un determinato valore t è una proprietà locale.
Le linee sono la forma più semplice di curve. Potrebbero non sembrare curve, ma in realtà sono curve, solo senza alcuna curvatura. Esistono diversi modi per creare linee, dove la più intuitiva è dal punto A al punto B. La forma della linea AB verrà disegnata tra i punti ma matematicamente si estende all'infinito in entrambe le direzioni.
Quando si collegano due linee, è presente una polilinea. Di seguito è riportata una rappresentazione diretta di che cos'è un punto di controllo. La modifica di una qualsiasi di queste posizioni dei punti modificherà la forma della polilinea. Se la polilinea è chiusa, si ha un poligono. Se le lunghezze dei bordi del poligono sono tutte uguali, vengono descritte come normali.
Man mano che si aggiunge maggiore complessità alle funzioni parametriche che definiscono una forma, è possibile fare un passo avanti rispetto ad una linea per creare un arco, un cerchio, un arco di ellisse o un'ellisse descrivendo uno o due raggi. Le differenze tra la versione dell'arco e il cerchio o l'ellisse sono solo se la forma è chiusa o meno.
NURBS (spline a base razionale non uniformi) sono rappresentazioni matematiche che consentono di modellare in modo accurato qualsiasi forma, da una semplice linea bidimensionale, un cerchio, un arco o un rettangolo, fino alla curva organica di forma libera tridimensionale più complessa. Grazie alla loro flessibilità (relativamente pochi punti di controllo, ma interpolazione uniforme basata sulle impostazioni dei gradi) e alla loro precisione (legata ad una matematica affidabile), i modelli NURBS possono essere utilizzati in qualsiasi processo, dall'illustrazione e dall'animazione fino alla produzione.
Grado: il grado della curva determina l'intervallo di influenza dei punti di controllo su una curva; dove più alto è il grado, maggiore sarà l'intervallo. Il valore del grado è un numero intero positivo. Questo numero è in genere 1, 2, 3 o 5, ma può essere qualsiasi numero intero positivo. Le linee e le polilinee NURBS sono in genere di grado 1 e la maggior parte delle curve di forma libera è di grado 3 o 5.
Punti di controllo: i punti di controllo sono un elenco di punti di almeno grado+1. Uno dei modi più semplici per modificare la forma di una curva NURBS consiste nello spostare i punti di controllo.
Peso: ai punti di controllo è associato un numero denominato peso. In genere i pesi sono numeri positivi. Quando i punti di controllo di una curva hanno tutti lo stesso peso (in genere 1), la curva viene chiamata non razionale, altrimenti la curva viene chiamata razionale. La maggior parte delle curve NURBS non è razionale.
Nodi: i nodi sono un elenco di numeri (grado+N-1), dove N è il numero di punti di controllo. I nodi vengono utilizzati insieme ai pesi per controllare l'influenza dei punti di controllo sulla curva risultante. Un uso per i nodi è creare deviazioni in determinati punti nella curva.
Grado = 1
Grado = 2
Grado = 3
Notare che più alto è il valore del grado, maggiore sarà il numero di punti di controllo utilizzati per interpolare la curva risultante.
Per iniziare ad utilizzarlo, avviarlo dal gruppo della barra degli strumenti. A seconda del software utilizzato, l'icona di avvio è in genere disponibile in Menu > scheda Gestisci. Fare clic sull'icona di Dynamo per avviarlo.
Anteprima disattivata: una barra di stato grigia sotto il nodo e un'icona a forma di occhio indicano che l'anteprima della geometria per il nodo è disattivata.
Se il programma visivo contiene avvertimenti o errori, in Dynamo verranno fornite ulteriori informazioni sul problema. Qualsiasi nodo giallo avrà anche una descrizione comando sopra il nome. Posizionare il cursore del mouse sull'icona della descrizione comando relativo all’avviso o all’errore per espanderla.
Crea: consente di creare o costruire la geometria da zero. Ad esempio, un cerchio.
Azione: consente di eseguire un'azione su un oggetto. Ad esempio, la messa in scala di un cerchio.
Query: consente di ottenere una proprietà di un oggetto già esistente. Ad esempio, ottenere il raggio di un cerchio.
Adatta alla finestra
Eseguire lo zoom in avanti
Eseguire lo zoom indietro
Panoramica
Adatta alla finestra
Eseguire lo zoom in avanti
Eseguire lo zoom indietro
Panoramica
Orbita
Dynamo Package Manager offre funzionalità aggiuntive per le operazioni e i tipi di geometria estesi. Visitare la pagina sul pacchetto .
YÈ possibile leggere ulteriori informazioni sul congelamento dei nodi nella sezione .
Ciò rende le operazioni booleane sui solidi un potente processo che consente di risparmiare tempo. Sono disponibili tre operazioni booleane sui solidi che consentono di distinguere quali parti della geometria vengono mantenute.
Oltre a queste tre operazioni, in Dynamo sono disponibili i nodi Solid.DifferenceAll e Solid.UnionAll per l'esecuzione di operazioni di differenza e unione con più solidi.
Il è una superficie bidimensionale, che può essere visualizzata come superficie piana che si estende all'infinito. Ciascun piano ha un'origine, una direzione X, una direzione Y e una direzione Z (su).
Il è un sistema che consente di determinare la posizione di punti o altri elementi geometrici. Nell'immagine seguente è illustrato l'aspetto che ha in Dynamo e ciò che ogni colore rappresenta.
La è costituita da un gruppo di punti; ogni linea ha almeno 2 punti. Uno dei metodi più comuni per creare una linea in Dynamo consiste nell'utilizzare Line.ByStartPointEndPoint
per creare una linea in Dynamo.
è un modello utilizzato per rappresentare in modo accurato curve e superfici. Si procederà con la creazione di una curva seno in Dynamo utilizzando due diversi metodi per creare curve NURBS e confrontare i risultati.
In questo indice sono fornite informazioni aggiuntive su tutti i nodi utilizzati in questa guida introduttiva, nonché su altri componenti che potrebbero risultare utili. Questa è solo un'introduzione ad alcuni dei 500 nodi disponibili in Dynamo.
CREAZIONE
Color.ByARGB Crea un colore in base ai componenti alfa, rosso, verde e blu.
Intervallo colori Restituisce un colore da una sfumatura di colore compresa tra un colore iniziale e uno finale.
AZIONI
Color.Brightness Restituisce il valore di luminosità del colore.
Color.Components Elenca i componenti del colore nell'ordine seguente: alfa, rosso, verde, blu.
Color.Saturation Restituisce il valore di saturazione del colore.
Color.Hue Restituisce il valore di tonalità del colore.
QUERY
Color.Alpha Individua il componente alfa di un colore, da 0 a 255.
Color.Blue Individua il componente blu di un colore, da 0 a 255.
Color.Green Individua il componente verde di un colore, da 0 a 255.
Color.Red Individua il componente rosso di un colore, da 0 a 255.
CREAZIONE
GeometryColor.ByGeometryColor Visualizza la geometria con un colore.
AZIONI
View.Watch Visualizza l'output del nodo.
View.Watch 3D Visualizza un'anteprima dinamica della geometria.
AZIONI
Boolean Possibile selezione: true o false.
Code Block Consente la creazione diretta di codice DesignScript.
Directory Path Consente di selezionare una directory del sistema per ottenere il relativo percorso.
File Path Consente di selezionare un file nel sistema per ottenere il relativo nome file.
Integer Slider Dispositivo di scorrimento che genera numeri interi.
Numero Crea un numero.
Number Slider Dispositivo di scorrimento che genera valori numerici.
Stringa Crea una stringa.
Object.IsNull Determina se l'oggetto dato è nullo.
CREAZIONE
List.Create Crea un nuovo elenco in base agli input specificati.
List.Combine Applica un combinatore ad ogni elemento in due sequenze.
Number Range Crea una sequenza di numeri nell'intervallo specificato.
Number Sequence Crea una sequenza di numeri.
AZIONI
List.Chop Suddivide un elenco in un gruppo di elenchi, ognuno con il numero di voci impostato.
List.Count Restituisce il numero di elementi memorizzati nell'elenco dato.
List.Flatten Riduce di un determinato numero di livelli la nidificazione di una lista di elenchi.
List.FilterByBoolMask Consente di applicare un filtro ad una sequenza sulla base di indici corrispondenti in un elenco di valori booleani separato.
List.GetItemAtIndex Restituisce un elemento dall'elenco dato, situato in corrispondenza dell'indice specificato.
List.Map Applica una funzione a tutti gli elementi di un elenco, generando un nuovo elenco dai risultati.
List.Reverse Crea un nuovo elenco con gli elementi dell'elenco dato disposti in ordine inverso.
List.ReplaceItemAtIndex Sostituisce una voce posizionata in corrispondenza dell'indice specificato nell'elenco dato.
List.ShiftIndices Sposta indici nell'elenco verso destra, in base al valore specificato.
List.TakeEveryNthItem Ricava voci dall'elenco in corrispondenza di indici multipli del valore dato, dopo l'offset indicato.
List.Transpose Scambia righe e colonne in una lista di elenchi. Se alcune righe sono più corte di altre, nella matrice risultante vengono inseriti valori null come segnaposto, per ottenere sempre una matrice rettangolare.
AZIONI
If Istruzione condizionale. Verifica il valore booleano dell'input di prova. Se l'input del test è true, il risultato produce l'input reale, altrimenti il risultato genera l'input false.
AZIONI
Math.Cos Restituisce il coseno di un angolo.
Math.DegreesToRadians Converte un angolo in gradi in un angolo in radianti.
Math.Pow Eleva un numero alla potenza specificata.
Math.RadiansToDegrees Converte un angolo in radianti in un angolo in gradi.
Math.RemapRange Regola l'intervallo di un elenco di numeri, mantenendo il rapporto di distribuzione.
Math.Sin Determina il seno di un angolo.
Formula Valuta le formule matematiche. Utilizza NCalc per la valutazione. Vedere http://ncalc.codeplex.com
Map Mappa un valore in un intervallo di input.
AZIONI
String.Concat Concatena più stringhe in un'unica stringa.
String.Contains Determina se la stringa data contiene la sottostringa data.
String.Join Concatena più stringhe in un'unica stringa, inserendo il separatore dato tra le stringhe concatenate.
String.Split Suddivide una singola stringa in un elenco di stringhe, in corrispondenza delle stringhe separatore date.
String.ToNumber Converte una stringa in un intero o un valore Double.
CREAZIONE
Circle.ByCenterPointRadius Crea un cerchio con un punto centrale di input e un raggio dati nel piano XY globale, con l'asse Z globale come normale.
Circle.ByPlaneRadius Crea un cerchio con centro nell'origine del piano di input (radice), posto sul piano di input, con il raggio specificato.
CREAZIONE
CoordinateSystem.ByOrigin Crea un CoordinateSystem con origine nel punto di input. Gli assi X e Y sono impostati come assi WCS X e Y.
CoordinateSystem.ByCyclindricalCoordinates Crea un CoordinateSystem in corrispondenza dei parametri di coordinata cilindrica specificati, rispetto al sistema di coordinate specificato.
CREAZIONE
Cuboid.ByLengths Crea un cuboide con centro nell'origine del sistema di coordinate globali (WCS), con la larghezza, lunghezza e altezza specificate.
Cuboid.ByLengths (origin)
Crea un cuboide con centro nel punto di input e con la larghezza, lunghezza e altezza specificate.
Cuboid.ByLengths (coordinateSystem)
Crea un cuboide con centro nell'origine del sistema di coordinate globali (WCS), con la larghezza, lunghezza e altezza specificate.
Cuboid.ByCorners
Crea un cuboide che si estende dal punto più basso al più alto.
Cuboid.Length
Restituisce le dimensioni di input del cuboide e NON le dimensioni nello spazio comune.
Cuboid.Width
Restituisce le dimensioni di input del cuboide e NON le dimensioni nello spazio comune.
Cuboid.Height
Restituisce le dimensioni di input del cuboide e NON le dimensioni nello spazio comune.
BoundingBox.ToCuboid
Ottiene il riquadro di delimitazione come cuboide solido.
**In altri termini se si crea una larghezza del cuboide (asse X) pari a 10 e la si trasforma in un CoordinateSystem con scalatura 2x per l'asse X, il valore della larghezza resterà 10. ASM non consente l'estrazione dei vertici di un corpo in un ordine prevedibile, pertanto non è possibile determinare le dimensioni dopo una trasformazione.
AZIONI
Curve.Extrude (distance) Estrude una curva nella direzione del vettore normale.
Curve.PointAtParameter Ottiene un punto sulla curva in corrispondenza di un parametro specificato, incluso tra StartParameter() e EndParameter().
AZIONI
Geometry.DistanceTo Restituisce la distanza tra la geometria corrente e un'altra geometria.
Geometry.Explode Separa gli elementi composti o non separati nei rispettivi componenti.
Geometry.ImportFromSAT Elenco delle geometrie importate
Geometry.Rotate (basePlane) Ruota un oggetto di un numero di gradi specificato intorno all'origine del piano e alla normale.
Geometry.Translate Applica la traslazione a qualsiasi tipo di geometria, con la distanza e la direzione specificate.
CREAZIONE
Line.ByBestFitThroughPoints Crea la linea di approssimazione ottimale tra i punti di un insieme diffuso.
Line.ByStartPointDirectionLength Crea una linea retta a partire dal punto, che si estende nella direzione del vettore per la lunghezza specificata.
Line.ByStartPointEndPoint Crea una linea retta tra due punti di input.
Line.ByTangency Crea una linea tangente alla curva di input, posizionata nel punto della curva corrispondente al parametro.
QUERY
Line.Direction Direzione della curva.
Creazione
NurbsCurve.ByControlPoints Crea una curva BSpline mediante punti di controllo espliciti.
NurbsCurve.ByPoints Crea una curva BSpline tramite interpolazione tra i punti.
Creazione
NurbsSurface.ByControlPoints Crea una NurbsSurface utilizzando punti di controllo espliciti con i gradi U e V specificati.
NurbsSurface.ByPoints Crea una NurbsSurface con i punti interpolati e i gradi U e V specificati. La superficie risultante passa attraverso tutti i punti.
CREAZIONE
Plane.ByOriginNormal Crea un piano centrato nel punto radice, con il vettore normale di input.
Plane.XY Crea un piano nel piano XY globale.
CREAZIONE
Point.ByCartesianCoordinates Definisce un punto da tre coordinate cartesiane nel sistema di coordinate dato.
Point.ByCoordinates (2D) Definisce un punto nel piano XY da due coordinate cartesiane. Il componente Z è 0.
Point.ByCoordinates (3D) Definisce un punto da tre coordinate cartesiane.
Point.Origin Ottiene il punto di origine (0,0,0).
AZIONI
Point.Add Aggiunge un vettore ad un punto. Analoga a Translate(Vector).
QUERY
Point.X Ottiene il componente X di un punto.
Point.Y Ottiene il componente Y di un punto.
Point.Z Ottiene il componente Z di un punto.
CREAZIONE
Polycurve.ByPoints Crea una PolyCurve dalla sequenza di linee che collegano i punti. Per la curva chiusa l'ultimo punto dovrebbe trovarsi nella stessa posizione del punto iniziale.
CREAZIONE
Rectangle.ByWidthLength (plane) Crea un rettangolo centrato nel punto di origine del piano di input, con larghezza (lunghezza asse X del piano) e lunghezza (lunghezza asse Y del piano) di input.
CREAZIONE
Sphere.ByCenterPointRadius Crea una sfera solida centrata nel punto di input, con il raggio dato.
CREAZIONE
Surface.ByLoft Crea una superficie mediante loft tra curve di sezione trasversale di input.
Surface.ByPatch Crea una superficie mediante il riempimento di un contorno chiuso definito da curve di input.
AZIONI
Surface.Offset Applica un offset alla superficie in direzione della normale e in base ad una distanza specificata.
Surface.PointAtParameter Restituisce il punto in corrispondenza dei parametri U e V specificati.
Surface.Thicken Ispessisce una superficie e crea un solido. L'estrusione avviene nella direzione delle normali su entrambi i lati della superficie.
CREAZIONE
UV.ByCoordinates Crea un UV da due valori Double.
CREAZIONE
Vector.ByCoordinates Definisce un vettore a partire da tre coordinate euclidee.
Vector.XAxis Ottiene il vettore asse X canonico (1,0,0).
Vector.YAxis Ottiene il vettore asse Y canonico (0,1,0).
Vector.ZAxis Ottiene il vettore asse Z canonico (0,0,1).
AZIONI
Vector.Normalized Ottiene la versione normalizzata di un vettore.
CREAZIONE
CoordinateSystem.ByOrigin Crea un CoordinateSystem con origine nel punto di input. Gli assi X e Y sono impostati come assi WCS X e Y.
CoordinateSystem.ByCyclindricalCoordinates Crea un CoordinateSystem in corrispondenza dei parametri di coordinata cilindrica specificati, rispetto al sistema di coordinate specificato.
+ Addizione
- Sottrazione
* Moltiplicazione
/ Divisione
% La divisione modulare trova il resto del primo input dopo la divisione per il secondo input.
< Minore di
> Maggiore di
== L'uguaglianza verifica la parità tra due valori.
Una volta pronti ad approfondire lo sviluppo di programmi visivi, sarà necessario acquisire una comprensione più dettagliata degli elementi di base che si utilizzeranno. In questo capitolo sono presentati i concetti fondamentali relativi ai dati, ovvero gli oggetti che attraversano i fili del programma Dynamo.
Formalmente, una stringa è una sequenza di caratteri che rappresenta una costante letterale o un tipo di variabile. Informalmente, una stringa sta programmando un linguaggio per il testo. Sono stati utilizzati i numeri, sia interi che decimali, per determinare i parametri ed è possibile fare lo stesso con il testo.
Le stringhe possono essere utilizzate per una vasta gamma di applicazioni, tra cui la definizione di parametri personalizzati, l'annotazione di gruppi di documentazione e l'analisi tramite set di dati basati su testo. Il nodo String si trova in Core > Input Category.
I nodi di esempio riportati sopra sono stringhe. Un numero può essere rappresentato come una stringa, una lettera o un'intera matrice di testo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
È possibile analizzare una grande quantità di dati rapidamente eseguendo una query sulle stringhe. Saranno descritte alcune operazioni di base che possono accelerare un workflow e aiutare ad ottenere l'interoperabilità del software.
Nell'immagine riportata di seguito è mostrata una stringa di dati proveniente da un foglio di calcolo esterno. La stringa rappresenta i vertici di un rettangolo nel piano XY. Si eseguiranno alcune operazioni di divisione delle stringhe nel mini-esercizio:
Il separatore ";" divide ogni vertice del rettangolo. In questo modo viene creato un elenco con 3 voci per ogni vertice.
Premendo il pulsante "+" al centro del nodo, si crea un nuovo separatore.
Aggiungere una stringa "," all'area di disegno e collegarla all'input del nuovo separatore.
Il risultato è ora un elenco di dieci voci. Il nodo viene prima diviso in base a separator0, quindi in base a separator1.
Sebbene possa sembrare che l'elenco di voci riportato sopra contenga numeri, tali elementi vengono comunque considerati come singole stringhe in Dynamo. Per creare punti, è necessario convertire il tipo di dati da una stringa in un numero. Questa operazione viene eseguita con il nodo String.ToNumber.
Questo nodo è semplice. Collegare i risultati di String.Split all'input. L'output non risulta diverso, ma il tipo di dati è ora un numero anziché una stringa.
Con alcune operazioni aggiuntive di base, ora si dispone di un triangolo disegnato in corrispondenza dell'origine in base all'input di stringa originale.
Poiché una stringa è un oggetto di testo generico, ospita un'ampia gamma di applicazioni. Si esamineranno alcune delle principali azioni in Core > String Category in Dynamo:
Questo metodo consente di unire insieme due stringhe in ordine. In questo modo, si acquisisce ogni stringa letterale in un elenco e si crea una stringa unita.
Nell'immagine seguente è rappresentata la concatenazione di tre stringhe:
Aggiungere o sottrarre stringhe alla concatenazione facendo clic sui pulsanti +/- al centro del nodo.
L'output fornisce una stringa concatenata, con spazi e segni di punteggiatura inclusi.
Il metodo di unione è molto simile a quello della concatenazione, tranne per il fatto che presenta un livello aggiunto di punteggiatura.
Se è stato utilizzato Excel, è possibile che sia stato notato un file CSV. Questo è l'acronimo di Comma Separated Values, ossia valori separati da virgola. Per creare una struttura dei dati simile, si potrebbe utilizzare una virgola (o in questo caso, due trattini) come separatore con il nodo String.Join.
Nell'immagine seguente è rappresentata l'unione di due stringhe:
L'input separator consente di creare una stringa che divide le stringhe unite.
In questo esercizio, si utilizzeranno i metodi di esecuzione delle query e manipolazione delle stringhe per analizzare l'ultima strofa di Fermandosi accanto a un bosco in una sera di neve di Robert Frost. Non è l'applicazione più pratica, ma aiuterà a cogliere le azioni concettuali delle stringhe mentre vengono applicate alle righe leggibili di ritmo e rima.
Iniziare con una stringa di base divisa della strofa. Si noti innanzitutto che la scrittura è formattata in base alle virgole. Questo formato verrà utilizzato per separare ogni riga in singoli elementi.
La stringa di base viene incollata in un nodo String.
Un altro nodo String viene utilizzato per indicare il separatore. In questo caso, si utilizza una virgola.
Un nodo String.Split viene aggiunto all'area di disegno e collegato alle due stringhe.
L'output ora mostra che le righe sono state separate in singoli elementi.
Ora, viene la parte interessante della poesia: le ultime due righe. La strofa originale era un elemento di dati. Questi dati sono stati separati in singoli elementi nel primo passaggio. Ora occorre cercare il testo in questione. E sebbene sia possibile farlo selezionando le ultime due voci dell'elenco, se si trattasse di un intero libro, non si vorrebbe leggere tutto e isolare manualmente gli elementi.
Invece di cercare manualmente, utilizzare un nodo String.Contains per eseguire una ricerca di un set di caratteri. Questa operazione è simile all'esecuzione del comando "Trova" in un elaboratore di testi. In questo caso, se all'interno della voce viene trovata una sottostringa, viene restituito "true" o "false".
Nell'input searchFor, definire una sottostringa che si sta cercando all'interno della strofa. Utilizzare un nodo String con il testo "And miles".
L'output fornisce un elenco di false e true. Questa logica booleana verrà utilizzata per filtrare gli elementi nel passaggio successivo.
List.FilterByBoolMask è il nodo che si desidera utilizzare per escludere false e true. L'output "in" restituisce le istruzioni con un input "mask" di "true", mentre l'output "out" restituisce quelle che sono "false".
L'output di "in" è come previsto e fornisce le due righe finali della strofa.
Ora, si desidera enfatizzare la ripetizione della strofa unendo insieme le due righe. Quando si visualizza l'output del passaggio precedente, si noterà che nell'elenco sono presenti due voci:
Utilizzando due nodi List.GetItemAtIndex, è possibile isolare le voci utilizzando i valori di 0 e 1 come l'input index.
L'output per ogni nodo fornisce, in ordine, le due righe finali.
Per unire questi due voci in una, utilizzare il nodo String.Join:
Dopo aver aggiunto il nodo String.Join, si noterà che è necessario un separatore.
Per creare il separatore, aggiungere un nodo String all'area di disegno e digitare una virgola.
L'output finale ha unito le ultime due voci in un unico elemento.
Può sembrare complesso isolare le ultime due righe ed è vero, perché le operazioni di stringa spesso richiedono un lavoro iniziale. Ma sono scalabili e possono essere applicate a set di dati di grandi dimensioni con relativa facilità. Se si lavora in modo parametrico con fogli di calcolo e interoperabilità, assicurarsi di tenere a mente le operazioni di stringa.
I dati sono gli oggetti dei nostri programmi. Viaggiano attraverso i fili, fornendo input per i nodi in cui vengono elaborati in una nuova forma di dati di output. Quindi si esaminerà la definizione di dati e la relativa struttura e si inizierà ad utilizzarli in Dynamo.
I dati sono un insieme di valori di variabili qualitative o quantitative. Il formato più semplice di dati è costituito da numeri quali 0
, 3.14
o 17
. Tuttavia, i dati possono anche essere di diversi tipi: una variabile che rappresenta numeri che cambiano (height
), caratteri (myName
), geometria (Circle
) o un elenco di elementi di dati (1,2,3,5,8,13,...
).
In Dynamo vengono aggiunti/inviati dati alle porte di input dei nodi, pertanto è possibile disporre di dati senza eseguire alcuna azione, ma per eseguire le azioni rappresentate dai nodi sono necessari i dati. Quando è stato aggiunto un nodo all'area di lavoro, se non sono stati forniti eventuali input, il risultato sarà una funzione, non il risultato dell'azione stessa.
Dati semplici
Dati ed esecuzione corretta di un'azione (un nodo)
Restituzione di una funzione generica tramite un'azione (nodo) senza input di dati
Attenzione ai valori null. Il tipo 'null'
rappresenta l'assenza di dati. Sebbene si tratti di un concetto astratto, è probabile incontrarlo utilizzando la programmazione visiva. Se un'azione non crea un risultato valido, il nodo restituirà un valore null.
I test per i valori null e la rimozione dei valori null dalla struttura dei dati sono una parte fondamentale per la creazione di programmi efficienti.
Object.IsNull
obj
booleano
Quando si è in presenza della programmazione visiva, è possibile generare molto rapidamente parecchi dati e richiedere un metodo per gestirne la gerarchia. Questo è il ruolo delle strutture dei dati, ovvero gli schemi organizzativi in cui si memorizzano i dati. Le specifiche delle strutture dei dati e il loro utilizzo variano a seconda del linguaggio di programmazione.
In Dynamo, si aggiunge la gerarchia ai dati tramite gli elenchi. Questo argomento verrà approfondito nei capitoli successivi. Si inizierà in maniera semplice:
Un elenco rappresenta una raccolta di elementi posizionati in una struttura di dati:
Ho cinque dita (elementi) sulla mia mano (elenco).
Ci sono dieci case (elementi) sulla mia strada (elenco).
Un nodo Number Sequence definisce un elenco di numeri utilizzando un input start, amount e step. Con questi nodi, sono stati creati due elenchi distinti di dieci numeri, uno che comprende 100-109 e un altro che include 0-9.
Il nodo List.GetItemAtIndex seleziona una voce di un elenco in corrispondenza di un indice specifico. Quando si sceglie 0, viene visualizzata la prima voce dell'elenco (in questo caso 100).
Applicando lo stesso processo al secondo elenco, si ottiene un valore di 0, la prima voce dell'elenco.
Ora si uniscono i due elenchi in uno utilizzando il nodo List.Create. Notare che il nodo crea un elenco di elenchi. Questa operazione modifica la struttura dei dati.
Quando si utilizza di nuovo List.GetItemAtIndex, con l'indice impostato su 0, si ottiene il primo elenco nell'elenco di elenchi. Questo è ciò che significa considerare un elenco come voce, che è in qualche modo diverso da altri linguaggi di scripting. Nei capitoli successivi verranno fornite informazioni più avanzate sulla manipolazione degli elenchi e sulla struttura dei dati.
Il concetto chiave da comprendere sulla gerarchia dei dati in Dynamo: rispetto alla struttura dei dati, gli elenchi vengono considerati come voci. In altre parole, Dynamo funziona con un processo dall'alto in basso per la comprensione delle strutture dei dati. Ciò che cosa significa? Si esaminerà un esempio.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo primo esempio, si assembla un cilindro svuotato che mostra la gerarchia della geometria descritta in questa sezione.
1. Aggiungere Point.ByCoordinates: dopo aver aggiunto il nodo all'area di disegno, viene visualizzato un punto in corrispondenza dell'origine della griglia di anteprima di Dynamo. I valori di default degli input x, y e z sono 0.0, per fornire un punto in questa posizione.
2. Plane.ByOriginNormal: il passaggio successivo nella gerarchia della geometria è un piano. Esistono diversi modi per costruire un piano e si sta utilizzando un'origine e una normale per l'input. L'origine è il nodo del punto creato nel passaggio precedente.
Vector.ZAxis: questo è un vettore unitario nella direzione z. Notare che non sono presenti input, ma solo un vettore di valore [0,0,1]. Viene utilizzato come input normal per il nodo Plane.ByOriginNormal. In questo modo si ottiene un piano rettangolare nell'anteprima di Dynamo.
3. Circle.ByPlaneRadius: passando al livello superiore nella gerarchia, a questo punto si crea una curva dal piano del passaggio precedente. Dopo il collegamento al nodo, si ottiene un cerchio in corrispondenza dell'origine. Il raggio di default sul nodo è il valore di 1.
4. Curve.Extrude: ora è possibile far comparire questo oggetto assegnandogli profondità e rendendolo tridimensionale. Questo nodo crea una superficie da una curva tramite l'estrusione. La distanza di default sul nodo è 1. Nella finestra dovrebbe essere visualizzato un cilindro.
5. Surface.Thicken: questo nodo fornisce un solido chiuso eseguendo l'offset della superficie ad una determinata distanza e chiudendo la forma. Il valore dello spessore di default è 1. Nella finestra viene visualizzato un cilindro svuotato in linea con questi valori.
6. Number Slider: anziché utilizzare i valori di default per tutti questi input, aggiungere al modello un controllo parametrico.
Modifica del dominio: dopo aver aggiunto il dispositivo di scorrimento numerico all'area di disegno, fare clic sull'accento circonflesso in alto a sinistra per visualizzare le opzioni di dominio.
Min/Max/Step - modificare rispettivamente i valori min, max e step in 0,2 e 0.01. Questa operazione consente di controllare la dimensione della geometria complessiva.
7. Number Slider: in tutti gli input di default, copiare e incollare questo dispositivo di scorrimento numerico (selezionare il dispositivo di scorrimento, premere CTRL+C, quindi CTRL+V) più volte, finché tutti gli input con valori di default non mostreranno un dispositivo di scorrimento. Alcuni dei valori del dispositivo di scorrimento devono essere maggiori di zero per far funzionare la definizione (ossia, è necessaria una profondità di estrusione per avere una superficie da ispessire).
8. Ora è stato creato un cilindro svuotato parametrico con questi dispositivi di scorrimento. Provare a regolare alcuni di questi parametri e vedere l'aggiornamento dinamico della geometria nella finestra di Dynamo.
Dispositivi di scorrimento: per fare un ulteriore passo avanti, sono stati aggiunti molti dispositivi di scorrimento all'area di disegno e occorre ripulire l'interfaccia dello strumento appena creato. Fare clic con il pulsante destro del mouse su un dispositivo di scorrimento, selezionare Rinomina e assegnare ad ogni dispositivo di scorrimento il nome appropriato per il relativo parametro (thickness, radius, height, etc).
9. A questo punto, è stato creato un fantastico cilindro ispessito. Attualmente, questo è un oggetto. Si può vedere come creare una serie di cilindri che restano dinamicamente collegati. Per eseguire questa operazione, si creerà un elenco di cilindri, anziché utilizzare un singolo elemento.
Aggiunta (+): l'obiettivo è aggiungere una fila di cilindri accanto al cilindro creato. Se si desidera aggiungere un cilindro adiacente a quello corrente, è necessario considerare sia il raggio del cilindro che lo spessore dell'involucro. Si ottiene questo numero aggiungendo i due valori dei dispositivi di scorrimento.
10. Questo passaggio è più complicato, quindi occorre esaminarlo lentamente: l'obiettivo finale è creare un elenco di numeri che definiscano le posizioni di ogni cilindro in una riga.
a. Moltiplicazione (*): per prima cosa, si desidera moltiplicare il valore del passaggio precedente per 2. Il valore del passaggio precedente rappresenta un raggio e si desidera spostare il cilindro in base al diametro completo.
b. Number Sequence: viene creata una serie di numeri con questo nodo. Il primo input è il nodo della moltiplicazione del passaggio precedente che viene collegato al valore step. Il valore start può essere impostato su 0.0 utilizzando un nodo Number.
c. Dispositivo di scorrimento di numeri interi: per il valore amount, collegare un dispositivo di scorrimento di numeri interi. In questo modo si definirà il numero di cilindri creati.
d. Output: questo elenco mostra la distanza di spostamento per ogni cilindro nella serie e viene parametricamente determinato dai dispositivi di scorrimento originali.
11. Questo passaggio è abbastanza semplice: collegare la sequenza definita nel passaggio precedente all'input x del nodo Point.ByCoordinates originale. Questa operazione sostituirà il dispositivo di scorrimento pointX che è possibile eliminare. Ora nella finestra è visibile una serie di cilindri (assicurarsi che il dispositivo di scorrimento di numeri interi sia maggiore di 0).
12. La catena di cilindri è ancora collegata dinamicamente a tutti i dispositivi di scorrimento. Regolare ogni dispositivo di scorrimento per controllare l'aggiornamento della definizione.
La logica, o più specificatamente, la logica condizionale, consente di specificare un'azione o un gruppo di azioni in base ad un test. Dopo aver valutato il test, sarà presente un valore booleano che rappresenta True
o False
che è possibile utilizzare per controllare il flusso del programma.
Le variabili numeriche possono memorizzare un intero intervallo di numeri diversi. Le variabili booleane possono memorizzare solo due valori indicati come True o False, Yes o No, 1 o 0. Per eseguire i calcoli, raramente vengono utilizzati valori booleani a causa del loro intervallo limitato.
L'istruzione "If" è un concetto chiave nella programmazione: "Se ciò è vero, allora accade questo, altrimenti succede qualcos'altro. L'azione risultante dell'istruzione è determinata da un valore booleano. Esistono diversi modi per definire un'istruzione "If" in Dynamo:
If (If)
test, true, false
risultato
Formula (IF(x,y,z))
x, y, z
risultato
Code Block ((x?y:z);)
X, Y, Z
risultato
Si esaminerà un breve esempio per ciascuno di questi tre nodi in azione utilizzando l'istruzione "If" condizionale.
In questa immagine, Boolean è impostato su True, ovvero il risultato è una stringa che riporta: "This is the result if true”. I tre nodi che creano l'istruzione If funzionano in modo identico in questo contesto.
Anche in questo caso, i nodi funzionano in modo identico. Se Boolean viene modificato in False, il risultato è il numero Pi, come definito nell'istruzione If originale.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Si utilizzerà la logica per separare un elenco di numeri in un elenco di numeri pari e un elenco di numeri dispari.
a. Range: aggiungere un intervallo di numeri all'area di disegno.
b. Number: aggiungere tre nodi di numeri all'area di disegno. Il valore per ogni nodo Number deve essere: 0.000 per start, 10.000 per end e 1.000 per step.
c. Output: l'output è un elenco di 11 numeri da 0 a 10.
d. % (modulo): collegare Range a x e 2.000 a y. In questo modo viene calcolato il resto per ogni numero dell'elenco diviso per 2. L'output di questo elenco fornisce un elenco di valori alternati tra 0 e 1.
e. = = (test di uguaglianza): aggiungere un test di uguaglianza all'area di disegno. Collegare l'output del modulo all'input x e 0.000 all'input y.
f. Watch: l'output del test di uguaglianza è un elenco di valori alternati tra true e false. Questi sono i valori utilizzati per separare le voci dell'elenco. 0 (o true) rappresenta i numeri pari e (1 o false) rappresenta i numeri dispari.
g. List.FilterByBoolMask: questo nodo filtra i valori in due elenchi diversi in base al valore booleano di input. Collegare il nodo Range originale all'input list e l'output del test di uguaglianza all'input mask. L'output in rappresenta valori true, mentre l'output out rappresenta valori false.
h. Watch: il risultato è ora un elenco di numeri pari e un elenco di numeri dispari. Sono stati utilizzati operatori logici per separare gli elenchi in modelli.
Partendo dalla logica stabilita nel primo esercizio, si applicherà questa configurazione ad un'operazione di modellazione.
2. Partire dall'esercizio precedente con gli stessi nodi. Le uniche eccezioni (oltre a modificare il formato sono):
a. Utilizzare un nodo Sequence con questi valori di input.
b. È stato scollegato l'input list da List.FilterByBoolMask. Questi nodi verranno messi da parte per ora, ma saranno presto utili più avanti nell'esercizio.
3. Iniziare creando un gruppo separato del grafico come mostrato nell'immagine precedente. Questo gruppo di nodi rappresenta un'equazione parametrica per definire una curva di linea. Ecco alcune note:
a. Il primo Number Slider rappresenta la frequenza dell'onda, deve avere un minimo di 1, un massimo di 4 e un passo di 0.01.
b. Il secondo Number Slider rappresenta l'ampiezza dell'onda, deve avere un minimo di 0, un massimo di 1 e un passo di 0.01.
c. PolyCurve.ByPoints: se il diagramma dei nodi riportato sopra viene copiato, il risultato è una curva seno nella finestra di anteprima di Dynamo.
Il metodo indicato qui per gli input è questo: utilizzare i nodi Number per ottenere proprietà più statiche e i dispositivi di scorrimento numerici su quelle più flessibili. Si desidera mantenere l'intervallo di numeri originale definito all'inizio di questo passaggio. Tuttavia, la curva seno creata qui dovrebbe avere una certa flessibilità. È possibile spostare questi dispositivi di scorrimento per controllare l'aggiornamento della frequenza e dell'ampiezza della curva.
4. Si passerà alla definizione, quindi si osserverà il risultato finale in modo da poter fare riferimento a quello che si sta ottenendo. I primi due passaggi vengono eseguiti separatamente. Ora si desidera collegarli. Si utilizzerà la curva seno di base per determinare la posizione dei componenti della cerniera e si utilizzerà la logica true/false per alternare tra caselle di piccole dimensioni e caselle più grandi.
a. Math.RemapRange: utilizzando la sequenza numerica creata nel passaggio 02, creare una nuova serie di numeri riassociando l'intervallo. I numeri originali del passaggio 01 sono compresi tra 0 e 100. Questi numeri variano da 0 a 1, rispettivamente in base agli input newMin e newMax.
5. Creare un nodo Curve.PointAtParameter, quindi collegare l'output Math.RemapRange del passaggio 04 come il relativo input param.
Questo passaggio crea punti lungo la curva. I numeri sono stati riassociati da 0 a 1 perché l'input di param sta cercando valori in questo intervallo. Un valore di 0 rappresenta il punto iniziale, mentre un valore di 1 rappresenta i punti finali. Tutti i numeri compresi vengono valutati nell'intervallo [0,1].
6. Collegare l'output da Curve.PointAtParameter a List.FilterByBoolMask per separare l'elenco di indici pari e dispari.
a. List.FilterByBoolMask: collegare Curve.PointAtParameter del passaggio precedente all'input list.
b. Watch: un nodo di controllo per in e un nodo di controllo per out indicano che sono presenti due elenchi che rappresentano indici pari e indici dispari. Questi punti sono ordinati nello stesso modo sulla curva, che è possibile mostrare nel passaggio successivo.
7. Quindi, si utilizzerà il risultato dell'output di List.FilterByBoolMask nel passaggio 05 per generare geometrie con dimensioni in base ai relativi indici.
Cuboid.ByLengths: ricreare i collegamenti visti nell'immagine riportata sopra per ottenere una cerniera lungo la curva seno. Un cuboide qui è solo un parallelepipedo e si sta definendo la sua dimensione in base al punto della curva al centro del parallelepipedo stesso. La logica della divisione pari/dispari dovrebbe ora essere chiara nel modello.
a. a. Elenco di cuboidi in corrispondenza di indici pari.
b. b. Elenco di cuboidi in corrispondenza di indici dispari
Voila! È stato appena programmato un processo per definire le quote della geometria in base all'operazione logica illustrata in questo esercizio.
Nel campo della modellazione computazionale, le mesh sono una delle forme più pervasive di rappresentazione della geometria 3D. La geometria delle mesh è generalmente composta da una raccolta di quadrilateri o triangoli, può essere un'alternativa leggera e flessibile all'utilizzo di NURBS e le mesh vengono utilizzate in tutto, dal rendering e dalle visualizzazioni alla fabbricazione digitale e alla stampa 3D.
Dynamo definisce le mesh utilizzando una struttura di dati di faccia-vertice. Al livello più elementare, questa struttura è semplicemente una raccolta di punti raggruppati in poligoni. I punti di una mesh sono denominati vertici, mentre i poligoni simili a superfici sono denominati facce.
Per creare una mesh, è necessario un elenco di vertici e un sistema per raggruppare tali vertici in facce denominate gruppo di indici.
Elenco dei vertici
Elenco dei gruppi di indici per definire le facce
Le funzionalità della mesh di Dynamo possono essere estese installando il pacchetto Mesh Toolkit. Dynamo Mesh Toolkit fornisce strumenti per importare mesh da formati di file esterni, creare mesh da oggetti della geometria di Dynamo e generare manualmente mesh in base ai vertici e agli indici.
La libreria fornisce inoltre strumenti per modificare e correggere la mesh o estrarre sezioni orizzontali da utilizzare nella fabbricazione.
Visitare i case study di Mesh Toolkit, ad esempio sull'utilizzo di questo pacchetto.
Una mesh è una raccolta di quadrilateri e triangoli che rappresenta una geometria di superfici o solidi. Analogamente ai solidi, la struttura di un oggetto mesh include vertici, bordi e facce. Sono disponibili ulteriori proprietà che rendono anche univoche le mesh, come le normali.
Vertici della mesh
Bordi della mesh *I bordi con una sola faccia adiacente vengono denominati "nudi". Tutti gli altri bordi sono "vestiti"
Facce della mesh
I vertici di una mesh sono semplicemente un elenco di punti. L'indice dei vertici è molto importante quando si costruisce una mesh o si ottengono informazioni sulla struttura di una mesh. Per ogni vertice, esiste anche una normale del vertice corrispondente (vettore) che descrive la direzione media delle facce associate e consente di comprendere l'orientamento in ingresso e in uscita della mesh.
Vertici
Normali dei vertici
Una faccia è un elenco ordinato di tre o quattro vertici. La rappresentazione della "superficie" di una faccia della mesh è pertanto implicita in base alla posizione dei vertici indicizzati. Si dispone già dell'elenco dei vertici che compongono la mesh, quindi, invece di fornire singoli punti per definire una faccia, si utilizza semplicemente l'indice dei vertici. Questo consente anche di utilizzare lo stesso vertice in più di una faccia.
Una faccia quadrangolare composta con indici 0, 1, 2 e 3
Una faccia triangolare composta con indici 1, 4 e 2; notare che i gruppi di indici possono essere spostati nel loro ordine - purché la sequenza sia ordinata in senso antiorario, la faccia verrà definita correttamente
Quali sono le differenze tra la geometria della mesh e la geometria NURBS? Quando è consigliabile utilizzare una al posto dell'altra?
In un capitolo precedente, si è visto che le superfici NURBS sono definite da una serie di curve NURBS che vanno in due direzioni. Queste direzioni sono etichettate U
e V
e consentono la parametrizzazione di una superficie NURBS in base ad un dominio di superficie bidimensionale. Le curve stesse sono memorizzate come equazioni nel computer, consentendo il calcolo delle superfici risultanti ad un grado di precisione arbitrariamente ridotto. Può essere difficile, tuttavia, combinare insieme più superfici NURBS. L'unione di due superfici NURBS determina una polisuperficie, in cui diverse sezioni della geometria avranno parametri UV e definizioni delle curve differenti.
Superficie
Curva isoparametrica (isoparm)
Punto di controllo della superficie
Poligono di controllo della superficie
Punto isoparametrico
Cornice della superficie
Mesh
Bordo nudo
Rete della mesh
Spigoli mesh
Normale del vertice
Faccia della mesh/Normale della faccia della mesh
Le mesh, invece, sono costituite da un numero discreto di facce e vertici esattamente definiti. La rete di vertici in genere non può essere definita da coordinate UV
semplici e, poiché le facce sono distinte, il grado di precisione viene integrato nella mesh e può essere modificato solo mediante l'affinamento della mesh e l'aggiunta di più facce. La mancanza di descrizioni matematiche consente alle mesh di gestire in modo più flessibile la geometria complessa all'interno di una singola mesh.
Un'altra importante differenza è rappresentata dall'entità con cui una modifica locale nella geometria della mesh o NURBS influisce sull'intera forma. Lo spostamento di un vertice di una mesh influisce solo sulle facce adiacenti a tale vertice. Nelle superfici NURBS, l'entità dell'influenza è più complessa e dipende dal grado della superficie, nonché dai pesi e dai nodi dei punti di controllo. In generale, tuttavia, lo spostamento di un singolo punto di controllo in una superficie NURBS crea un cambiamento più uniforme e più esteso nella geometria.
Superficie NURBS: lo spostamento di un punto di controllo ha un'influenza che si estende lungo la forma.
Geometria della mesh: lo spostamento di un vertice influisce solo sugli elementi adiacenti.
Un'analogia che può essere utile è confrontare un'immagine vettoriale (composta da linee e curve) con un'immagine raster (composta da singoli pixel). Se si esegue lo zoom avanti di un'immagine vettoriale, le curve restano nitide e chiare, mentre lo zoom avanti di un'immagine raster consente di ottenere pixel più grandi. In questa analogia, le superfici NURBS possono essere confrontate con un'immagine vettoriale perché esiste una relazione matematica uniforme, mentre la mesh si comporta in modo simile ad un'immagine raster con una risoluzione impostata.
Se il formato più semplice di dati è rappresentato dai numeri, il modo più semplice per correlare tali numeri è la matematica. Dai semplici operatori come la divisione fino alle funzioni trigonometriche e alle formule più complesse, la matematica è un ottimo modo per iniziare ad esplorare relazioni e modelli numerici.
Gli operatori sono un insieme di componenti che utilizzano funzioni algebriche con due valori di input numerico, che producono un valore di output (addizione, sottrazione, moltiplicazione, divisione e così via). Questi sono disponibili in Operators > Actions.
Add (+)
var[]...[], var[]...[]
var[]...[]
Subtract (-)
var[]...[], var[]...[]
var[]...[]
Multiply (*)
var[]...[], var[]...[]
var[]...[]
Divide (/)
var[]...[], var[]...[]
var[]...[]
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Combinare operatori e variabili per formare una relazione più complessa mediante le formule. Utilizzare i dispositivi di scorrimento per creare una formula che possa essere controllata con i parametri di input.
1. Creare una sequenza di numeri che rappresenta la "t" nell'equazione parametrica, pertanto si desidera utilizzare un elenco di dimensioni sufficienti per definire una spirale.
Number Sequence: definire una sequenza di numeri in base a tre input: start, amount e step.
2. Con il passaggio precedente è stato creato un elenco di numeri per definire il dominio parametrico. Quindi, creare un gruppo di nodi che rappresenta l'equazione della spirale aurea.
La spirale aurea viene definita come l'equazione:
L'immagine seguente rappresenta la spirale aurea sotto forma di programmazione visiva. Quando si scorre il gruppo di nodi, provare a prestare attenzione al parallelo tra il programma visivo e l'equazione scritta.
a. Number Slider: aggiungere due dispositivi di scorrimento numerici all'area di disegno. Questi dispositivi di scorrimento rappresenteranno le variabili a e b dell'equazione parametrica. Rappresentano una costante flessibile o parametri che è possibile regolare per ottenere il risultato desiderato.
b. Multiplication (*): il nodo della moltiplicazione è rappresentato da un asterisco. Questa opzione verrà utilizzata ripetutamente per collegare le variabili della moltiplicazione.
c. Math.RadiansToDegrees: i valori "t" devono essere convertiti in gradi per la loro valutazione nelle funzioni trigonometriche. Tenere presente che, in Dynamo, per default vengono utilizzati i gradi per valutare queste funzioni.
d. Math.Pow: come funzione di "t" e del numero "e" si crea la sequenza di Fibonacci.
e. Math.Cos e Math.Sin: queste due funzioni trigonometriche differenziano rispettivamente la coordinata x e la coordinata y di ogni punto parametrico.
f. Watch: ora è possibile vedere che l'output comprende due elenchi, che saranno le coordinate x e y dei punti utilizzati per generare la spirale.
Ora, la maggior parte dei nodi del passaggio precedente funzionerà correttamente, ma richiede molto lavoro. Per creare un workflow più efficiente, esaminare DesignScript per definire una stringa di espressioni di Dynamo in un nodo. In questa serie successiva di passaggi, verrà utilizzata l'equazione parametrica per disegnare la spirale di Fibonacci.
Point.ByCoordinates: collegare il nodo della moltiplicazione superiore all'input "x" e quello inferiore all'input "y". Viene visualizzata una spirale parametrica di punti sullo schermo.
Polycurve.ByPoints: collegare Point.ByCoordinates del passaggio precedente a points. È possibile lasciare connectLastToFirst senza input perché non si sta creando una curva chiusa. In questo modo si crea una spirale che passa per ogni punto definito nel passaggio precedente.
A questo punto è stata completata la spirale di Fibonacci. Da qui procedere ulteriormente con due esercizi separati, che si chiameranno Nautilus e Girasole. Si tratta di astrazioni di sistemi naturali, ma le due diverse applicazioni della spirale di Fibonacci saranno ben rappresentate.
Circle.ByCenterPointRadius: in questo caso, verrà utilizzato un nodo Circle con gli stessi input del passaggio precedente. Il valore di default del raggio è 1.0, pertanto viene visualizzato un output immediato dei cerchi. Diventa immediatamente evidente l'ulteriore divergenza dei punti rispetto all'origine.
Number Sequence: questa è la serie originale di "t". Collegando questo valore al valore del raggio di Circle.ByCenterPointRadius, i centri dei cerchi sono ancora più divergenti dall'origine, ma il raggio dei cerchi aumenta, creando uno stravagante grafico a forma di cerchio di Fibonacci.
Punti bonus se lo si rende 3D.
Ora che è stata creata una conchiglia Nautilus circolare, si può passare alle griglie parametriche. Si utilizzerà una rotazione di base sulla spirale di Fibonacci per creare una griglia di Fibonacci e il risultato verrà modellato dopo la crescita dei semi di girasole.
Come punto di partenza, iniziare con lo stesso passaggio dell'esercizio precedente: la creazione di una serie di punti della spirale con il nodo Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Quindi, seguire questi mini passaggi per generare una serie di spirali con rotazione diversa.
a. Geometry.Rotate: sono disponibili diverse opzioni di Geometry.Rotate; assicurarsi di aver scelto il nodo con geometry, basePlane e degrees come input. Collegare Point.ByCoordinates all'input geometry. Fare clic con il pulsante destro del mouse su questo nodo e verificare che il collegamento sia impostato su Globale.
b. Plane.XY: collegare all'input basePlane. Si ruoterà attorno all'origine, che è la stessa posizione della base della spirale.
c. Range: per l'input degrees, si desidera creare più rotazioni. È possibile farlo rapidamente con un componente di Range. Collegarlo all'input degrees.
d. Number: per definire l'intervallo di numeri, aggiungere tre nodi di numeri all'area di disegno in ordine verticale. Dall'alto verso il basso, assegnare rispettivamente i valori di 0.000, 360.000 e 120.000. Questi determinano la rotazione della spirale. Notare i risultati di output del nodo Range dopo aver collegato i tre nodi di numero al nodo stesso.
L'output sta iniziando a somigliare ad un vortice. Regolare alcuni dei parametri di Range e vedere come cambiano i risultati.
Modificare la dimensione di incremento del nodo Range da 120.000 a 36.600. Notare che in questo modo si creano più rotazioni e quindi si fornisce una griglia più densa.
Modificare la dimensione di incremento del nodo Range da 36.000 a 3.600. In questo modo si ottiene una griglia molto più densa e la direzionalità della spirale non è chiara. Ecco, è stato creato un girasole.
Per rendere le cose più complicate, aggiungere ancora più livelli alla gerarchia. La struttura di dati può essere espansa ben oltre un elenco bidimensionale di elenchi. Poiché gli elenchi sono elementi di per sé in Dynamo, è possibile creare dati con il maggior numero possibile di quote.
Qui come analogia si utilizzeranno le bambole matrioske russe. Ogni elenco può essere considerato come un contenitore contenente più elementi. Ogni elenco ha le sue proprietà ed è anche considerato come il suo oggetto.
Una serie di bambole matrioske russe (foto di ) è un'analogia per gli elenchi n-dimensionali. Ogni livello rappresenta un elenco e ogni elenco contiene voci al suo interno. Nel caso di Dynamo, ogni contenitore può avere più contenitori all'interno (che rappresentano le voci di ogni elenco).
Gli elenchi n-dimensionali sono difficili da spiegare visivamente, ma in questo capitolo sono stati creati alcuni esercizi che si concentrano sull'utilizzo di elenchi che si estendono per oltre due dimensioni.
Il mappaggio è probabilmente la parte più complessa della gestione di dati in Dynamo ed è particolarmente importante quando si utilizzano gerarchie complesse di elenchi. Con la serie di esercizi riportati di seguito, sarà illustrato quando utilizzare il mappaggio e le combinazioni quando i dati diventano multidimensionali.
Le introduzioni preliminari di List.Map e List.Combine sono disponibili nella sezione precedente. Nell'ultimo esercizio riportato di seguito, questi nodi verranno utilizzati in una struttura di dati complessa.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Questo esercizio è il primo di una serie di tre che si concentra sull'articolazione della geometria importata. Ogni parte di questa serie di esercizi incrementerà la complessità della struttura di dati.
Si inizia con il file .sat nella cartella dei file degli esercizi. È possibile selezionare questo file utilizzando il nodo File Path.
Con Geometry.ImportFromSAT, la geometria viene importata nell'anteprima di Dynamo come due superfici.
Per questo esercizio, si desidera eseguire una procedura semplice e utilizzare una delle superfici.
Selezionare l'indice di 1 per acquisire la superficie superiore. Questa operazione viene eseguita con il nodo List.GetItemAtIndex.
Disattivare l'anteprima della geometria dall'anteprima di Geometry.ImportFromSAT.
Il passaggio successivo consiste nel dividere la superficie in una griglia di punti.
1. Utilizzando Code Block, inserire queste due righe di codice:
0..1..#10;
0..1..#5;
.2. Con Surface.PointAtParameter, collegare i due valori di Code Block a u e v. Modificare il collegamento di questo nodo in Globale.
3. L'output mostra la struttura di dati, visibile anche nell'anteprima di Dynamo.
Quindi, utilizzare i punti dell'ultimo passaggio per generare dieci curve lungo la superficie.
Per esaminare come è organizzata la struttura di dati, collegare NurbsCurve.ByPoints all'output di Surface.PointAtParameter.
Per ora, è possibile disattivare l'anteprima del nodo List.GetItemAtIndex per ottenere un risultato più chiaro.
Un nodo List.Transpose di base inverte le colonne e le righe di un elenco di elenchi.
Collegando l'output di List.Transpose a NurbsCurve.ByPoints, si ottengono cinque curve che percorrono orizzontalmente la superficie.
È possibile disattivare l'anteprima del nodo NurbsCurve.ByPoints nel passaggio precedente per ottenere lo stesso risultato nell'immagine.
Viene aumentata la complessità. Si supponga di voler eseguire un'operazione sulle curve create nell'esercizio precedente. Forse si desidera correlare queste curve ad un'altra superficie ed eseguire il loft tra di esse. Ciò richiede maggiore attenzione alla struttura di dati, ma la logica sottostante è la stessa.
Iniziare con un passaggio dell'esercizio precedente, isolando la superficie superiore della geometria importata con il nodo List.GetItemAtIndex.
Utilizzando Surface.Offset, eseguire l'offset della superficie di un valore di 10.
Allo stesso modo dell'esercizio precedente, definire un Code Block con queste due righe di codice:
0..1..#10;
0..1..#5;
.Collegare questi output a due nodi Surface.PointAtParameter, ciascuno con il collegamento impostato su Globale. Uno di questi nodi è collegato alla superficie originale, mentre l'altro è collegato alla superficie di offset.
Disattivare l'anteprima di queste superfici.
Come nell'esercizio precedente, collegare gli output a due nodi NurbsCurve.ByPoints. Il risultato mostra le curve corrispondenti a due superfici.
Utilizzando List.Create, è possibile combinare i due gruppi di curve in un elenco di elenchi.
Notare dall'output che sono presenti due elenchi con dieci voci ciascuno, che rappresentano ogni serie di curve NURBS collegate.
Se si esegue Surface.ByLoft, è possibile rendere visivamente chiara questa struttura di dati. Il nodo esegue il loft di tutte le curve in ogni sottoelenco.
Disattivare l'anteprima del nodo Surface.ByLoft nel passaggio precedente.
Utilizzando List.Transpose, tenere presente che si stanno invertendo tutte le colonne e le righe. Questo nodo trasferirà due elenchi di dieci curve in dieci elenchi di due curve. Ora si ha ogni curva NURBS correlata alla curva adiacente sull'altra superficie.
Utilizzando Surface.ByLoft, si arriva a una struttura con nervatura.
Successivamente, verrà illustrato un processo alternativo per ottenere questo risultato.
Prima di iniziare, disattivare l'anteprima di Surface.ByLoft nel passaggio precedente per evitare confusione.
In alternativa a List.Transpose utilizzare List.Combine. In questo modo verrà eseguito un "combinatore" in ogni sottoelenco.
In questo caso, si utilizza List.Create come "combinatore", che crea un elenco di ogni voce nei sottoelenchi.
Utilizzando il nodo Surface.ByLoft, si ottengono le stesse superfici del passaggio precedente. La trasposizione è più semplice da utilizzare in questo caso, ma quando la struttura di dati diventa ancora più complessa, List.Combine è più affidabile.
Tornando indietro di alcuni passaggi, per cambiare l'orientamento delle curve nella struttura con nervatura, si desidera utilizzare List.Transpose prima di collegarsi a NurbsCurve.ByPoints. In questo modo verranno invertite le colonne e le righe, ottenendo 5 nervature orizzontali.
Adesso si farà un passo avanti. In questo esercizio, si utilizzeranno entrambe le superfici importate, creando una gerarchia di dati complessa. Tuttavia, il nostro obiettivo è completare la stessa operazione con la stessa logica sottostante.
Iniziare con il file importato dell'esercizio precedente.
Come nell'esercizio precedente, utilizzare il nodo Surface.Offset per eseguire l'offset di un valore di 10.
Notare dall'output che sono state create due superfici con il nodo di offset.
Allo stesso modo dell'esercizio precedente, definire un Code Block con queste due righe di codice:
0..1..#20;
0..1..#20;
.Collegare questi output a due nodi Surface.PointAtParameter, ciascuno con il collegamento impostato su Globale. Uno di questi nodi è collegato alle superfici originali, mentre l'altro è collegato alle superfici di offset.
Come nell'esercizio precedente, collegare gli output a due nodi NurbsCurve.ByPoints.
Osservando l'output di NurbsCurve.ByPoints, si noterà che questo è un elenco di due elenchi, che è più complesso rispetto all'esercizio precedente. I dati vengono suddivisi in categorie in base alla superficie sottostante, pertanto è stato aggiunto un altro livello ai dati strutturati.
Notare che le cose diventano più complesse nel nodo Surface.PointAtParameter. In questo caso abbiamo un elenco di elenchi di elenchi.
Prima di procedere, disattivare l'anteprima delle superfici esistenti.
Utilizzando il nodo List.Create, le curve NURBS vengono unite in una struttura di dati, creando un elenco di elenchi di elenchi.
Collegando un nodo Surface.ByLoft, si ottiene una versione delle superfici originali, in quanto ciascuna di esse rimane nel proprio elenco, così come è stata creata dalla struttura di dati originale.
Nell'esercizio precedente, è stato possibile utilizzare List.Transpose per creare una struttura a nervatura. Questo metodo non funzionerà qui. Una trasposizione deve essere utilizzata in un elenco bidimensionale e, poiché disponiamo di un elenco tridimensionale, un'operazione di "inversione di colonne e righe" non sarà facile. Tenere presente che gli elenchi sono oggetti, pertanto List.Transpose inverte gli elenchi con sottoelenchi, ma non inverte le curve NURBS ad un elenco inferiore nella gerarchia.
List.Combine funzionerà meglio in questo caso. Per ottenere strutture di dati più complesse, si desidera utilizzare i nodi List.Map e List.Combine.
Utilizzando List.Create come "combinatore", verrà creata una struttura di dati che funzionerà meglio.
La struttura di dati deve ancora essere trasposta ad un livello più basso nella gerarchia. Per eseguire questa operazione, utilizzare List.Map. Funziona come List.Combine, tranne che con un elenco di input, anziché due o più.
La funzione che verrà applicata a List.Map è List.Transpose, che consente di invertire le colonne e le righe dei sottoelenchi all'interno dell'elenco principale.
Infine, è possibile eseguire il loft delle curve NURBS con una gerarchia di dati corretta, restituendo una struttura con nervatura.
Aggiungere un po' di profondità alla geometria con un nodo Surface.Thicken con le impostazioni di input come mostrato.
Sarà utile aggiungere una superficie di supporto a questa struttura, quindi aggiungere un altro nodo Surface.ByLoft e utilizzare il primo output di NurbsCurve.ByPoints di un passaggio precedente come input.
Poiché l'anteprima sta diventando ingombra di oggetti, disattivare l'anteprima di questi nodi facendo clic con il pulsante destro del mouse su ciascuno di essi e deselezionare Anteprima per vedere meglio il risultato.
E con l'ispessimento di queste superfici selezionate, l'articolazione è completata.
Non è la sedia a dondolo più comoda di sempre, ma include molti dati.
Come ultimo passaggio, invertire la direzione dei membri striati. Dal momento che è stata utilizzata la trasposizione nell'esercizio precedente, si farà qualcosa di simile qui.
Poiché c'è un livello in più nella gerarchia, è necessario utilizzare List.Map con una funzione List.Tranpose per modificare la direzione delle curve NURBS.
Potrebbe essere necessario aumentare il numero di pedate, in modo da poter modificare Code Block in
0..1..#20;
0..1..#30;
.
La prima versione della sedia a dondolo era elegante, quindi il secondo modello offre una versione sportiva e informale della seduta.
Gli elenchi rappresentano il modo in cui vengono organizzati i dati. Nel sistema operativo del computer, sono presenti file e cartelle. In Dynamo, è possibile considerare questi elementi rispettivamente come voci ed elenchi. Analogamente al sistema operativo in uso, esistono molti modi per creare, modificare e sottoporre a query i dati. In questo capitolo, verrà descritto come vengono gestiti gli elenchi in Dynamo.
Un elenco è una raccolta di elementi o voci. Si prenda, ad esempio, un casco di banane. Ogni banana è una voce all'interno dell'elenco (o del casco). È più semplice raccogliere un casco di banane piuttosto che ogni singola banana e ciò vale anche per il raggruppamento di elementi secondo relazioni parametriche in una struttura di dati.
Quando si fanno acquisti nei negozi di alimentari, si mettono tutti gli oggetti acquistati in una borsa. Questa borsa è anche un elenco. Per fare il pane alla banana, occorrono 3 caschi di banane (servono per fare molto pane alla banana). La borsa rappresenta un elenco di caschi di banane e ogni casco rappresenta un elenco di banane. La borsa è un elenco di elenchi (bidimensionali) e il casco di banane è un elenco (unidimensionale).
In Dynamo, i dati dell'elenco vengono ordinati e la prima voce di ogni elenco ha un indice 0. Di seguito, saranno descritte la modalità di definizione degli elenchi in Dynamo e la modalità di relazione reciproca tra più elenchi.
Una cosa che potrebbe sembrare strana all'inizio è che il primo indice di un elenco è sempre 0; non 1. Così, quando si parla della prima voce di un elenco, si intende in realtà la voce che corrisponde all'indice 0.
Ad esempio, se si dovesse contare il numero di dita della mano destra, è probabile aver contato da 1 a 5. Tuttavia, se si dovessero inserire le dita in un elenco, in Dynamo sarebbero stati assegnati loro indici compresi tra 0 e 4. Sebbene questo possa sembrare un po' strano ai principianti in fatto di programmazione, l'indice in base zero è una pratica standard nella maggior parte dei sistemi di calcolo.
Nell'elenco sono ancora presenti 5 voci, questo perché l'elenco sta utilizzando un sistema di conteggio in base zero. E le voci memorizzate nell'elenco non devono essere solo numeri. Possono essere qualsiasi tipo di dati supportato da Dynamo, ad esempio punti, curve, superfici, famiglie e così via.
a. Indice
b. Punto
c. Elemento
Spesso il modo più semplice per esaminare il tipo di dati memorizzati in un elenco è collegare un nodo di controllo all'output di un altro nodo. Per default, il nodo di controllo mostra automaticamente tutti gli indici sul lato sinistro dell'elenco e visualizza gli elementi di dati sul lato destro.
Questi indici sono un elemento fondamentale quando si utilizzano gli elenchi.
Per quanto riguarda gli elenchi, input e output variano a seconda del nodo di Dynamo utilizzato. Ad esempio, è possibile utilizzare un elenco di 5 punti e collegare questo output a due diversi nodi di Dynamo: PolyCurve.ByPoints e Circle.ByCenterPointRadius:
L'input points per PolyCurve.ByPoints cerca “Point\[]”. Rappresenta un elenco di punti.
L'output per PolyCurve.ByPoints è una PolyCurve singola creata da un elenco di cinque punti.
L'input centerPoint per Circle.ByCenterPointRadius richiede "Point".
L'output per Circle.ByCenterPointRadius è un elenco di cinque cerchi i cui centri corrispondono all'elenco originale di punti.
I dati di input per PolyCurve.ByPoints e Circle.ByCenterPointRadius sono gli stessi, tuttavia il nodo Polycurve.ByPoints fornisce una PolyCurve mentre il nodo Circle.ByCenterPointRadius fornisce 5 cerchi con centri in ogni punto. In modo intuitivo, questa operazione ha senso: la PolyCurve viene disegnata come curva che collega i 5 punti, mentre i cerchi creano un cerchio diverso in ogni punto. Quindi cosa sta succedendo con i dati?
Posizionando il cursore sull'input points per Polycurve.ByPoints, si noterà che l'input cerca “Point\[]”. Notare le parentesi alla fine. Rappresenta un elenco di punti e, per creare una PolyCurve, l'input deve essere un elenco per ogni PolyCurve. Questo nodo comprimerà pertanto ogni elenco in una PolyCurve.
Dall'altro lato, l'input centerPoint per Circle.ByCenterPointRadius richiede "Point". Questo nodo cerca un punto, come elemento, per definire il punto centrale del cerchio. Per questo motivo, si ottengono cinque cerchi dai dati di input. Riconoscere queste differenze con gli input in Dynamo aiuta a comprendere meglio il funzionamento dei nodi durante la gestione dei dati.
La corrispondenza dei dati è un problema senza una soluzione chiara. Si verifica quando un nodo ha accesso a input di dimensioni diverse. La modifica dell'algoritmo di corrispondenza dei dati può portare a risultati molto diversi.
Si immagini un nodo che crea segmenti di linea tra punti (Line.ByStartPointEndPoint). Avrà due parametri di input che forniscono entrambi le coordinate dei punti:
Il modo più semplice consiste nel collegare gli input uno ad uno finché uno dei flussi non si esaurisce. Viene definito l'algoritmo "l'elenco più breve". Questo è il funzionamento di default per i nodi di Dynamo:
L'algoritmo "l'elenco più lungo" continua a collegare gli input e a riutilizzare gli elementi, finché tutti i flussi non si esauriscono:
Infine, il metodo Globale rende possibili tutti i collegamenti:
Come si può vedere, esistono diversi modi in cui è possibile disegnare linee tra questi gruppi di punti. Per trovare le opzioni del collegamento, fare clic con il pulsante destro del mouse sul centro di un nodo e scegliere il menu Collegamento.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Per dimostrare le operazioni di collegamento riportate di seguito, si utilizzerà questo file di base per definire l'elenco più breve, l'elenco più lungo e il collegamento globale.
Si modificherà il collegamento in Point.ByCoordinates, ma non cambierà nient'altro del grafico riportato sopra.
Scegliendo Più breve come opzione di collegamento (anche l'opzione di default), si ottiene una linea diagonale di base composta da cinque punti. I cinque punti indicano la lunghezza dell'elenco minore, pertanto il collegamento con l'elenco più breve viene interrotto dopo che si è arrivati alla fine di un elenco.
Modificando il collegamento in Più lungo, si ottiene una linea diagonale che si estende verticalmente. Con lo stesso metodo del diagramma concettuale, l'ultima voce nell'elenco di 5 voci verrà ripetuta per raggiungere la lunghezza dell'elenco più lungo.
Modificando il collegamento in Globale, si ottiene ogni combinazione tra ciascun elenco, fornendo una griglia di punti 5 x 10. Si tratta di una struttura di dati equivalente secondo il metodo globale come mostrato nel diagramma concettuale riportato sopra, tranne per il fatto che i dati sono ora un elenco di elenchi. Collegando una PolyCurve, è possibile vedere che ogni elenco viene definito dal relativo valore X, restituendo una riga di linee verticali.
Ora che è stato definito un elenco, si può parlare delle operazioni eseguibili su di esso. Si immagini un elenco come un mazzo di carte da gioco. Un mazzo è l'elenco e ogni carta da gioco rappresenta una voce.
Quali query è possibile eseguire dall'elenco? Consente di accedere alle proprietà esistenti.
Numero di carte nel mazzo? 52.
Numero di semi? 4.
Materiale? Carta.
Lunghezza? 3,5" o 89 mm.
Larghezza? 2,5" o 64 mm.
Quali azioni è possibile eseguire nell'elenco? In questo modo l'elenco cambia in base ad una determinata operazione.
È possibile mischiare il mazzo.
È possibile ordinare il mazzo in base al valore.
È possibile ordinare il mazzo in base al seme.
È possibile dividere il mazzo.
È possibile spartire il mazzo con singole mani.
È possibile selezionare una carta specifica nel mazzo.
Tutte le operazioni elencate sopra hanno nodi di Dynamo analoghi per l'utilizzo di elenchi di dati generici. Nelle lezioni riportate di seguito saranno illustrate alcune delle operazioni fondamentali che è possibile eseguire sugli elenchi.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
L'immagine seguente è il grafico di base che si sta disegnando tra due cerchi per rappresentare le operazioni di base con gli elenchi. Verrà illustrato come gestire i dati all'interno di un elenco e verranno mostrati i risultati visivi attraverso le azioni con gli elenchi riportate di seguito.
Iniziare con un Code Block con un valore di
500;
.Collegarlo all'input x di un nodo Point.ByCoordinates.
Collegare il nodo del passaggio precedente all'input origin di un nodo Plane.ByOriginNormal.
Utilizzando un nodo Circle.ByPlaneRadius, collegare il nodo del passaggio precedente all'input plane.
Utilizzando Code Block, designare un valore di
50;
per radius. Questo è il primo cerchio che verrà creato.Con un nodo Geometry.Translate, spostare il cerchio verso l'alto di 100 unità nella direzione Z.
Con un nodo Code Block, definire un intervallo di dieci numeri compreso tra 0 e 1 con questa riga di codice:
0..1..#10;
.Collegare il Code Block del passaggio precedente all'input param di due nodi Curve.PointAtParameter. Collegare Circle.ByPlaneRadius all'input curve del nodo superiore e Geometry.Translate all'input curve del nodo sottostante.
Utilizzando Line.ByStartPointEndPoint, collegare i due nodi Curve.PointAtParameter.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Il nodo List.Count è semplice: calcola il numero di valori in un elenco e restituisce tale numero. Questo nodo si diversifica sempre di più quando si utilizzano elenchi di elenchi, come dimostreremo nelle sezioni successive.
Il nodo **List.Count ****** restituisce il numero di linee nel nodo Line.ByStartPointEndPoint. In questo caso, il valore è 10, che corrisponde al numero di punti creati dal nodo Code Block originale.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
List.GetItemAtIndex è un modo fondamentale per eseguire una query su una voce dell'elenco.
Innanzitutto, fare clic con il pulsante destro del mouse sul nodo Line.ByStartPointEndPoint per disattivare la relativa anteprima.
Utilizzando il nodo List.GetItemAtIndex, selezionare l'indice "0" o la prima voce dell'elenco di linee.
Modificare il valore del dispositivo di scorrimento compreso tra 0 e 9 per selezionare un elemento diverso utilizzando List.GetItemAtIndex.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
List.Reverse inverte l'ordine di tutte le voci di un elenco.
Per visualizzare correttamente l'elenco invertito di linee, creare più linee modificando Code Block in
0..1..#50;
.Duplicare il nodo Line.ByStartPointEndPoint, inserire un nodo List.Reverse tra Curve.PointAtParameter e il secondo Line.ByStartPointEndPoint.
Utilizzare i nodi Watch 3D per visualizzare in anteprima due risultati diversi. Il primo mostra il risultato senza un elenco invertito. Le linee si collegano verticalmente ai punti adiacenti. L'elenco invertito, tuttavia, collegherà tutti i punti all'ordine opposto nell'altro elenco.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
List.ShiftIndices è un buono strumento per creare torsioni o modelli elicoidali o qualsiasi altra manipolazione di dati simile. Questo nodo sposta le voci di un elenco in base ad un determinato numero di indici.
Nello stesso processo dell'elenco inverso, inserire List.ShiftIndices in Curve.PointAtParameter e Line.ByStartPointEndPoint.
Utilizzando un Code Block, è stato designato un valore di "1" per spostare l'elenco in base ad un indice.
Notare che la modifica è lieve, ma tutte le linee nel nodo Watch 3D inferiore sono state spostate in base ad un indice quando vengono collegate all'altro gruppo di punti.
Modificando Code Block in un valore superiore, ad esempio "30", si noterà una differenza significativa nelle linee diagonali. In questo caso, lo spostamento funziona come il diaframma di una fotocamera, creando una torsione nella forma cilindrica originale.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
List.FilterByBooleanMask rimuoverà alcune voci in base ad un elenco di valori booleani o valori che riportano "true" o "false".
Per creare un elenco di valori che riportano "true" o "false", è necessario un po' più di lavoro.
Utilizzando un Code Block, definire un'espressione con la sintassi:
0..List.Count(list);
. Collegare il nodo Curve.PointAtParameter all'input list. Si esaminerà in maniera dettagliata questa configurazione nel capitolo sul blocco di codice, ma in questo caso la riga di codice fornisce un elenco che rappresenta ogni indice del nodo Curve.PointAtParameter.Utilizzando un nodo %** (modulo)**, collegare l'output di Code Block all'input x e un valore di 4 all'input y. Questo fornirà il resto quando si divide l'elenco di indici per 4. % (modulo) è un nodo molto utile per la creazione di modelli. Tutti i valori verranno letti come possibili resti di 4: 0, 1, 2, 3.
Dal nodo %** (modulo)**, si sa che un valore di 0 indica che l'indice è divisibile per 4 (0, 4, 8 e così via). Utilizzando un nodo = =, è possibile verificare la divisibilità provando con un valore di "0".
Il nodo Watch mostra solo questo: è presente un modello true/false che riporta: true, false, false, false....
Utilizzando questo modello true/false, collegarlo all'input mask di due nodi List.FilterByBooleanMask.
Collegare il nodo Curve.PointAtParameter ad ogni input list per List.FilterByBooleanMask.
L'output di Filter.ByBooleanMask riporta "in" e "out". "In" rappresenta i valori che hanno un valore mask di "true", mentre "out" rappresenta i valori che hanno un valore di "false". Collegando gli output "in" agli input startPoint ed endPoint di un nodo Line.ByStartPointEndPoint, è stato creato un elenco filtrato di linee.
Il nodo Watch 3D mostra che le linee sono minori dei punti. È stato selezionato solo il 25% dei nodi filtrando solo i valori true.
Il colore è un ottimo tipo di dati per la creazione di effetti visivi accattivanti e per il rendering delle differenze nell'output del programma visivo in uso. Quando si utilizzano dati astratti e numeri variabili, a volte è difficile vedere cosa cambia e in che misura. Questa è un'ottima applicazione per i colori.
I colori in Dynamo vengono creati utilizzando gli input ARGB. Corrispondono ai canali alfa, rosso, verde e blu. L'alfa rappresenta la trasparenza del colore, mentre gli altri tre vengono utilizzati come colori primari per generare l'intero spettro dei colori.
I colori nella tabella riportata di seguito eseguono una query sulle proprietà utilizzate per definire il colore: alfa, rosso, verde e blu. Notare che il nodo Color.Components fornisce tutti e quattro come output diversi, il che lo rende il nodo preferito per l'esecuzione di una query sulle proprietà di un colore.
I colori nella tabella riportata di seguito corrispondono allo spazio colore HSB. La divisione del colore in tonalità, saturazione e luminosità è probabilmente più intuitiva per la modalità di interpretazione del colore. Quale colore dovrebbe essere? Quanto dovrebbe essere colorato? E quanto dovrebbe essere chiaro o scuro il colore? Si tratta rispettivamente della suddivisione di tonalità, saturazione e luminosità.
L'intervallo di colori è simile al nodo Remap Range dell'esercizio : riassocia un elenco di numeri ad un altro dominio. Tuttavia, anziché il mappaggio ad un dominio di numeri, si associa ad una sfumatura di colore in base a numeri di input compresi tra 0 e 1.
L'attuale nodo funziona bene, ma può essere un po' complicato fare in modo che tutto funzioni la prima volta. Il modo migliore per acquisire familiarità con la sfumatura di colore consiste nel verificarla in modo interattivo. Ecco un rapido esercizio per esaminare come impostare una sfumatura con colori di output corrispondenti ai numeri.
Definire tre colori: utilizzando un nodo Code Block, definire rosso, verde e blu collegando le combinazioni appropriate di 0 e 255.
Creare l'elenco: unire i tre colori in un elenco.
Definire gli indici: creare un elenco per definire le posizioni dei grip di ciascun colore (comprese tra 0 e 1). Notare il valore di 0.75 per il verde. In questo modo il colore verde viene posizionato per 3/4 nella sfumatura orizzontale sul dispositivo di scorrimento Color Range.
Code Block: immettere i valori (compresi tra 0 e 1) da convertire in colori.
Il nodo Display.ByGeometry offre la possibilità di colorare la geometria nella finestra di Dynamo. Ciò è utile per separare diversi tipi di geometria, dimostrare un concetto parametrico o definire una legenda di analisi per la simulazione. Gli input sono semplici: geometry e color. Per creare una sfumatura come l'immagine riportata sopra, l'input color è collegato al nodo Color Range.
Il nodo Display.BySurfaceColors consente di associare dati su una superficie con il colore. Questa funzionalità introduce alcune straordinarie possibilità di visualizzazione dei dati ottenuti tramite l'analisi discreta, come quella solare, energetica e di prossimità. L'applicazione di colore ad una superficie in Dynamo è simile all'applicazione di una composizione ad un materiale in altri ambienti CAD. Si dimostrerà come utilizzare questo strumento nel breve esercizio riportato di seguito.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Questo esercizio si concentra sul controllo parametrico del colore in parallelo con la geometria. La geometria è un'elica di base, che è possibile definire di seguito utilizzando Code Block. Si tratta di un metodo rapido e semplice per creare una funzione parametrica; poiché l'attenzione è rivolta al colore (anziché alla geometria), si utilizza il blocco di codice per creare in modo efficiente l'elica senza sovraccaricare l'area di disegno. Il blocco di codice verrà utilizzato più frequentemente man mano che nella guida introduttiva si passa ad un argomento più avanzato.
Code Block: definire i due blocchi di codice con le formule indicate sopra. Si tratta di un metodo parametrico rapido per la creazione di una spirale.
Point.ByCoordinates: collegare i tre output del blocco di codice alle coordinate per il nodo.
Ora è presente una serie di punti che creano un'elica. Il passaggio successivo consiste nel creare una curva attraverso i punti in modo da poter visualizzare l'elica.
PolyCurve.ByPoints: collegare l'output Point.ByCoordinates all'input points per il nodo. Si ottiene una curva elicoidale.
Curve.PointAtParameter: collegare l'output PolyCurve.ByPoints all'input curve. Lo scopo di questo passaggio è creare un punto attrattore parametrico che scorre lungo la curva. Poiché la curva sta valutando un punto in corrispondenza di un parametro, sarà necessario immettere un valore param compreso tra 0 e 1.
Number Slider: dopo l'aggiunta all'area di disegno, modificare il valore min in 0.0, il valore max in 1.0 e il valore step in 0.01. Collegare l'output del dispositivo di scorrimento all'input param per Curve.PointAtParameter. Ora è visibile un punto per la lunghezza dell'elica, rappresentato da una percentuale del dispositivo di scorrimento (0 in corrispondenza del punto iniziale, 1 in corrispondenza del punto finale).
Una volta creato il punto di riferimento, verrà confrontata la distanza dal punto di riferimento ai punti originali che definiscono l'elica. Questo valore della distanza controllerà la geometria e il colore.
Geometry.DistanceTo: collegare l'output Curve.PointAtParameter all'input. Collegare Point.ByCoordinates all'input geometry.
Watch: l'output risultante mostra un elenco di distanze da ogni punto elicoidale al punto di riferimento lungo la curva.
Il passaggio successivo consiste nel controllare i parametri con l'elenco di distanze dai punti elicoidali al punto di riferimento. È possibile utilizzare questi valori della distanza per definire i raggi di una serie di sfere lungo la curva. Per mantenere le sfere ad una dimensione adatta, è necessario riassociare i valori per la distanza.
Math.RemapRange: collegare l'output Geometry.DistanceTo all'input numbers.
Code Block: collegare un blocco di codice con un valore di 0.01 all'input newMin e un blocco di codice con un valore di 1 all'input di newMax.
Watch: collegare l'output Math.RemapRange ad un nodo e l'output Geometry.DistanceTo ad un altro. Confrontare i risultati.
In questo passaggio è stato riassociato l'elenco di distanze in modo che siano un intervallo più piccolo. È possibile modificare i valori newMin e newMax in base alle esigenze specifiche. I valori verranno riassociati e avranno lo stesso rapporto di distribuzione nel dominio.
Sphere.ByCenterPointRadius: collegare l'output Math.RemapRange all'input radius e l'output Point.ByCoordinates originale all'input centerPoint.
Modificare il valore del dispositivo di scorrimento dei numeri e osservare la dimensione delle sfere aggiornate. Si ottiene una maschera di inserimento parametrica.
La dimensione delle sfere dimostra la serie parametrica definita da un punto di riferimento lungo la curva. Per controllare il colore, utilizzare lo stesso concetto per il raggio della sfera.
Color Range: aggiungere all'area di disegno. Quando si posiziona il cursore sull'input value, si noterà che i numeri richiesti sono compresi tra 0 e 1. È necessario riassociare i numeri dell'output Geometry.DistanceTo in modo che siano compatibili con questo dominio.
Sphere.ByCenterPointRadius: per il momento, disattivare l'anteprima in questo nodo (fare clic con il pulsante destro del mouse > Anteprima).
Math.RemapRange: questo processo dovrebbe essere noto. Collegare l'output Geometry.DistanceTo all'input numbers.
Code Block: analogamente ad un passaggio precedente, creare un valore di 0 per l'input newMin e un valore di 1 per l'input newMax. In questo caso, è possibile definire due output da un blocco di codice.
Color Range: collegare l'output Math.RemapRange all'input value.
Color.ByARGB: questa è la procedura che consente di creare due colori. Sebbene questo processo possa sembrare complesso, è identico ai colori RGB di un altro software. Per eseguirlo, occorre semplicemente utilizzare la programmazione visiva.
Code Block: creare due valori di 0 e 255. Collegare i due output ai due input Color.ByARGB come mostra l'immagine riportata sopra (o creare i due colori preferiti).
Color Range: l'input colors richiede un elenco di colori. È necessario creare questo elenco dai due colori creati nel passaggio precedente.
List.Create: unire i due colori in un elenco. Collegare l'output all'input colors per Color Range.
Display.ByGeometryColor: collegare Sphere.ByCenterPointRadius all'input geometry e Color Range all'input color. Si ottiene una sfumatura uniforme nel dominio della curva.
Se si modifica il valore di Number Slider di prima nella definizione, i colori e le dimensioni vengono aggiornati. In questo caso, i colori e la dimensione del raggio sono direttamente correlati: ora si dispone di un collegamento visivo tra due parametri.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Innanzitutto, è necessario creare (o fare riferimento ad) una superficie da utilizzare come input per il nodo Display.BySurfaceColors. In questo esempio si esegue il loft tra una curva seno e una curva coseno.
Questo gruppo di nodi sta creando punti lungo l'asse Z, quindi li disloca in base alle funzioni seno e coseno. Gli elenchi a due punti vengono quindi utilizzati per generare curve NURBS.
Surface.ByLoft: generare una superficie interpolata tra l'elenco di curve NURBS.
File Path: selezionare un file di immagine da campionare per i dati di pixel a valle.
Utilizzare File.FromPath per convertire il percorso del file in un file, quindi passare a Image.ReadFromFile per produrre un'immagine per il campionamento.
Image.Pixels: immettere un'immagine e fornire un valore di esempio da utilizzare lungo le quote X e Y dell'immagine.
Dispositivo di scorrimento: fornire valori di esempio per Image.Pixels.
Display.BySurfaceColors: associare la serie di valori del colore sulla superficie rispettivamente lungo X e Y.
Anteprima ravvicinata della superficie di output con campioni dalla risoluzione di 400 x 300
Si aggiunge un altro livello alla gerarchia. Se si prende il mazzo di schede dell'esempio originale e si crea una scatola che contiene più mazzi, la scatola ora rappresenta un elenco di mazzi e ogni mazzo rappresenta un elenco di carte. Questo è un elenco di elenchi. Per analogia in questa sezione, l'immagine riportata di seguito contiene un elenco di rotoli di monete e ogni rotolo contiene un elenco di penny.
Quali query è possibile eseguire dall'elenco di elenchi? Consente di accedere alle proprietà esistenti.
Numero di tipi di moneta? 2.
Valori del tipo di moneta? $0.01 e $0.25.
Materiale dei quarti? Rame al 75% e nichel al 25%.
Materiale dei penny? Zinco al 97,5% e rame al 2,5%.
Quali azioni è possibile eseguire nell'elenco di elenchi? In questo modo si modifica l'elenco di elenchi in base ad una determinata operazione.
Selezionare una pila specifica di quarti o penny.
Selezionare un quarto o un penny specifico.
Ridisporre le pile di quarti e penny.
Mischiare le pile insieme.
Anche in questo caso, Dynamo dispone di un nodo analogico per ciascuna delle operazioni riportate sopra. Poiché si sta lavorando con dati astratti e non con oggetti fisici, occorre una serie di regole per controllare il modo in cui ci spostiamo verso l'alto e verso il basso nella gerarchia dei dati.
Quando si utilizzano elenchi di elenchi, i dati sono stratificati e complessi, ma questo offre l'opportunità di eseguire alcune incredibili operazioni parametriche. Si esamineranno i principi fondamentali e si discuterà di alcune altre operazioni nelle lezioni riportate di seguito.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Il concetto fondamentale da apprendere da questa sezione: Dynamo tratta gli elenchi come oggetti di per sé. Questa gerarchia dall'alto verso il basso viene sviluppata tenendo a mente la programmazione orientata agli oggetti. Anziché selezionare elementi secondari con un comando quale List.GetItemAtIndex, Dynamo selezionerà tale indice dell'elenco principale nella struttura di dati. E quell'elemento può essere un altro elenco. Verrà esaminato dettagliatamente con un'immagine di esempio:
Con Code Block, sono stati definiti due intervalli:
0..2; 0..3;
Questi intervalli sono connessi ad un nodo Point.ByCoordinates con il collegamento impostato su Globale. In questo modo viene creata una griglia di punti e viene inoltre restituito un elenco di elenchi come output.
Notare che il nodo Watch fornisce 3 elenchi con 4 elementi in ogni elenco.
Quando si utilizza List.GetItemAtIndex, con un indice 0, Dynamo seleziona il primo elenco e tutto il relativo contenuto. Altri programmi possono selezionare il primo elemento di ogni elenco nella struttura di dati, ma Dynamo utilizza una gerarchia dall'alto verso il basso durante la gestione dei dati.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Livella rimuove tutti i livelli di dati da una struttura di dati. Ciò è utile quando le gerarchie dei dati non sono necessarie per l'operazione desiderata, ma può essere rischioso perché rimuove le informazioni. L'esempio seguente mostra il risultato della riduzione di livelli di un elenco di dati.
Inserire una riga di codice per definire un intervallo in Code Block:
-250..-150..#4;
Se si inserisce il blocco di codice nell'input x e y di un nodo Point.ByCoordinates, è necessario impostare il collegamento su Globale per ottenere una griglia di punti.
Il nodo Watch mostra che è presente un elenco di elenchi.
Un nodo PolyCurve.ByPoints farà riferimento a ciascun elenco e creerà la rispettiva PolyCurve. Nell'anteprima di Dynamo, sono presenti quattro PolyCurve che rappresentano ogni riga della griglia.
Inserendo un riduzione di livelli prima del nodo PolyCurve, è stato creato un singolo elenco per tutti i punti. Il nodo PolyCurve.ByPoints fa riferimento ad un elenco per creare una curva. Poiché tutti i punti si trovano in un elenco, si otterrà una PolyCurve zig-zag che corre in tutto l'elenco di punti.
Sono inoltre disponibili opzioni per la riduzione di livelli isolati di dati. Utilizzando il nodo List.Flatten, è possibile definire un numero impostato di livelli di dati da ridurre nella parte superiore della gerarchia. Questo è uno strumento molto utile se sono presenti strutture di dati complesse che non sono necessariamente rilevanti per il workflow. Un'altra opzione consiste nell'utilizzare il nodo Flatten come funzione in List.Map. Ulteriori informazioni su List.Map sono disponibili di seguito.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Quando si utilizza la modellazione parametrica, talvolta può essere utile modificare la strutture di dati in un elenco esistente. Anche per questo sono disponibili molti nodi, mentre la suddivisione è la versione più semplice. Con la suddivisione, è possibile suddividere un elenco in sottoelenchi con un determinato numero di elementi.
Il comando di suddivisione suddivide gli elenchi in base ad una determinata lunghezza dell'elenco. In alcuni modi, il comando di suddivisione è l'opposto della riduzione di livelli: anziché rimuovere la struttura di dati, ad esso vengono aggiunti nuovi livelli. Questo è uno strumento utile per operazioni geometriche come l'esempio seguente.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
List.Map/Combine applica una funzione impostata ad un elenco di input, ma ad un livello inferiore nella gerarchia. Le combinazioni sono identiche a quelle delle mappe, tranne per il fatto che le combinazioni possono avere più input corrispondenti all'input di una funzione specificata.
Come introduzione rapida, si esaminerà il nodo List.Count di una sezione precedente.
Il nodo List.Count conteggia tutti gli elementi di un elenco. Verrà utilizzato per illustrare il funzionamento di List.Map.
Inserire due righe di codice in Code Block:
-50..50..#Nx; -50..50..#Ny;
Dopo aver digitato questo codice, il blocco di codice creerà due input per Nx e Ny.
Con due Integer Slider, definire i valori Nx e Ny collegandoli a Code Block.
Collegare ogni riga del blocco di codice ai rispettivi input X e Y di un nodo Point.ByCoordinates. Fare clic con il pulsante destro del mouse sul nodo, selezionare Collegamento e scegliere Globale. In questo modo viene creata una griglia di punti. Poiché è stato definito l'intervallo da -50 a 50, la griglia di Dynamo di default viene estesa.
Un nodo Watch mostra i punti creati. Notare la struttura di dati. È stato creato un elenco di elenchi. Ogni elenco rappresenta una riga di punti della griglia.
Associare un nodo List.Count all'output del nodo Watch del passaggio precedente.
Collegare un nodo Watch all'output List.Count.
Notare che il nodo List.Count fornisce un valore pari a 5. Questo valore è uguale alla variabile "Nx" come definito nel blocco di codice. Perché?
Innanzitutto, il nodo Point.ByCoordinates utilizza l'input "x" come input principale per la creazione di elenchi. Quando Nx è 5 e Ny è 3, viene visualizzato un elenco di 5 elenchi, ciascuno con 3 elementi.
Poiché Dynamo tratta gli elenchi come oggetti di per sé, all'elenco principale della gerarchia viene applicato un nodo List.Count. Il risultato è un valore di 5 o il numero di elenchi nell'elenco principale.
Utilizzando un nodo List.Map, si scende di un livello nella gerarchia ed è possibile eseguire una "function" a questo livello.
Notare che il nodo List.Count non contiene input. Viene utilizzato come funzione, pertanto il nodo List.Count verrà applicato a ogni singolo elenco, scendendo di un livello nella gerarchia. L'input vuoto di List.Count corrisponde all'input dell'elenco di List.Map.
I risultati di List.Count ora forniscono un elenco di 5 elementi, ciascuno con un valore pari a 3. Rappresenta la lunghezza di ogni sottoelenco.
In questo esercizio, si utilizzerà List.Combine per dimostrare come tale nodo può essere utilizzato per applicare una funzione in elenchi separati di oggetti.
Iniziare impostando due elenchi di punti.
Utilizzare il nodo Sequence per generare 10 valori, ciascuno con un incremento di 10 passi.
Collegare il risultato all'input x di un nodo Point.ByCoordinates. In questo modo verrà creato un elenco di punti in Dynamo.
Aggiungere un secondo nodo Point.ByCoordinates all'area di lavoro, utilizzare lo stesso output Sequence dell'input x, ma utilizzare un Interger Slider come input y e impostarne il valore su 31 (può essere qualsiasi valore, purché non si sovrapponga al primo gruppo di punti) in modo che i 2 gruppi di punti non si sovrappongano l'uno sull'altro.
Successivamente, verrà utilizzato List.Combine per applicare una funzione agli oggetti in 2 elenchi separati. In questo caso, si tratta di una funzione della linea di disegno semplice.
Aggiungere List.Combine all'area di lavoro e collegare i 2 gruppi di punti come il relativo input list0 e list1.
Utilizzare un Line.ByStartPointEndPoint come funzione di input per List.Combine.
Una volta completato, i 2 gruppi di punti vengono compressi/associati tramite una funzione Line.ByStartPointEndPoint e restituiscono 10 righe in Dynamo.
Fare riferimento all'esercizio in Elenchi n-dimensionali per vedere un altro esempio di utilizzo di List.Combine.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Preferita a List.Map, la funzionalità List@Level consente di selezionare direttamente il livello di elenco che si desidera utilizzare nella porta di input del nodo. Questa funzionalità può essere applicata a qualsiasi input in entrata di un nodo e consentirà di accedere ai livelli degli elenchi più rapidamente e più facilmente rispetto ad altri metodi. È sufficiente indicare al nodo il livello dell'elenco che si desidera utilizzare come input e lasciare che il nodo faccia il resto.
In questo esercizio, si utilizzerà la funzionalità List@Level per isolare un livello specifico di dati.
Si inizierà con una semplice griglia di punti 3D.
Poiché la griglia è costruita con un intervallo per X, Y e Z, i dati sono strutturati in 3 ordini: un elenco X, un elenco Y e un elenco Z.
Questi ordini esistono in livelli diversi. I livelli sono indicati nella parte inferiore del simbolo circolare di anteprima. Le colonne dei livelli di elenco corrispondono ai dati dell'elenco riportati sopra per aiutare ad identificare il livello da utilizzare.
I livelli di elenco sono organizzati in ordine inverso, in modo che i dati del livello più basso siano sempre in "L1". In questo modo si garantisce che i grafici funzionino come previsto, anche se qualcosa è cambiato a monte.
Per utilizzare la funzione List@Level, fare clic su '>'. All’interno di questo menu, verranno visualizzate due caselle di controllo.
Usa livelli: attiva la funzionalità List@Level. Dopo aver fatto clic su questa opzione, sarà possibile fare clic e selezionare i livelli di elenco di input che si desidera utilizzare per il nodo. Con questo menu, è possibile provare rapidamente diverse opzioni di livello facendo clic verso l'alto o verso il basso.
Mantieni struttura elenco: se questa opzione è attivata, sarà possibile mantenere la struttura dei livelli dell'input. Talvolta, è possibile organizzare i dati in sottoelenchi in modo specifico. Selezionando questa opzione, è possibile mantenere intatta l'organizzazione degli elenchi senza perdere alcuna informazione.
Grazie alla semplice griglia 3D, è possibile accedere alla struttura dell'elenco e visualizzarla attivando e disattivando i livelli di elenchi. Ogni combinazione di indice e livello di elenco restituirà un gruppo di punti diverso dell'insieme 3D originale.
"@L2" in DesignScript consente di selezionare solo l'elenco al livello 2. L'elenco al livello 2 con l'indice 0 include solo il primo gruppo di punti Y, restituendo solo la griglia XZ.
Se si modifica il filtro del livello in "L1", sarà possibile vedere tutto nel primo livello di elenco. L'elenco al livello 1 con indice 0 include tutti i punti 3D in un elenco non strutturato.
Se si prova la stessa procedura per "L3", sarà possibile vedere solo i punti del terzo livello di elenco. L'elenco al livello 3 con l'indice 0 include solo il primo gruppo di punti Z, restituendo solo una griglia XY.
Se si prova la stessa procedura per "L4", sarà possibile vedere solo i punti del terzo livello di elenco. L'elenco al livello 4 con l'indice 0 include solo il primo gruppo di punti X, restituendo solo una griglia YZ.
Sebbene questo esempio particolare possa essere creato anche con List.Map, List@Level semplifica notevolmente l'interazione, semplificando così l'accesso ai dati dei nodi. Di seguito è riportato un confronto tra i metodi List.Map e List@Level:
Sebbene entrambi i metodi consentano di accedere agli stessi punti, il metodo List@Level ci consente di passare facilmente da un livello di dati all'altro all'interno di un singolo nodo.
Per accedere ad una griglia di punti con List.Map, sarà necessario disporre di un nodo List.GetItemAtIndex insieme a List.Map. Per ogni livello di elenco inferiore, sarà necessario utilizzare un nodo List.Map aggiuntivo. A seconda della complessità degli elenchi, potrebbe essere necessario aggiungere una quantità significativa di nodi List.Map al grafico per accedere al livello di informazioni appropriato.
In questo esempio, un nodo List.GetItemAtIndex con un nodo List.Map restituisce lo stesso gruppo di punti con la stessa struttura dell'elenco di List.GetItemAtIndex con l'opzione "@L3" selezionata.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Trasponi è una funzione fondamentale quando si lavora con elenchi di elenchi. Come nei programmi con fogli di calcolo, una trasposizione inverte le colonne e le righe di una struttura di dati. Verrà mostrata questa funzione con una matrice di base di seguito e nella seguente sezione sarà illustrato come utilizzare un trasposizione per creare relazioni geometriche.
Si eliminano i nodi List.Count dell'esercizio precedente e si passa ad una geometria per vedere la struttura di dati.
Collegare un nodo PolyCurve.ByPoints all'output del nodo Watch da Point.ByCoordinates.
L'output mostra 5 PolyCurve e le curve vengono visualizzate nell'anteprima di Dynamo. Il nodo di Dynamo sta cercando un elenco di punti (o un elenco di elenchi di punti in questo caso) e sta creando una singola PolyCurve da essi. Essenzialmente, ogni elenco è stato convertito in una curva nella struttura di dati.
Un nodo List.Transpose sposterà tutti gli elementi con tutti gli elenchi in un elenco di elenchi. Ciò risulta complicato, ma si tratta della stessa logica della trasposizione in Microsoft Excel: il passaggio tra colonne e righe in una struttura di dati.
Notare il risultato astratto: la trasposizione ha modificato la struttura dell'elenco da 5 elenchi con 3 elementi ciascuno a 3 elenchi con 5 elementi ciascuno.
Notare il risultato geometrico: utilizzando PolyCurve.ByPoints, si ottengono 3 PolyCurve nella direzione perpendicolare alle curve originali.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esercizio viene utilizzata una parte della logica stabilita in un esercizio precedente per modificare una superficie. L'obiettivo è intuitivo, ma la navigazione nella struttura di dati risulterà più impegnativa. Si desidera articolare una superficie spostando un punto di controllo.
Iniziare con la stringa di nodi riportata sopra. Si sta creando una superficie di base che estende la griglia di default di Dynamo.
Utilizzando Code Block, inserire queste due righe di codice e collegarle rispettivamente agli input u e v di Surface.PointAtParameter:
-50..50..#3;
-50..50..#5;
.Assicurarsi di impostare il collegamento di Surface.PointAtParameter su Globale.
Il nodo Watch mostra che è presente un elenco di tre elenchi, ciascuno con 5 elementi.
In questo passaggio, si desidera eseguire una query sul punto centrale nella griglia creata. Per eseguire questa operazione, selezionare il punto centrale nell'elenco centrale. Ha senso, giusto?
Per confermare che si tratta del punto corretto, è anche possibile fare clic sugli elementi del nodo Watch per confermare che è quello corretto.
Utilizzando Code Block, si scriverà una riga di codice di base per l'esecuzione di una query su un elenco di elenchi:
points[1][2];
.Utilizzando Geometry.Translate, si sposterà il punto selezionato verso l'alto nella direzione Z di 20 unità.
Selezionare anche la riga centrale dei punti con un nodo List.GetItemAtIndex. Nota Analogamente a un passaggio precedente, è anche possibile eseguire una query sull'elenco con Code Block, utilizzando una riga di
points[1];
.
Finora è stata eseguita correttamente la query sul punto centrale ed è stato spostato verso l'alto. Ora è necessario reinserire il punto spostato nella struttura di dati originale.
Innanzitutto, si desidera sostituire l'elemento dell'elenco isolato in un passaggio precedente.
Utilizzando List.ReplaceItemAtIndex, si sostituirà l'elemento centrale utilizzando un indice di "2", con l'elemento sostitutivo collegato al punto spostato (Geometry.Translate).
L'output mostra che è stato inserito il punto spostato nell'elemento centrale dell'elenco.
Dopo aver modificato l'elenco, è necessario reinserire l'elenco nella struttura di dati originale, ovvero l'elenco di elenchi.
Seguendo la stessa logica, utilizzare List.ReplaceItemAtIndex per sostituire l'elenco centrale con l'elenco modificato.
Notare che i Code Block che definiscono l'indice per questi due nodi sono 1 e 2, che corrisponde alla query originale di Code Block (points[1][2]).
Selezionando l'elenco in corrispondenza dell'index 1, viene visualizzata la struttura di dati evidenziata nell'anteprima di Dynamo. Il punto spostato è stato unito correttamente nella struttura di dati originale.
Esistono molti modi per creare una superficie da questo gruppo di punti. In questo caso, si creerà una superficie eseguendo il loft delle curve insieme.
Creare un nodo NurbsCurve.ByPoints e collegare la nuova struttura di dati per creare tre curve NURBS.
Collegare un nodo Surface.ByLoft all'output di NurbsCurve.ByPoints. Ora è presente una superficie modificata. È possibile modificare il valore Z originale della geometria. Eseguire la traslazione e osservare l’aggiornamento della geometria.
Photo by .
Foto di
Foto di .
Nota Questo esercizio è stato creato con una versione precedente di Dynamo. In gran parte il funzionamento di List.Map è stato risolto con l'aggiunta della funzionalità List@Level. Per ulteriori informazioni, vedere di seguito.
Nota Questo esercizio è stato creato con una versione precedente di Dynamo. In gran parte, il funzionamento di List.Combine è stato risolto con l'aggiunta della funzionalità List@Level. Per ulteriori informazioni, vedere di seguito.
La sintassi abbreviata del blocco di codice utilizza "[]" per definire un elenco. Questo è un modo molto più rapido e più fluido per creare un elenco rispetto al nodo List.Create. Code Block viene descritto in modo più dettagliato in . Fare riferimento all'immagine seguente per osservare come è possibile definire un elenco con più espressioni con un blocco di codice.
La sintassi abbreviata di Code Block utilizza "[]" come metodo rapido e semplice per selezionare gli elementi specifici desiderati da una struttura di dati complessa. I Code Block vengono descritti in modo più dettagliato nel . Fare riferimento all'immagine seguente per osservare come è possibile eseguire query su un elenco con più tipi di dati con un blocco di codice.
Colore ARGB (Color.ByARGB)
A,R,G,B
colore
Alfa (Color.Alpha)
colore
A
Rosso (Color.Red)
colore
R
Verde (Color.Green)
colore
G
Blu (Color.Blue)
colore
B
Componenti (Color.Components)
colore
A,R,G,B
Tonalità (Color.Hue)
colore
Tonalità
Saturazione (Color.Saturation)
colore
Saturazione
Luminosità (Color.Brightness)
colore
Luminosità
Dynamo 2.0 consente di visualizzare un'ampia varietà di nodi Dictionary da utilizzare. Ciò include i nodi di Create, Action e Query.
Dictionary.ByKeysValues
creerà un dizionario con le chiavi e i valori forniti. (il numero di voci corrisponderà all'input più breve dell'elenco).
Dictionary.Components
produrrà i componenti del dizionario di input. (è l'opposto del nodo Create).
Dictionary.RemoveKeys
produrrà un nuovo oggetto dizionario con le chiavi di input rimosse.
Dictionary.SetValueAtKeys
creerà un nuovo dizionario basato sulle chiavi di input e sui valori per sostituire il valore corrente nelle chiavi corrispondenti.
Dictionary.ValueAtKey
restituirà il valore nella chiave di input.
Dictionary.Count
indicherà il numero di coppie chiave-valore presenti nel dizionario.
Dictionary.Keys
restituirà le chiavi attualmente memorizzate nel dizionario.
Dictionary.Values
restituirà i valori attualmente memorizzati nel dizionario.
La correlazione complessiva dei dati con i dizionari rappresenta un'alternativa significativa al vecchio metodo di utilizzo di indici ed elenchi.
I dizionari rappresentano una raccolta di dati correlati ad un altro elemento di dati noto come chiave. I dizionari consentono di cercare, eliminare e inserire dati in una raccolta.
Essenzialmente, si può pensare ad un dizionario come ad uno strumento davvero intelligente in cui cercare qualcosa.
Sebbene la funzionalità del dizionario sia disponibile da tempo in Dynamo, Dynamo 2.0 introduce un nuovo metodo di gestione di questo tipo di dati.
Immagine gentilmente concessa da sixtysecondrevit.com
Dynamo dispone di molte funzionalità incorporate, memorizzate nella libreria di nodi. Per le routine utilizzate di frequente o per il grafico speciale che si desidera condividere con la comunità, i nodi e i pacchetti personalizzati rappresentano un ottimo modo per estendere ulteriormente Dynamo.
Dynamo 2.0 introduce il concetto di separazione del tipo di dati del dizionario dal tipo di dati dell'elenco. Questa modifica può portare a modifiche significative al modo in cui si creano e si utilizzano i dati nei workflow. Prima della versione 2.0, i dizionari e gli elenchi venivano combinati come tipo di dati. In breve, gli elenchi erano in realtà dizionari con chiavi di numeri interi.
Un dizionario è un tipo di dati composto da una raccolta di coppie chiave-valore, in cui ogni chiave è univoca in ogni raccolta. Un dizionario non ha un ordine e in pratica è possibile cercare elementi mediante una chiave anziché un valore di indice, come in un elenco. In Dynamo 2.0, le chiavi possono essere solo stringhe.
Un elenco è un tipo di dati composto da una raccolta di valori ordinati. In Dynamo, gli elenchi utilizzano numeri interi come valori di indice.
La separazione dei dizionari dagli elenchi introduce i dizionari come cittadino di prima classe che è possibile utilizzare per memorizzare e cercare i valori in modo semplice e rapido, senza dover ricordare un valore di indice o mantenere una struttura di elenchi rigorosa durante tutto il workflow. Durante i test degli utenti, è stata riscontrata una riduzione significativa della dimensione del grafico quando sono stati utilizzati dizionari anziché diversi nodi GetItemAtIndex
.
Sono state apportate modifiche alla sintassi che consentono di modificare la modalità di inizializzazione e utilizzo dei dizionari e degli elenchi nei blocchi di codice.
I dizionari utilizzano la seguente sintassi: {key:value}
.
Gli elenchi utilizzano la seguente sintassi: [value,value,value]
.
Nella libreria sono stati introdotti nuovi nodi per aiutare a creare, modificare o sottoporre a query i dizionari.
Gli elenchi creati nei blocchi di codice v1.x verranno migrati automaticamente al caricamento dello script nella nuova sintassi dell'elenco che utilizza parentesi quadre [ ]
anziché parentesi graffe { }
\.
Nel settore scientifico dei computer, i dizionari, come gli elenchi, sono raccolte di oggetti. Sebbene gli elenchi siano in un ordine specifico, i dizionari sono raccolte non ordinate. Non si basano su numeri sequenziali (indici), ma utilizzano chiavi.
Nella seguente immagine viene illustrato un caso di utilizzo potenziale di un dizionario. Spesso i dizionari vengono utilizzati per correlare due dati che potrebbero non avere una correlazione diretta. In questo caso, si sta collegando la versione spagnola di una parola alla versione inglese per una successiva ricerca.
Creare un dizionario per correlare i due dati.
Ottenere il valore con la chiave specificata.
Dynamo 2.0 non solo introduce i nodi descritti in precedenza per i dizionari, ma anche nei blocchi di codice per questo aspetto è disponibile una nuova funzionalità.
È possibile utilizzare la sintassi come illustrato di seguito o le rappresentazioni basate su DesignScript dei nodi.
Poiché un dizionario è un tipo di oggetto in Dynamo, è possibile eseguire il commit delle seguenti operazioni su di esso.
Il mantenimento di questo tipo di interazioni risulta particolarmente utile quando si correlano i dati di Revit alle stringhe. Successivamente, verranno esaminati alcuni casi di utilizzo di Revit.
Si è mai voluto cercare qualcosa in Revit a partire da un dato?
Se la risposta è affermativa, è stato fatto qualcosa di simile al seguente esempio.
Nell'immagine seguente si raccolgono tutti i locali nel modello di Revit, si ottiene l'indice del locale desiderato (per numero del locale) e infine si acquisisce il locale in corrispondenza dell'indice.
Raccogliere tutti i locali nel modello.
Specificare il numero del locale da trovare.
Ottenere il numero del locale e individuare l'indice in cui si trova.
Ottenere il locale in corrispondenza dell'indice.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Ora procedere ricreando questa idea utilizzando i dizionari. Innanzitutto, è necessario raccogliere tutti i locali nel modello di Revit.
Scegliere la categoria di Revit che si desidera utilizzare (in questo caso, i locali).
Si indicherà a Dynamo di raccogliere tutti questi elementi.
Successivamente, è necessario decidere quali chiavi utilizzare per la ricerca di questi dati. Per informazioni sulle chiavi, vedere la sezione Che cos'è un dizionario?.
I dati che verranno utilizzati sono il numero del locale.
Ora verrà creato il dizionario con le chiavi e gli elementi specificati.
Il nodo Dictionary.ByKeysValues creerà un dizionario a partire dagli input appropriati.
Keys
deve essere una stringa, mentrevalues
può essere diversi tipi di oggetto.
Infine, è possibile recuperare un locale dal dizionario con il relativo numero.
String
sarà la chiave utilizzata per cercare un oggetto nel dizionario.Dictionary.ValueAtKey consentirà ora di ottenere l'oggetto dal dizionario.
Utilizzando la stessa logica del dizionario, è possibile creare dizionari anche con oggetti raggruppati. Se si volessero cercare tutti i locali ad un determinato livello, è possibile modificare il grafico sopra come indicato di seguito.
Invece di utilizzare il numero del locale come chiave, è possibile utilizzare il valore di un parametro (in questo caso si utilizzerà il livello).
Ora è possibile raggruppare i locali in base al livello in cui risiedono.
Con gli elementi raggruppati per livello, è ora possibile utilizzare le chiavi condivise (chiavi univoche) come chiave per il dizionario e gli elenchi di locali come elementi.
Infine, utilizzando i livelli nel modello di Revit, è possibile cercare i locali che risiedono in tale livello nel dizionario.
Dictionary.ValueAtKey
recupererà il nome del livello e restituirà gli oggetti locale in corrispondenza di tale livello.
Le opportunità di utilizzo del dizionario sono davvero infinite. La possibilità di correlare i dati BIM in Revit all'elemento stesso offre diversi casi di utilizzo.
Dynamo offre molti nodi principali per un'ampia gamma di attività di programmazione visiva. A volte una soluzione più rapida, più elegante o più facilmente condivisa consiste nella creazione di nodi personalizzati. Questi possono essere riutilizzati tra diversi progetti, rendono i grafici più chiari e più ordinati, possono essere trasmessi a Package Manager e condivisi con la comunità di Dynamo globale.
È stato appena creato un nodo personalizzato ed è stato applicato ad un processo specifico nel grafico di Dynamo. E dato che questo nodo è ben riuscito, si desidera mantenerlo nella libreria di Dynamo come riferimento in altri grafici. Per eseguire questa operazione, il nodo verrà pubblicato localmente. Questo è un processo simile alla pubblicazione di un pacchetto, che sarà esaminata più in dettaglio nel prossimo capitolo.
Se si pubblica un nodo localmente, questo sarà accessibile nella libreria di Dynamo quando si apre una nuova sessione. Senza pubblicare un nodo, un grafico di Dynamo che fa riferimento ad un nodo personalizzato deve anche contenere tale nodo personalizzato nella relativa cartella (o il nodo personalizzato deve essere importato in Dynamo utilizzando File > Importa libreria).
È possibile pubblicare nodi e pacchetti personalizzati da Dynamo Sandbox nella versione 2.17 e successive, purché non presentino dipendenze API host. Nelle versioni precedenti, la pubblicazione di nodi e pacchetti personalizzati è abilitata solo in Dynamo for Revit e Dynamo for Civil 3D.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Procedere con il nodo personalizzato creato nella sezione precedente. Una volta aperto il nodo personalizzato PointsToSurface, viene visualizzato il grafico nell'Editor nodi personalizzati di Dynamo. È inoltre possibile aprire un nodo personalizzato facendovi doppio clic nell'editor dei grafici di Dynamo.
Per pubblicare un nodo personalizzato localmente, è sufficiente fare clic con il pulsante destro del mouse sull'area di disegno e selezionare Pubblica questo nodo personalizzato.
Compilare le informazioni pertinenti simili a quelle mostrate nell'immagine riportata sopra e selezionare Pubblica localmente. Notare che il campo Gruppo (facoltativo) definisce l'elemento principale accessibile dal menu di Dynamo.
Scegliere una cartella in cui memorizzare tutti i nodi personalizzati che si prevede di pubblicare localmente. In Dynamo viene controllata questa cartella ad ogni caricamento del programma, quindi verificare che si trovi in una posizione permanente. Individuare la cartella e scegliere Seleziona cartella. Il nodo di Dynamo viene ora pubblicato localmente e rimarrà nella libreria di Dynamo ogni volta che si carica il programma.
Per verificare il percorso della cartella dei nodi personalizzati, accedere a Dynamo > Preferenze > Impostazioni pacchetto > Percorsi di nodi e pacchetti.
In questa finestra viene visualizzato un elenco di percorsi.
Documents\DynamoCustomNodes... si riferisce alla posizione dei nodi personalizzati pubblicati localmente.
AppData\Roaming\Dynamo... si riferisce alla posizione di default dei pacchetti di Dynamo installati in linea.
È possibile spostare il percorso della cartella locale in basso nell'ordine dell'elenco (facendo clic sul percorso sulla freccia giù a sinistra dei nomi dei percorsi). La cartella superiore è il percorso di default per le installazioni di pacchetti. Pertanto, se si mantiene il percorso di installazione di default del pacchetto di Dynamo come cartella di default, i pacchetti in linea verranno separati dai nodi pubblicati localmente.
È stato cambiato l'ordine dei nomi dei percorsi in modo da avere il percorso di default di Dynamo come posizione di installazione del pacchetto.
Accedendo a questa cartella locale, è possibile trovare il nodo personalizzato originale nella cartella dyf, che è l'estensione del file di un nodo personalizzato di Dynamo. Si può modificare il file in questa cartella e il nodo verrà aggiornato nell'interfaccia utente. È inoltre possibile aggiungere altri nodi alla cartella DynamoCustomNodes principale. In Dynamo verranno aggiunti alla libreria al riavvio.
Dynamo ora viene caricato ogni volta con PointsToSurface nel gruppo DynamoPrimer della libreria di Dynamo.
Dopo aver creato alcuni nodi personalizzati, il passaggio successivo consiste nell'iniziare a organizzarli e pubblicarli tramite pacchetti, un modo pratico per memorizzare e condividere i nodi con la comunità di Dynamo.
Dynamo offre diversi metodi per la creazione di nodi personalizzati. È possibile creare nodi personalizzati da zero, da un grafico esistente o esplicitamente in C#. In questa sezione verrà descritta la creazione di un nodo personalizzato nell'interfaccia utente di Dynamo da un grafico esistente. Questo metodo è ideale per la pulizia dell'area di lavoro, nonché per la creazione di una sequenza di nodi da riutilizzare altrove.
Nell'immagine seguente, viene associato un punto da una superficie ad un'altra utilizzando le coordinate UV. Questo concetto verrà utilizzato per creare una superficie a pannelli che faccia riferimento alle curve nel piano XY. Qui verranno creati pannelli quadrangolari per la suddivisione in pannelli, ma utilizzando la stessa logica, è possibile creare una vasta gamma di pannelli con il mappaggio UV. Si tratta di un'ottima opportunità per lo sviluppo di nodi personalizzati perché si potrà ripetere più facilmente un processo simile in questo grafico o in altri workflow di Dynamo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Iniziare creando un grafico che si desidera nidificare in un nodo personalizzato. In questo esempio, verrà creato un grafico che associa i poligoni da una superficie di base ad una superficie di destinazione utilizzando le coordinate UV. Questo processo di mappaggio UV è un metodo utilizzato di frequente, il che lo rende un buon candidato per un nodo personalizzato. Per ulteriori informazioni sulle superfici e sullo spazio UV, fare riferimento alla pagina Superficie . Il grafico completo è UVmapping_Custom-Node.dyn dal file .zip scaricato in precedenza.
Code Block: utilizzare questa linea per creare un intervallo di 10 numeri compreso tra -45 e 45
45..45..#10;
.Point.ByCoordinates: collegare l'output di Code Block agli input x e y e impostare il collegamento su Globale. Ora dovrebbe essere presente una griglia di punti.
Plane.ByOriginNormal: collegare l'output Point all'input origin per creare un piano in corrispondenza di ciascuno dei punti. Verrà utilizzato il vettore normale di default (0,0,1).
Rectangle.ByWidthLength: collegare i piani del passaggio precedente all'input plane e utilizzare un Code Block con un valore di 10 per specificare la larghezza e la lunghezza.
Ora dovrebbe essere visibile una griglia di rettangoli. Associare questi rettangoli ad una superficie di destinazione utilizzando le coordinate UV.
Polygon.Points: collegare l'output Rectangle.ByWidthLength del passaggio precedente all'input polygon per estrarre i punti degli angoli di ogni rettangolo. Questi sono i punti che verranno associati alla superficie di destinazione.
Rectangle.ByWidthLength: utilizzare un Code Block con un valore di 100 per specificare la larghezza e la lunghezza di un rettangolo. Sarà il contorno della superficie di base.
Surface.ByPatch: collegare l'output Rectangle.ByWidthLength del passaggio precedente all'input closedCurve per creare una superficie di base.
Surface.UVParameterAtPoint: collegare l'output Point del nodo Polygon.Points e l'output Surface del nodo Surface.ByPatch per restituire il parametro UV in ogni punto.
Ora che sono presenti una superficie di base e un gruppo di coordinate UV, è possibile importare una superficie di destinazione e associare i punti tra le superfici.
File Path: selezionare il percorso del file della superficie che si desidera importare. Il tipo di file deve essere .SAT. Fare clic sul pulsante Sfoglia... e individuare il file UVmapping_srf.sat nel file .zip scaricato in precedenza.
Geometry.ImportFromSAT: collegare il percorso del file per importare la superficie. La superficie importata dovrebbe essere visualizzata nell'anteprima della geometria.
UV: collegare l'output del parametro UV ad un nodo UV.U e UV.V.
Surface.PointAtParameter: collegare la superficie importata, nonché le coordinate u e v. Ora dovrebbe essere visualizzata una griglia di punti 3D sulla superficie di destinazione.
Il passaggio finale consiste nell'utilizzare i punti 3D per costruire superfici di chiusura rettangolari.
PolyCurve.ByPoints: collegare i punti sulla superficie per costruire una PolyCurve attraverso i punti.
Boolean: aggiungere un valore Boolean all'area di lavoro e collegarlo all'input connectLastToFirst e attivare True per chiudere le PolyCurve. Ora dovrebbero essere visualizzati i rettangoli associati alla superficie.
Surface.ByPatch: collegare le PolyCurve all'input "closedCurve" per costruire superfici di chiusura.
A questo punto, selezionare i nodi che si desidera nidificare in un nodo personalizzato, pensando agli input e agli output del nodo stesso. Si desidera che il nodo personalizzato sia il più flessibile possibile, pertanto dovrebbe essere associabile ad eventuali poligoni, non solo ai rettangoli.
Selezionare i seguenti nodi (a partire da Polygon.Points), fare clic con il pulsante destro del mouse sull'area di lavoro e selezionare Crea nodo personalizzato.
Nella finestra di dialogo Proprietà nodo personalizzato, assegnare un nome, una descrizione e una categoria al nodo personalizzato.
Nome: MapPolygonsToSurface
Descrizione: mappare i poligoni da una base ad una superficie di destinazione
Categoria di Moduli aggiuntivi: Geometry.Curve
Il nodo personalizzato ha notevolmente ripulito l'area di lavoro. Notare che gli input e gli output sono stati denominati in base ai nodi originali. Modificare il nodo personalizzato per rendere i nomi più descrittivi.
Fare doppio clic sul nodo personalizzato per modificarlo. Verrà aperta un'area di lavoro con uno sfondo giallo che rappresenta l'interno del nodo.
Input: modificare i nomi di input in baseSurface e targetSurface.
Output: aggiungere un altro output ai poligoni associati.
Salvare il nodo personalizzato e tornare all'area di lavoro iniziale. Tenere presente che il nodo MapPolygonsToSurface riflette le modifiche appena apportate.
È inoltre possibile potenziare la robustezza del nodo personalizzato mediante l'aggiunta di commenti personalizzati. I commenti possono aiutare a visualizzare suggerimenti sui tipi di input e output o spiegare le funzionalità del nodo. I commenti vengono visualizzati quando l'utente posiziona il cursore del mouse su un input o un output di un nodo personalizzato.
Fare doppio clic sul nodo personalizzato per modificarlo. Verrà riaperta l'area di lavoro con lo sfondo giallo.
Iniziare a modificare il Code Block Input. Per iniziare a scrivere un commento, digitare "//" seguito dal testo del commento. Digitare tutto ciò che potrebbe essere utile per chiarire il nodo. Qui verrà descritto l'input targetSurface.
Definire inoltre il valore di default per inputSurface impostando il tipo di input uguale ad un valore. Qui, si imposterà il valore di default sul nodo Surface.ByPatch originale impostato.
I commenti possono essere applicati anche agli output.
Modificare il testo nel Code Block Output. Digitare "//" seguito dal testo del commento. Qui verranno chiariti gli output Polygons e surfacePatches aggiungendo una descrizione più approfondita.
Posizionare il cursore del mouse sugli input del nodo personalizzato per visualizzare i commenti.
Con il valore di default impostato su inputSurface, è inoltre possibile eseguire la definizione senza un input Surface.
Dynamo offre numerose funzionalità predefinite e dispone anche di un'ampia libreria di pacchetti in grado di estendere in modo significativo le sue potenzialità. Un pacchetto è una raccolta di nodi personalizzati o funzionalità aggiuntive. Dynamo Package Manager è un portale che consente alla comunità di scaricare qualsiasi pacchetto pubblicato online. Questi set di strumenti sono stati sviluppati da terze parti per estendere le funzionalità principali di Dynamo, sono accessibili a tutti e sono pronti per il download con un semplice clic.
Un progetto open source, come Dynamo, si basa su questo tipo di coinvolgimento della comunità. Grazie a sviluppatori di terze parti dedicati, Dynamo è in grado di estendere il suo ambito di applicazione ai workflow di diversi settori. Per questo motivo, il team di Dynamo ha compiuto sforzi concertati per snellire lo sviluppo e la pubblicazione dei pacchetti (che saranno discussi in modo più dettagliato nelle sezioni seguenti).
Il modo più semplice per installare un pacchetto consiste nell'utilizzare l'opzione di menu Pacchetti nell'interfaccia di Dynamo. Adesso si può passare direttamente al pacchetto e installarne uno. In questo esempio rapido, verrà installato un comune pacchetto per la creazione di pannelli quadrangolari su una griglia.
In Dynamo, accedere a Pacchetti > Package Manager.
Sulla barra di ricerca, cercare "quads from rettangular grid". Dopo alcuni minuti, si dovrebbero vedere tutti i pacchetti che corrispondono alla query di ricerca. Si desidera selezionare il primo pacchetto con il nome corrispondente.
Fare clic su Installa per aggiungere il pacchetto alla libreria, quindi accettare la conferma. Fatto.
Notare che ora è presente un altro gruppo nella libreria di Dynamo denominato "buildz". Questo nome si riferisce allo sviluppatore del pacchetto e il nodo personalizzato viene posizionato in questo gruppo. È possibile iniziare ad utilizzarlo immediatamente.
Utilizzare Code Block per definire rapidamente una griglia rettangolare, generare il risultato in un nodo Polygon.ByPoints, quindi in un nodo Surface.ByPatch per visualizzare l'elenco di pannelli rettangolari appena creati.
L'esempio riportato sopra si concentra su un pacchetto con un nodo personalizzato, ma si utilizza lo stesso processo per il download di pacchetti con diversi nodi personalizzati e file di dati di supporto. Ora si dimostrerà ciò con un pacchetto più completo: DynamoUnfold.
Come nell'esempio precedente, iniziare selezionando Pacchetti > Package Manager.
Questa volta, si cercherà "DynamoUnfold", una parola. Quando vengono visualizzati i pacchetti, scaricarli facendo clic su Installa per aggiungere DynamoUnfold alla libreria di Dynamo.
Nella libreria di Dynamo, è presente un gruppo DynamoUnfold con più categorie e nodi personalizzati.
Ora, si può dare un'occhiata alla struttura dei file del pacchetto.
Innanzitutto, accedere a Pacchetti > Package Manager > Pacchetti installati.
Quindi, fare clic su Mostra directory principale per aprire la cartella principale per questo pacchetto.
Verrà aperta la directory principale del pacchetto. Notare che sono presenti 3 cartelle e un file.
La cartella bin contiene i file .dll. Questo pacchetto di Dynamo è stato sviluppato utilizzando la funzionalità zero-touch, pertanto i nodi personalizzati sono contenuti in questa cartella.
La cartella dyf contiene i nodi personalizzati. Questo pacchetto non è stato sviluppato utilizzando nodi personalizzati di Dynamo, pertanto questa cartella è vuota per questo pacchetto.
La cartella extra contiene tutti i file aggiuntivi, inclusi i file di esempio.
Il file pkg è un file di testo di base che definisce le impostazioni del pacchetto. Lo si può ignorare per adesso.
Aprendo la cartella "extra", si notano alcuni file di esempio scaricati con l'installazione. Non tutti i pacchetti dispongono di file di esempio, ma è possibile trovarli se fanno parte di un pacchetto.
Aprire "SphereUnfold".
Dopo aver aperto il file e aver fatto clic su "Esegui" nel risolutore, è presente una sfera spiegata. File di esempio come questi sono utili per imparare ad utilizzare un nuovo pacchetto di Dynamo.
In Package Manager, è possibile cercare i pacchetti utilizzando le opzioni di ordinamento e filtraggio disponibili nella scheda Cerca pacchetti. Sono disponibili diversi filtri per il programma host, lo stato (nuovo, obsoleto o non obsoleto) e la presenza o meno di dipendenze nel pacchetto.
Ordinando i pacchetti, è possibile identificare i pacchetti più votati o più scaricati oppure trovare i pacchetti con aggiornamenti recenti.
È inoltre possibile accedere a ulteriori dettagli su ciascun pacchetto facendo clic su Visualizza dettagli. Viene aperto un pannello laterale in Package Manager, in cui è possibile trovare informazioni quali il confronto delle versioni e le dipendenze, l'URL del sito Web o del repository, le informazioni sulla licenza e così via.
Un altro modo per scoprire i pacchetti di Dynamo consiste nell'esplorare il sito Web di Dynamo Package Manager. Qui si possono trovare le statistiche sui pacchetti e le classifiche degli autori. È inoltre possibile scaricare i file di pacchetto da Dynamo Package Manager, ma eseguire questa operazione direttamente da Dynamo è un processo più agevole.
Se si desidera vedere dove vengono mantenuti i file di pacchetto, nella parte superiore del browser fare clic su Dynamo > Preferenze > Impostazioni pacchetto > Posizioni di nodi e pacchetti; da qui è possibile trovare la directory della cartella principale corrente.
Per default, i pacchetti vengono installati in una posizione simile a questo percorso delle cartelle: C:/Utenti/[nome utente]/AppData/Roaming/Dynamo/[versione di Dynamo].
La comunità di Dynamo è in costante crescita e in continua evoluzione. Esplorando di tanto in tanto Dynamo Package Manager, si noteranno alcuni nuovi e interessanti miglioramenti. Nelle seguenti sezioni, verranno esaminati in modo più approfondito i pacchetti, dalla prospettiva dell'utente finale fino al programmatore del pacchetto di Dynamo.
I nodi personalizzati vengono costruiti nidificando altri nodi e nodi personalizzati all'interno di un "nodo personalizzato di Dynamo", che è possibile immaginare concettualmente come un contenitore. Quando viene eseguito questo nodo contenitore nel grafico, tutto ciò che si trova all'interno verrà eseguito per consentire di riutilizzare e condividere una combinazione utile di nodi.
Quando nel grafico sono presenti più copie di un nodo personalizzato, è possibile aggiornarle tutte modificando il nodo personalizzato di base. Ciò consente di aggiornare il grafico in modo semplice adattandolo a eventuali modifiche che potrebbero verificarsi nel workflow o nella progettazione.
Probabilmente la migliore funzionalità dei nodi personalizzati è la loro capacità di condivisione del lavoro. Se un utente avanzato crea un grafico di Dynamo complesso e lo consegna ad un progettista che non conosce Dynamo, può condensare il grafico agli elementi essenziali per l'interazione progettuale. Il nodo personalizzato può essere aperto per modificare il grafico interno, ma il "contenitore" può essere mantenuto semplice. Con questo processo, i nodi personalizzati consentono agli utenti di Dynamo di progettare un grafico ordinato e intuitivo.
Esistono svariati modi per creare nodi personalizzati in Dynamo. Negli esempi riportati in questo capitolo, verranno creati nodi personalizzati direttamente dall'interfaccia utente di Dynamo. Se si è programmatori e si è interessati alla formattazione C# o zero-touch, è possibile fare riferimento a questa pagina nella Wiki di Dynamo per una revisione più approfondita.
Si passerà all'ambiente dei nodi personalizzati e si creerà un nodo semplice per calcolare una percentuale. L'ambiente dei nodi personalizzati è diverso dall'ambiente dei grafici di Dynamo, ma l'interazione è fondamentalmente la stessa. Detto questo, procedere creando il primo nodo personalizzato.
Per creare un nodo personalizzato da zero, avviare Dynamo e selezionare Nodo personalizzato oppure digitare CTRL+MAIUSC+N nell'area di disegno.
Assegnare un nome, una descrizione e una categoria nella finestra di dialogo Proprietà nodo personalizzato.
Nome: Percentage
Descrizione: Calculate the percentage of one value in relation to another
Categoria: Math.Functions
Verrà aperta un'area di disegno con uno sfondo giallo, ad indicare che si sta lavorando all'interno di un nodo personalizzato. In questa area di disegno è possibile accedere a tutti i nodi di Dynamo principali, nonché ai nodi Input e Output, che etichettano il flusso di dati in entrata e in uscita nel nodo personalizzato. Sono disponibili in Input>Basic.
Input: i nodi di input creano porte di input nel nodo personalizzato. La sintassi per un nodo di input è input_name : datatype = default_value(optional).
Output: simili agli input, creeranno e assegneranno nomi alle porte di output nel nodo personalizzato. È possibile aggiungere un commento personalizzato alle porte di input e output per inserire un suggerimento nei tipi Input e Output. Questo argomento è descritto più dettagliatamente nella sezione Creazione di nodi personalizzati.
È possibile salvare questo nodo personalizzato come file .dyf (anziché come file .dyn standard) e verrà aggiunto automaticamente alla sessione corrente e alle sessioni future. Il nodo personalizzato è reperibile nella libreria dalla sezione Add-ons.
Dopo aver creato il primo nodo personalizzato, nelle sezioni successive si approfondiranno la funzionalità dei nodi personalizzati e si spiegherà come pubblicare workflow generici. Nella seguente sezione verrà illustrato lo sviluppo di un nodo personalizzato che trasferisce la geometria da una superficie ad un'altra.
Dynamo Mesh Toolkit fornisce strumenti per importare mesh da formati di file esterni, creare mesh da oggetti della geometria di Dynamo e generare manualmente mesh in base ai vertici e agli indici. La libreria fornisce inoltre strumenti per modificare e correggere mesh o estrarre sezioni orizzontali da utilizzare nella fabbricazione.
Dynamo Mesh Toolkit fa parte del costante programma di ricerca sulle mesh di Autodesk e, come tale, continuerà a crescere nei prossimi anni. Si prevede di aggiungere frequentemente nuovi metodi nel toolkit e pertanto gli utenti sono invitati a contattare il team di Dynamo per eventuali commenti, bug e suggerimenti per le nuove funzionalità.
In Dynamo, accedere a Pacchetti > Package Manager... sulla barra dei menu superiore. Nel campo di ricerca, digitare MeshToolkit, tutta una parola. Fare clic su Installa e accettare le conferme per avviare il download. È semplicissimo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esempio, si esaminerà il nodo Intersect in Mesh Toolkit. Si importerà una mesh e la si intersecherà con una serie di piani di input per creare sezioni. Questo è il punto di partenza per la preparazione del modello per la fabbricazione su un taglierino laser, un taglierino a getto d'acqua o una fresa CNC.
Iniziare aprendo Mesh-Toolkit_Intersect-Mesh.dyn in Dynamo.
File Path: individuare il file mesh da importare (stanford_bunny_tri.obj). I tipi di file supportati sono .mix e .obj.
Mesh.ImportFile: collegare il percorso del file per importare la mesh.
Point.ByCoordinates: creare un punto, che sarà il centro di un arco.
Arc.ByCenterPointRadiusAngle: creare un arco attorno al punto. Questa curva verrà utilizzata per posizionare una serie di piani. __ Di seguito vengono descritte le impostazioni disponibili: __
radius: 40, startAngle: -90, endAngle:0
Creare una serie di piani orientati lungo l'arco.
Code Block: consente di creare 25 numeri compresi tra 0 e 1.
Curve.PointAtParameter: collegare l'arco all'input curve e l'output del blocco di codice all'input param per estrarre una serie di punti lungo la curva.
Curve.TangentAtParameter: collegare gli stessi input del nodo precedente.
Plane.ByOriginNormal: collegare i punti all'input origin e i vettori all'input normal per creare una serie di piani in corrispondenza di ogni punto.
Quindi, si utilizzeranno questi piani per intersecare la mesh.
Mesh.Intersect: intersecare i piani con la mesh importata, creando una serie di contorni di PolyCurve. Fare clic con il pulsante destro del mouse sul nodo e impostare il collegamento sul più lungo.
PolyCurve.Curves: dividere le PolyCurve nei relativi frammenti di curva.
Curve.EndPoint: estrarre i punti finali di ogni curva.
NurbsCurve.ByPoints: utilizzare i punti per costruire una curva NURBS. Utilizzare un nodo booleano impostato su True per chiudere le curve.
Prima di continuare, disattivare l'anteprima per alcuni nodi, ad esempio: Mesh.ImportFile, Curve.EndPoint, Plane.ByOriginNormal e Arc.ByCenterPointRadiusAngle per vedere meglio il risultato.
Surface.ByPatch: costruire superfici chiuse per ogni contorno per creare sezioni della mesh.
Aggiungere un secondo insieme di sezioni per un effetto di waffle/cassa delle uova.
Si potrebbe notare che le operazioni di intersezione vengono calcolate più rapidamente con una mesh rispetto ad un solido confrontabile. I workflow, come quello illustrato in questo esercizio, si prestano anche all'utilizzo delle mesh.
Accanto a DynamoUnfold, selezionare il menu delle opzioni .
Nel seguente esercizio sono illustrate alcune operazioni di base sulle mesh mediante Mesh Toolkit. Nell'esercizio, si interseca una mesh con una serie di piani, il che può risultare complesso dal punto di vista computazionale se si utilizzano solidi. A differenza di un solido, una mesh presenta una risoluzione impostata e non è definita matematicamente, ma topologicamente; è possibile definire questa risoluzione in base all'attività in corso. Per ulteriori dettagli sulle relazioni tra mesh e solidi, è possibile fare riferimento al capitolo di questa guida introduttiva. Per un esame più approfondito di Mesh Toolkit, è possibile fare riferimento alla Passare al pacchetto nell'esercizio riportato di seguito.
Dynamo offre diversi modi per creare un pacchetto per l'utilizzo personale o per la condivisione con la comunità di Dynamo. Nel case study riportato di seguito, si esaminerà in maniera dettagliata la configurazione di un pacchetto smontandone uno esistente. Questo case study si basa sulle lezioni del capitolo precedente, fornendo un gruppo di nodi personalizzati per il mappaggio della geometria, tramite le coordinate UV, da una superficie di Dynamo ad un'altra.
Si utilizzerà un pacchetto di esempio che mostra il mappaggio UV di punti da una superficie ad un'altra. Sono già stati illustrati i principi fondamentali dello strumento nella sezione Creazione di un nodo personalizzato di questa guida introduttiva. I file riportati di seguito mostrano com'è possibile prendere il concetto di mappaggio UV e sviluppare un set di strumenti per una libreria pubblicabile.
In questa immagine, si associa un punto da una superficie ad un'altra utilizzando le coordinate UV. Il pacchetto si basa su questo concetto, ma con una geometria più complessa.
Nel capitolo precedente, sono stati esaminati i metodi per la suddivisione di una superficie in pannelli in Dynamo in base alle curve definite nel piano XY. Questo case study estende questi concetti per altre quote della geometria. Si installerà questo pacchetto una volta creato per dimostrare com'è stato sviluppato. Nella sezione successiva, verrà illustrato come questo pacchetto è stato pubblicato.
In Dynamo, fare clic su Pacchetti > Package Manager e cercare il pacchetto "MapToSurface" (tutta una parola). Fare clic su Installa per avviare il download e aggiungere il pacchetto alla libreria.
Dopo l'installazione, i nodi personalizzati dovrebbero essere disponibili nella sezione Moduli aggiuntivi > DynamoPrimer.
Dopo aver installato il pacchetto, esaminarne in maniera dettagliata la configurazione.
Il pacchetto che si sta creando utilizza cinque nodi personalizzati che sono stati generati come riferimento. Si esaminerà in maniera dettagliata la funzione di ogni nodo di seguito. Alcuni nodi personalizzati si basano su altri nodi personalizzati e i grafici mostrano un layout per consentire ad altri utenti di comprendere ciò in maniera chiara.
Si tratta di un pacchetto semplice con cinque nodi personalizzati. Nei passaggi riportati di seguito, verrà descritta brevemente la configurazione di ogni nodo personalizzato.
È un nodo di base personalizzato e uno su cui sono basati tutti gli altri nodi di mappaggio. In sostanza, il nodo associa un punto da una coordinata UV della superficie di origine alla posizione della coordinata UV della superficie di destinazione. Poiché i punti sono la geometria più primitiva, dalla quale viene creata una geometria più complessa, è possibile utilizzare questa logica per associare la geometria 2D e persino 3D da una superficie ad un'altra.
La logica di estensione dei punti associati dalla geometria 1D alla geometria 2D è illustrata semplicemente con i poligoni qui. Notare che è stato nidificato il nodo PointsToSurface in questo nodo personalizzato. In questo modo è possibile associare i punti di ogni poligono alla superficie e quindi rigenerare il poligono da tali punti associati. Mantenendo la struttura dei dati appropriata (un elenco di elenchi di punti), è possibile mantenere i poligoni separati dopo averli ridotti ad un gruppo di punti.
La stessa logica si applica qui come nel nodo PolygonsToSurface. Invece di associare i punti poligonali, si stanno associando i punti di controllo di una curva NURBS.
OffsetPointsToSurface
Questo nodo risulta un po' più complesso, ma il concetto è semplice: come il nodo PointsToSurface, questo nodo associa i punti da una superficie ad un'altra. Tuttavia, considera anche i punti che non si trovano sulla superficie di origine originale, calcola la loro distanza dal parametro UV più vicino e associa questa distanza alla normale della superficie di destinazione nel punto della coordinata UV corrispondente. Ciò risulta più utile quando si esaminano i file di esempio.
Questo è un nodo semplice che crea una superficie parametrica da associare dalla griglia di origine ad una superficie ondulata nei file di esempio.
I file di esempio sono disponibili nella cartella principale del pacchetto. Fare clic su Package Manager > scheda Pacchetti installati.
Accanto a MapToSurface, fare clic sul menu con i puntini verticali > Mostra directory principale.
Quindi, aprire la cartella extra, che contiene tutti i file del pacchetto che non sono nodi personalizzati. Questo è il percorso in cui vengono memorizzati i file di esempio (se presenti) per i pacchetti di Dynamo. Nelle schermate riportate di seguito sono mostrati i concetti illustrati in ogni file di esempio.
Questo file di esempio illustra com'è possibile utilizzare PointsToSurface per eseguire la suddivisione di una superficie in pannelli in base ad una griglia di rettangoli. Questo processo dovrebbe risultare familiare, poiché è stato dimostrato un workflow simile nel capitolo precedente.
Utilizzando un workflow simile, questo file di esercizio mostra una configurazione per il mappaggio di cerchi (o poligoni che rappresentano cerchi) da una superficie ad un'altra. Viene utilizzato il nodo "PolygonsToSurface".
Questo file di esempio aggiunge una certa complessità utilizzando il nodo NurbsCrvToSurface. Viene eseguito l'offset della superficie di destinazione ad una determinata distanza e la curva NURBS viene associata alla superficie di destinazione originale e alla superficie di offset. Da qui, viene eseguito il loft delle due curve associate per creare una superficie, che viene poi ispessita. Questo solido risultante ha un'ondulazione che è rappresentativa delle normali della superficie di destinazione.
Questo file di esempio illustra come associare una PolySurface pieghettata da una superficie di origine ad una superficie di destinazione. La superficie di origine e quella di destinazione sono rispettivamente una superficie rettangolare che si estende sulla griglia e una superficie di rivoluzione.
Indica la PolySurface di origine associata dalla superficie di origine alla superficie di destinazione.
Poiché i nodi personalizzati sono in grado di associare diversi tipi di curve, quest'ultimo file fa riferimento ad un file SVG esportato da Illustrator e associa le curve importate ad una superficie di destinazione.
Analizzando la sintassi di un file .svg, le curve vengono convertite dal formato .xml nelle PolyCurve di Dynamo.
Le curve importate vengono associate ad una superficie di destinazione. Questo consente di progettare in modo esplicito (fare clic e puntare) una suddivisione in pannelli in Illustrator, importarla in Dynamo e applicarla ad una superficie di destinazione.
Dynamo per Revit estende il Building Information Modeling (BIM) con l'ambiente di dati e logica di un editor di algoritmi grafici. La sua flessibilità, abbinata ad un solido database di Revit, offre una nuova prospettiva per il BIM.
Questo capitolo si concentra sui workflow di Dynamo per il BIM. Le sezioni sono principalmente basate sugli esercizi, poiché il passaggio diretto ad un progetto è il modo migliore per acquisire familiarità con un editor di algoritmi grafici per il BIM. Ma occorre prima parlare degli inizi del programma.
Poiché sia Revit che Dynamo continuano ad evolvere, è possibile che la versione di Revit utilizzata non sia compatibile con la versione di Dynamo per Revit installata nel computer in uso. Di seguito sono descritte le versioni di Dynamo per Revit compatibili con Revit.
2013
2014
2015
2016
2017
2018
2019
2020
2.1.0 - Revit 2020 e versioni successive include ora Dynamo e riceve gli aggiornamenti come Revit.
N/A
Con un team dedicato di sviluppatori e una comunità appassionata, il progetto ne ha fatta di strada dalle sue umili origini.
Dynamo è stato originariamente creato per ottimizzare i workflow di AEC in Revit. Sebbene Revit crei un solido database per ogni progetto, può risultare difficile per un utente medio accedere a queste informazioni al di fuori dei vincoli dell'interfaccia. Revit ospita un'API (Application Program Interface) completa che consente agli sviluppatori di terze parti di creare strumenti personalizzati. I programmatori utilizzano questa API da anni, ma lo scripting basato su testo non è accessibile a tutti. In Dynamo si cerca di democratizzare i dati di Revit tramite un editor di algoritmi grafici accessibile.
Utilizzando i nodi di Dynamo principali in combinazione con quelli di Revit personalizzati, un utente può espandere in modo sostanziale i workflow parametrici per l'interoperabilità, la documentazione, l'analisi e la generazione. Con Dynamo noiosi workflow possono essere automatizzati, mentre esplorazioni della progettazione possono prosperare.
In un progetto o un editor di famiglie di Revit, individuare i moduli aggiuntivi e fare clic su Dynamo.*
*Dynamo verrà eseguito solo nel file in cui è stato aperto.
Quando si apre Dynamo in Revit, è presente una nuova categoria denominata Revit. Questa è un'aggiunta completa all'interfaccia utente che offre nodi specifici per i workflow di Revit.*
*Utilizzando la famiglia di nodi specifica di Revit, il grafico di Dynamo funzionerà solo durante l'apertura in Dynamo per Revit. Se, ad esempio, viene aperto un grafico di Dynamo per Revit in Dynamo Sandbox, i nodi di Revit risulteranno mancanti.
Poiché Revit è una piattaforma che offre una gestione affidabile dei progetti, le operazioni parametriche in Dynamo possono essere complesse e lente da calcolare. Se Dynamo richiede molto tempo per il calcolo dei nodi, è possibile utilizzare la funzionalità del nodo Congela per mettere in pausa l'esecuzione delle operazioni di Revit durante lo sviluppo del grafico.
È possibile leggere ulteriori informazioni sul congelamento dei nodi nella sezione Nodi e fili.
Poiché Dynamo è stato originariamente creato per AEC, la sua vasta e crescente comunità è una grande risorsa da cui imparare e per connettersi con gli esperti del settore. La comunità di Dynamo è composta da architetti, ingegneri, programmatori e progettisti che hanno tutti passione per la condivisione e la creazione.
Dynamo è un progetto open source in costante evoluzione e molti sviluppi sono correlati a Revit. Se non si conosce il programma, accedere al forum di discussione e iniziare a pubblicare domande. Se si è programmatori e si desidera essere coinvolti nello sviluppo di Dynamo, consultare il repository su Github. Inoltre, una risorsa eccezionale per le librerie di terze parti è Dynamo Package Manager. Molti di questi pacchetti sono stati concepiti per AEC e si darà uno sguardo a pacchetti di terze parti per la suddivisione in pannelli in questo capitolo.
Dynamo gestisce anche un blog attivo. Per scoprire gli ultimi sviluppi, leggere i post recenti.
/
/
/
Sebbene Dynamo sia un ambiente flessibile, progettato per il trasferimento in un'ampia gamma di programmi, è stato originariamente creato per l'utilizzo con Revit. Un programma visivo crea opzioni efficienti per il Building Information Modeling (BIM). Dynamo offre un'intera suite di nodi appositamente progettata per Revit, nonché librerie di terze parti provenienti da una vivace comunità AEC. Questo capitolo si concentra sulle nozioni di base per l'utilizzo di Dynamo in Revit.
Nelle sezioni precedenti, sono stati analizzati i dettagli su come il pacchetto MapToSurface è configurato con nodi personalizzati e file di esempio. Ma com'è possibile pubblicare un pacchetto che è stato sviluppato localmente? Questo case study mostra come pubblicare un pacchetto da un gruppo di file in una cartella locale.
Esistono diversi modi per pubblicare un pacchetto. Di seguito è riportato il processo consigliato: pubblicare localmente, sviluppare localmente, quindi pubblicare in linea. Si inizierà con una cartella contenente tutti i file del pacchetto.
Prima di passare alla pubblicazione del pacchetto MapToSurface, se il pacchetto è stato installato dalla lezione precedente, disinstallarlo in modo da non utilizzare pacchetti identici.
Iniziare accedendo a Pacchetti > Package Manager > scheda Pacchetti installati > accanto a MapToSurface, fare clic sul menu con i puntini verticali > Elimina.
Quindi riavviare Dynamo. Alla riapertura, quando si seleziona la finestra Gestisci pacchetti, MapToSurface non dovrebbe più essere presente. Ora si è pronti per cominciare dall'inizio.
È possibile pubblicare nodi e pacchetti personalizzati da Dynamo Sandbox nella versione 2.17 e successive, purché non presentino dipendenze API host. Nelle versioni precedenti, la pubblicazione di nodi e pacchetti personalizzati è abilitata solo in Dynamo for Revit e Dynamo for Civil 3D.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Questo è il primo invio per il pacchetto e tutti i file di esempio e i nodi personalizzati sono stati inseriti in una cartella. Una volta preparata questa cartella, è possibile caricarla in Dynamo Package Manager.
Questa cartella contiene cinque nodi personalizzati (.dyf).
Contiene inoltre cinque file di esempio (.dyn) e un file vettoriale importato (.svg). Questi file fungeranno da esercizi introduttivi per mostrare all'utente come utilizzare i nodi personalizzati.
In Dynamo, iniziare facendo clic su Pacchetti > Package Manager > scheda Pubblica nuovo pacchetto.
Nella scheda Pubblica un pacchetto, compilare i campi pertinenti sul lato sinistro della finestra.
Successivamente, verranno aggiunti i file di pacchetto. È possibile aggiungere i file uno ad una o intere cartelle selezionando Aggiungi directory (1). Per aggiungere file che non sono in formato .dyf, assicurarsi di modificare il tipo di file nella finestra del browser in "Tutti i file (.)". Notare che verrà aggiunto indistintamente ogni file, il nodo personalizzato (.dyf) o il file di esempio (.dyn). Dynamo consentirà di suddividere questi elementi quando si pubblica il pacchetto.
Dopo aver selezionato la cartella MapToSurface, Package Manager ne mostra il contenuto. Se si sta caricando un pacchetto personalizzato con una struttura di cartelle complessa e non si desidera che Dynamo apporti modifiche a tale struttura, è possibile attivare il pulsante di commutazione Mantieni struttura delle cartelle. Questa opzione è destinata agli utenti avanzati; se il pacchetto non è stato appositamente impostato in un modo specifico, è consigliabile lasciare disattivato questo pulsante di commutazione e consentire a Dynamo di organizzare i file in base alle esigenze. Fare clic su Avanti per continuare.
Qui, è possibile visualizzare un'anteprima di come Dynamo organizzerà i file di pacchetto prima della pubblicazione. Fare clic su Fine per continuare.
Pubblicare facendo clic su Pubblica localmente (1). Se si sta seguendo questa procedura, assicurarsi di fare clic su Pubblica localmente e non Pubblica in linea per evitare di creare un gruppo di pacchetti duplicati in Package Manager.
Dopo la pubblicazione, i nodi personalizzati devono essere disponibili nel gruppo "DynamoPrimer" o nella libreria di Dynamo.
Ora osservare la directory principale per vedere in che modo Dynamo ha formattato il pacchetto appena creato. A tale scopo, accedere alla scheda Pacchetti installati > accanto a MapToSurface, fare clic sul menu con i puntini verticali > selezionare Mostra directory principale.
Si noti che la directory principale si trova nella posizione locale del pacchetto (tenere presente che il pacchetto è stato pubblicato "localmente"). Dynamo fa attualmente riferimento a questa cartella per la lettura di nodi personalizzati. È pertanto importante pubblicare la directory localmente in una posizione di cartella permanente (ad esempio, non sul desktop). Di seguito è riportata la suddivisione delle cartelle del pacchetto di Dynamo.
La cartella bin contiene i file .dll creati con le librerie C# o zero-touch. Non sono disponibili per questo pacchetto, pertanto questa cartella è vuota per questo esempio.
La cartella dyf contiene i nodi personalizzati. Se si apre questa finestra, verranno visualizzati tutti i nodi personalizzati (file .dyf) per questo pacchetto.
La cartella extra contiene tutti i file aggiuntivi. Questi file probabilmente saranno file di Dynamo (.dyn) o eventuali file aggiuntivi richiesti (.svg, .xls, .jpeg, .sat, ecc.).
Il file pkg è un file di testo di base che definisce le impostazioni del pacchetto. Questa opzione è automatica in Dynamo, ma può essere modificata se si desidera accedere ai dettagli.
Nota Seguire questa procedura solo se si sta effettivamente pubblicando un pacchetto personalizzato.
Quando si è pronti per la pubblicazione, nella finestra Pacchetti > Package Manager > Pacchetti installati, selezionare il pulsante a destra del pacchetto che si desidera pubblicare e scegliere Pubblica.
Se si sta aggiornando un pacchetto già pubblicato, scegliere Pubblica versione. Dynamo aggiornerà il pacchetto in linea in base ai nuovi file nella directory principale del pacchetto. È semplicissimo.
Quando si aggiornano i file nella cartella principale del pacchetto pubblicato, è anche possibile pubblicare una nuova versione del pacchetto selezionando Pubblica versione... nella finestra Pacchetti personali. Questo è un modo semplice per apportare gli aggiornamenti necessari al contenuto e condividerli con la comunità. Pubblica versione funziona solo se si è il gestore del pacchetto.
Sebbene Dynamo sia stato originariamente creato pensando a Revit, la sua versatilità come strumento di programmazione visiva va oltre Revit. Dynamo è integrato anche in Civil 3D, consentendo agli utenti di creare potenti routine di automazione per i progetti di infrastrutture civili. È uno strumento estremamente utile per elaborare qualsiasi cosa, dalle attività più comuni ai workflow di progettazione più complessi, aiutando a risparmiare tempo, ottimizzare i progetti e prendere decisioni migliori. Dynamo offre un'intera suite di nodi appositamente progettata per Civil 3D, nonché librerie di terze parti provenienti da una vivace comunità.
Questo capitolo della Guida introduttiva si concentrerà su Dynamo for Civil 3D, partendo dalle nozioni di base e arrivando ad argomenti più avanzati.
L'importazione zero-touch si riferisce a un semplice metodo di puntamento e clic per l'importazione di librerie C#. Dynamo consentirà di leggere i metodi pubblici di un file .dll e di convertirli in nodi di Dynamo. È possibile utilizzare la funzione zero-touch per sviluppare nodi e pacchetti personalizzati e per importare librerie esterne nell'ambiente di Dynamo.
File DLL
Nodi di Dynamo
Con la funzione zero-touch, è possibile infatti importare una libreria che non è stata necessariamente sviluppata per Dynamo e creare una suite di nuovi nodi. La funzionalità zero-touch corrente dimostra la mentalità multipiattaforma del progetto di Dynamo.
In questa sezione è illustrato come utilizzare la funzione zero-touch per importare una libreria di terze parti. Per informazioni sullo sviluppo della propria libreria zero-touch, fare riferimento alla pagina Wiki di Dynamo.
I pacchetti zero-touch sono un buon complemento ai nodi personalizzati definiti dall'utente. Nella tabella riportata di seguito sono elencati alcuni pacchetti che utilizzano le librerie C#. Per informazioni più dettagliate sui pacchetti, visitare la sezione dei pacchetti dell'Appendice.
Logo/Immagine
Nome
In questo case study, sarà mostrato come importare la libreria AForge .dll esterna. AForge è una solida libreria che offre una vasta gamma di funzionalità, dall'elaborazione delle immagini all'intelligenza artificiale. Verrà fatto riferimento alla classe di immagini in AForge per eseguire alcuni esercizi di elaborazione delle immagini riportati di seguito.
Per iniziare, scaricare AForge. Nella pagina di download di AForge, selezionare [Download Installer] ed eseguire l'installazione dopo il completamento del download.
In Dynamo, creare un nuovo file e selezionare File > Importa libreria.
Quindi, individuare il file .dll.
Nella finestra a comparsa, accedere alla cartella Release nella directory di installazione di AForge. Probabilmente si troverà in una cartella simile a quella seguente: C:\Programmi (x86)\AForge.NET\Framework\Release.
AForge.Imaging.dll: per questo case study si desidera utilizzare solo questo file della libreria AForge. Selezionare questo file .dll e fare clic su Apri.
Tornando a Dynamo, dovrebbe essere visualizzato un gruppo di nodi AForge aggiunto alla Libreria. Ora è possibile accedere alla libreria delle immagini AForge dal programma visivo in uso.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Ora che la libreria è stata importata, questo primo esercizio consentirà di iniziare con facilità (01-EdgeDetection.dyn). Per mostrare come applicare i filtri alle immagini AForge, si procederà con l'elaborazione di base di un'immagine di esempio. Verrà utilizzato il nodo Watch Image per mostrare i risultati e applicare i filtri in Dynamo in modo simile a quelli in Photoshop
Aggiungere un nodo File Path all'area di disegno e selezionare "soapbubbles.jpg" dalla cartella degli esercizi scaricati (credito fotografico: flickr).
Il nodo File Path fornisce semplicemente una stringa del percorso dell'immagine selezionata. Successivamente, è necessario convertirla in un file di immagine utilizzabile in Dynamo.
Utilizzare File From Path per convertire l'elemento del percorso del file in un'immagine nell'ambiente di Dynamo.
Collegare il nodo File Path al nodo File.FromPath.
Per convertire questo file in un'immagine, utilizzare il nodo Image.ReadFromFile.
Infine, osservare il risultato. Rilasciare un nodo Watch Image nell'area di disegno e collegarlo a Image.ReadFromFile. Non è stato ancora utilizzato AForge, ma è stata importata correttamente un'immagine in Dynamo.
In AForge.Imaging.AForge.Imaging.Filters (nel menu di navigazione), si noterà che è disponibile una vasta gamma di filtri. Ora si utilizzerà uno di questi filtri per desaturare un'immagine in base ai valori soglia.
Rilasciare tre dispositivi di scorrimento nell'area di disegno, modificarne gli intervalli in modo che siano compresi tra 0 e 1 e i valori di incremento corrispondenti in modo che siano 0.01.
Aggiungere il nodo Grayscale.Grayscale all'area di disegno. Si tratta di un filtro di AForge che applica un filtro della scala di grigi ad un'immagine. Collegare i tre dispositivi di scorrimento del punto 1 a cr, cg e cb. Modificare i dispositivi di scorrimento superiore e inferiore in modo che il valore 1 e il dispositivo di scorrimento centrale abbiano un valore pari a 0.
Per applicare il filtro Grayscale, è necessario eseguire un'azione sull'immagine. Per questo, viene utilizzato BaseFilter.Apply. Collegare l'immagine all'input image e Grayscale.Grayscale all'input baseFilter.
Collegandola ad un nodo Watch Image, viene visualizzata un'immagine desaturata.
Si può avere il controllo su come desaturare questa immagine in base ai valori soglia per rosso, verde e blu. Questi vengono definiti dagli input nel nodo Grayscale.Grayscale. Notare che l'immagine risulta abbastanza attenuata perché il valore verde è impostato su 0 nel dispositivo di scorrimento.
Modificare i dispositivi di scorrimento superiore e inferiore in modo che il valore 0 e il dispositivo di scorrimento centrale abbiano un valore pari a 1. In questo modo, si ottiene un'immagine desaturata più leggibile.
Utilizzare l'immagine desaturata e applicarvi un altro filtro. L'immagine desaturata presenta un certo livello di contrasto, quindi si cercherà di verificare il rilevamento degli spigoli.
Aggiungere un nodo SobelEdgeDetector.SobelEdgeDetector all'area di disegno.
Collegarlo a BaseUsingCopyPartialFilter.Apply e collegare l'immagine desaturata all'input image di questo nodo.
SobelEdgeDetector ha evidenziato gli spigoli in una nuova immagine.
Se si esegue lo zoom avanti, il rilevamento degli spigoli ha richiamato i contorni delle bolle con i pixel. La libreria AForge dispone di strumenti per ottenere risultati simili a questi e creare la geometria di Dynamo. Verranno descritti nel prossimo esercizio.
Dopo aver introdotto alcune operazioni di base per l'elaborazione di immagini, si utilizzerà un'immagine per gestire la geometria di Dynamo. A livello elementare, in questo esercizio si intende eseguire una "traccia dal vivo" di un'immagine utilizzando AForge e Dynamo. Si tratta di un esercizio semplice in cui vengono estratti rettangoli da un'immagine di riferimento, ma sono disponibili strumenti in AForge per operazioni più complesse. Si utilizzerà 02-RectangleCreation.dyn dei file degli esercizi scaricati.
Con il nodo File Path, accedere a grid.jpg nella cartella degli esercizi.
Collegare le serie rimanenti di nodi riportati sopra per mostrare una griglia parametrica dell'itinerario.
Nel passaggio successivo, si desidera fare riferimento ai quadrati bianchi presenti nell'immagine e convertirli nella geometria di Dynamo effettiva. AForge dispone di molti potenti strumenti di visione artificiale. Si utilizzerà uno strumento particolarmente importante per la libreria chiamato BlobCounter.
Dopo aver aggiunto uno strumento BlobCounter all'area di disegno, è necessario un modo per elaborare l'immagine (simile allo strumento BaseFilter.Apply nell'esercizio precedente).
Purtroppo il nodo Process Image non è immediatamente visibile nella libreria di Dynamo. Ciò è dovuto al fatto che la funzione potrebbe non essere visibile nel codice sorgente di AForge. Per risolvere questo problema, occorrerà trovare una soluzione alternativa.
Aggiungere un nodo Python all'area di disegno e aggiungere il seguente codice al nodo Python. Questo codice importa la libreria AForge, quindi elabora l'immagine importata.
Collegando l'output image all'input del nodo Python, si ottiene un risultato AForge.Imaging.BlobCounter dal nodo Python.
Nei passaggi successivi sono illustrati alcuni suggerimenti che dimostrano familiarità con l'API di creazione delle immagini AForge. Non è necessario apprenderli tutti per far funzionare Dynamo. È qualcosa di più di una dimostrazione dell'utilizzo delle librerie esterne con tutta la flessibilità dell'ambiente Dynamo.
Collegare l'output dello script di Python a BlobCounterBase.GetObjectRectangles. In questo modo vengono letti gli oggetti in un'immagine, in base ad un valore soglia, e vengono estratti rettangoli quantificati dallo spazio in pixel.
Aggiungendo un altro nodo Python all'area di disegno, collegarlo a GetObjectRectangles e immettere il codice riportato di seguito. Così verrà creato un elenco organizzato di oggetti di Dynamo.
Trasporre l'output del nodo Python del passaggio precedente. Vengono creati quattro elenchi, ciascuno dei quali rappresenta X, Y, larghezza e altezza per ciascun rettangolo.
Utilizzando Code Block, organizzare i dati in una struttura che contiene il nodo Rectangle.ByCornerPoints (codice riportato di seguito).
È presente una serie di rettangoli che rappresentano i quadrati bianchi presenti nell'immagine. Attraverso la programmazione, è stato fatto qualcosa (all'incirca) simile a una traccia dal vivo in Illustrator.
Tuttavia, occorre ancora fare un po' di ordine. Se si esegue lo zoom avanti, è possibile vedere che sono presenti alcuni piccoli rettangoli indesiderati.
Successivamente, verranno scritti dei codici per eliminare i rettangoli indesiderati.
Inserire un nodo Python tra il nodo GetObjectRectangles e un altro nodo Python. Il codice del nodo è riportato di seguito e rimuove tutti i rettangoli che si trovano al di sotto di una determinata dimensione.
Con i rettangoli superflui eliminati, solo per divertimento, creare una superficie da questi rettangoli ed estruderli ad una distanza basata sulle loro aree.
Infine, modificare l'input both_sides in false; si ottiene un'estrusione in una direzione. Immergendo questo elemento nella resina, si ottiene un tavolo di design.
Questi sono esempi di base, ma i concetti qui delineati sono trasferibili a straordinarie applicazioni reali. La visione artificiale può essere utilizzata per un'intera serie di processi. Per citarne alcuni: lettori di codici a barre, corrispondenza della prospettiva, mappatura della proiezione e realtà aumentata. Per argomenti più avanzati su AForge correlati a questo esercizio, leggere questo articolo.
Revit è un ambiente ricco di dati. Offre un'ampia gamma di funzionalità di selezione che va oltre il semplice "puntamento e clic". È possibile eseguire una query sul database di Revit e collegare dinamicamente gli elementi di Revit alla geometria di Dynamo durante l'esecuzione di operazioni parametriche.
La libreria di Revit nell'interfaccia utente offre la categoria Selection, che consente di selezionare la geometria in più modi.
Per selezionare correttamente gli elementi di Revit, è importante comprendere a fondo la gerarchia degli elementi di Revit. Si desidera selezionare tutti i muri di un progetto? Selezionarli per categoria. Si desidera selezionare ogni sedia Eames nel moderno ingresso di metà secolo? Selezionarla per famiglia.
Eseguire una rapida revisione della gerarchia di Revit.
Vi ricordate la tassonomia in biologia? Regno, phylum, classe, ordine, famiglia, genere, specie? Gli elementi di Revit vengono suddivisi in categorie simili. Ad un livello di base, la gerarchia di Revit può essere suddivisa in categorie, famiglie, tipi* e istanze. Un'istanza è un singolo elemento del modello (con un ID univoco), mentre una categoria definisce un gruppo generico (ad esempio "muri" o "pavimenti"). Con il database di Revit organizzato in questo modo, è possibile selezionare un elemento e scegliere tutti gli elementi simili in base al livello specificato nella gerarchia.
*I tipi in Revit vengono definiti in modo diverso dai tipi della programmazione. In Revit, un tipo fa riferimento ad un ramo della gerarchia, anziché ad un "tipo di dati".
Nelle tre immagini riportate di seguito sono mostrate le categorie principali per la selezione di elementi di Revit in Dynamo. Si tratta di strumenti straordinari da utilizzare in combinazione e alcuni di questi strumenti verranno esaminati negli esercizi seguenti.
Puntamento e clic è il modo più semplice per selezionare direttamente un elemento di Revit. È possibile selezionare un elemento del modello completo o parti della relativa topologia (ad esempio una superficie o un bordo). Questo rimane collegato dinamicamente a tale oggetto di Revit, pertanto quando il file di Revit ne aggiorna la posizione o i parametri, l'elemento di Dynamo di riferimento viene aggiornato nel grafico.
I menu a discesa consentono di creare un elenco di tutti gli elementi accessibili in un progetto di Revit. È possibile utilizzare questa opzione per fare riferimento ad elementi di Revit che non sono necessariamente visibili in una vista. Questo è un ottimo strumento per eseguire una query su elementi esistenti o crearne di nuovi in un Editor di famiglie o in un progetto di Revit.
![](../.gitbook/assets/selecting _database_navigation_with_dynamo_nodes_02.png)
È inoltre possibile selezionare un elemento di Revit in base a livelli specifici nella gerarchia di Revit. Si tratta di un'opzione potente per la personalizzazione di grandi serie di dati in preparazione della documentazione o della creazione di istanze generative e della personalizzazione.
Tenendo presenti le tre immagini riportate sopra, si esaminerà un esercizio che consente di selezionare elementi da un progetto di Revit di base in preparazione delle applicazioni parametriche che verranno create nelle sezioni restanti di questo capitolo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo file di Revit di esempio, ci sono tre tipi di elementi di un semplice edificio. Si utilizzerà questo file come esempio per la selezione di elementi di Revit nel contesto della gerarchia di Revit.
Massa dell'edificio
Travi (telaio strutturale)
Travi reticolari (componenti adattivi)
Quali conclusioni è possibile trarre dagli elementi attualmente presenti nella vista di progetto di Revit? E di quanti livelli nella gerarchia occorre scendere per selezionare gli elementi appropriati? Naturalmente, questa operazione diventerà un'attività più complessa quando si lavora ad un progetto di grandi dimensioni. Sono disponibili numerose opzioni: è possibile selezionare elementi per categorie, livelli, famiglie, istanze e così via.
Poiché si sta utilizzando un'impostazione di base, selezionare la massa dell'edificio scegliendo Massa nel nodo a discesa Categories. Questo file si trova nella scheda Revit > Selezione.
L'output della categoria Massa è solo la categoria stessa. È necessario selezionare gli elementi. A tale scopo, utilizzare il nodo All Elements of Category.
A questo punto, non sarà presente alcuna geometria in Dynamo. È stato selezionato un elemento di Revit, ma l'elemento non è stato convertito nella geometria di Dynamo. Si tratta di una separazione importante. Se si selezionano numerosi elementi, si sconsiglia di visualizzarne l'anteprima in Dynamo, in quanto ciò rallenterebbe le prestazioni del sistema. Dynamo è uno strumento per gestire un progetto di Revit senza necessariamente eseguire operazioni di geometria. Ciò sarà descritto nella sezione successiva di questo capitolo.
In questo caso, si sta utilizzando una geometria semplice, pertanto si desidera importare la geometria nell'anteprima di Dynamo. Accanto al valore BldgMass nel nodo di controllo riportato sopra è presente un numero verde. Rappresenta l'ID dell'elemento e indica che si sta utilizzando un elemento di Revit, non la geometria di Dynamo. Il passaggio successivo consiste nel convertire questo elemento di Revit nella geometria in Dynamo.
Utilizzando il nodo Element.Faces, viene visualizzato un elenco di superfici che rappresentano ciascuna superficie della massa di Revit. Ora è possibile vedere la geometria nella finestra di Dynamo e iniziare a fare riferimento alla superficie per le operazioni parametriche.
Ecco un metodo alternativo. In questo caso, non si esegue la selezione tramite la gerarchia di Revit (All Elements of Category) e si sceglie di selezionare esplicitamente la geometria in Revit.
Utilizzando il nodo Select Model Element, fare clic sul pulsante *Seleziona *(o Modifica). Nella finestra di Revit, selezionare l'elemento desiderato. In questo caso, selezionare la massa dell'edificio.
Anziché Element.Faces, è possibile selezionare l'intera massa come geometria solida utilizzando Element.Geometry. In questo modo viene selezionata tutta la geometria contenuta all'interno della massa.
Utilizzando Geometry.Explode è possibile ottenere di nuovo l'elenco delle superfici. Questi due nodi funzionano allo stesso modo di Element.Faces, ma offrono opzioni alternative per fare ricerche nella geometria di un elemento di Revit.
Utilizzando alcune operazioni di base con gli elenchi, è possibile eseguire una query su una superficie di interesse.
Innanzitutto, generare gli elementi selezionati da una versione precedente al nodo Element.Faces.
Quindi, utilizzare il nodo List.Count per mostrare che si stanno utilizzando 23 superfici nella massa.
Facendo riferimento a questo numero, è possibile modificare il valore massimo di *Integer Slider *in 22.
Utilizzando List.GetItemAtIndex, immettere gli elenchi e dei valori in *Integer Slider * per index. Scorrendo il dispositivo con l'elemento selezionato, fermarsi quando si ottiene index 9 e viene isolata la facciata principale che ospita le travi reticolari.
Il passaggio precedente era un po' complicato. È possibile eseguire questa operazione molto più rapidamente con il nodo Select Face. Questo consente di isolare una superficie che di per sé non è un elemento nel progetto di Revit. La stessa interazione si applica a Select Model Element, tranne per il fatto che è stata selezionata la superficie anziché l'elemento completo.
Si supponga di voler isolare i muri della facciata principale dell'edificio. Per eseguire questa operazione, è possibile utilizzare il nodo Select Faces. Fare clic sul pulsante Seleziona, quindi selezionare le quattro facciate principali in Revit.
Dopo aver selezionato i quattro muri, assicurarsi di fare clic sul pulsante Termina in Revit.
Le facce vengono ora importate in Dynamo come superfici.
Ora, osservare le travi sopra l'atrio.
Utilizzando il nodo Select Model Element, selezionare una delle travi.
Collegare l'elemento trave al nodo Element.Geometry, così ora la trave è presente nella finestra di Dynamo.
È possibile eseguire lo zoom avanti della geometria con un nodo Watch3D. Se la trave non è visibile in Watch3D, fare clic con il pulsante destro del mouse e selezionare Adatta alla finestra.
Una domanda che potrebbe sorgere spesso nei workflow di Revit/Dynamo: com'è possibile selezionare un elemento e ottenere tutti gli elementi simili? Poiché l'elemento di Revit selezionato contiene tutte le relative informazioni gerarchiche, è possibile eseguire una query sul tipo di famiglia e selezionare tutti gli elementi di quel tipo.
Collegare l'elemento trave ad un nodo Element.ElementType.
Il nodo Watch mostra che l'output è ora un simbolo di famiglia anziché un elemento di Revit.
Element.ElementType è una query semplice, così è possibile eseguire questa operazione in Code Block con la stessa facilità di
x.ElementType;
e ottenere gli stessi risultati.
Per selezionare le travi rimanenti, utilizzare il nodo All Elements of Family Type.
Il nodo di controllo mostra che sono stati selezionati cinque elementi di Revit.
È possibile convertire anche tutti questi cinque elementi nella geometria di Dynamo.
In ogni caso, se si dovessero importare 500 travi, sono necessarie tutte le superfici per eseguire l'operazione parametrica desiderata? Oppure è possibile estrarre le informazioni di base dalle travi ed eseguire attività generative con la geometria fondamentale? Questa è una domanda che verrà tenuta a mente mentre si procede in questo capitolo. Ad esempio, osservare il sistema di travi reticolari successivo.
Utilizzando lo stesso grafico dei nodi, selezionare l'elemento trave reticolare anziché l'elemento trave. Prima di eseguire questa operazione, eliminare il nodo Element.Geometry del passaggio precedente.
A questo punto, è possibile estrarre alcune informazioni di base dal tipo di famiglia di travi reticolari.
Nel nodo Watch è presente un elenco di componenti adattivi selezionati da Revit. Si desidera estrarre le informazioni di base, quindi si inizia con i punti adattivi.
Collegare il nodo All Elements of Family Type al nodo AdaptiveComponent.Location. In questo modo si ottiene un elenco di elenchi, ciascuno con tre punti che rappresentano le posizioni dei punti adattivi.
Il collegamento di un nodo Polygon.ByPoints restituisce una PolyCurve. Questo è visibile nella finestra di Dynamo. Con questo metodo, è stata visualizzata la geometria di un elemento ed è stata astratta la geometria della serie rimanente di elementi (che potrebbe essere maggiore di numero rispetto a questo esempio).
Suggerimento Se si fa clic sul numero verde di un elemento di Revit in Dynamo, la finestra di Revit eseguirà lo zoom di tale elemento.
La modifica dei parametri per la documentazione segue le lezioni apprese nelle sezioni precedenti. In questa sezione verrà esaminata la modifica dei parametri che non hanno effetto sulle proprietà geometriche di un elemento, ma piuttosto si prepara un file di Revit per la documentazione.
Nell'esercizio riportato di seguito, verrà utilizzata una deviazione di base dal nodo del piano per creare una tavola di Revit per la documentazione. Ogni pannello della struttura del tetto definita in modo parametrico ha un valore diverso per la deviazione e si desidera chiamare l'intervallo di valori utilizzando il colore e includendo nell'abaco i punti adattivi da consegnare ad un consulente per le facciate, un ingegnere o un appaltatore.
La deviazione dal nodo del piano calcolerà la distanza con cui l'insieme di quattro punti varia dal piano di adattamento tra di loro. Questo è un modo rapido e semplice per studiare l'edificabilità.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Iniziare con il file di Revit per questa sezione (o continuare dalla sezione precedente). Questo file presenta una serie di pannelli ETFE sul tetto. Per questo esercizio, si farà riferimento a questi pannelli.
Aggiungere un nodo Family Types all'area di disegno e scegliere ROOF-PANEL-4PT.
Collegare il nodo ad un nodo di selezione All Elements of Family Type per caricare tutti gli elementi da Revit in Dynamo.
Eseguire una query sulla posizione dei punti adattivi per ogni elemento con il nodo AdaptiveComponent.Locations.
Creare un poligono da questi quattro punti con il nodo Polygon.ByPoints. Notare che ora è disponibile una versione astratta del sistema con pannelli in Dynamo senza dover importare la geometria completa dell'elemento di Revit.
Calcolare la deviazione planare con il nodo Polygon.PlaneDeviation.
Per divertimento, come nell'esercizio precedente, impostare il rapporto di apertura di ogni pannello in base alla sua deviazione planare.
Aggiungere un nodo Element.SetParameterByName all'area di disegno e collegare i componenti adattivi all'input element. Collegare un Code Block che riporta Aperture Ratio all'input parameterName.
Non è possibile collegare direttamente i risultati della deviazione all'input value perché è necessario riassociare i valori all'intervallo di parametri.
Utilizzando Math.RemapRange, riassociare i valori di deviazione ad un dominio compreso tra 0.15 e 0_._45 immettendo
0.15; 0.45;
nel Code Block.Collegare questi risultati all'input value per Element.SetParameterByName.
Tornando in Revit, è possibile in un certo senso sfruttare la modifica dell'apertura sulla superficie.
Eseguendo lo zoom avanti, diventa più chiaro che i pannelli chiusi sono ponderati verso gli angoli della superficie. Gli angoli aperti sono verso la parte superiore. Gli angoli rappresentano aree di maggiore deviazione mentre la bombatura ha una curvatura minima, pertanto ciò è utile.
L'impostazione del rapporto di apertura non mostra chiaramente la deviazione dei pannelli sul tetto; inoltre si sta modificando la geometria dell'elemento effettivo. Si supponga di voler semplicemente studiare la deviazione dal punto di vista della fattibilità della fabbricazione. Sarebbe utile colorare i pannelli in base all'intervallo di deviazione per la documentazione. È possibile farlo con la serie di passaggi riportata di seguito e con un processo molto simile a quello descritto sopra.
Rimuovere Element.SetParameterByName e i relativi nodi di input e aggiungere Element.OverrideColorInView.
Aggiungere un nodo Color Range all'area di disegno e collegarlo all'input color di Element.OverrideColorInView. Per creare la sfumatura, è ancora necessario collegare i valori della deviazione all'intervallo di colori.
Posizionando il cursore del mouse sull'input value, è possibile vedere che i valori per l'input devono essere compresi tra 0 e 1 per assegnare un colore a ciascun valore. È necessario riassociare i valori della deviazione a questo intervallo.
Utilizzando Math.RemapRange, riassociare i valori della deviazione planare ad un intervallo compreso tra* 0* e 1. Nota È anche possibile utilizzare il nodo MapTo per definire un dominio di origine.
Collegare i risultati ad un nodo Color Range.
Notare che l'output è un intervallo di colori anziché un intervallo di numeri.
Se l'opzione è impostata su Manuale, fare clic su Esegui. Dovrebbe essere possibile procedere facilmente da questo momento in poi avendo impostato l'opzione su Automatico.
In Revit, si nota una sfumatura molto più leggibile che è rappresentativa della deviazione planare basata sull'intervallo di colori. Ma se si vogliono personalizzare i colori? Notare che i valori della deviazione minima sono rappresentati in rosso, che sembra essere l'opposto di ciò che ci si aspetterebbe. Si desidera visualizzare la deviazione massima in rosso, con la deviazione minima rappresentata da un colore più tenue. Tornare in Dynamo e modificare questo aspetto.
Utilizzando un Code Block, aggiungere due numeri su due righe diverse:
0;
e255;
.Creare un colore rosso e blu collegando i valori appropriati a due nodi Color.ByARGB.
Creare un elenco da questi due colori.
Collegare questo elenco all'input colors di Color Range e osservare l'aggiornamento dell'intervallo di colori personalizzato.
Tornando in Revit, è ora possibile distinguere meglio le aree di deviazione massima negli angoli. Ricordarsi che questo nodo serve per sostituire un colore in una vista, così può essere davvero utile disporre di una tavola specifica nel gruppo di disegni che si concentra su un particolare tipo di analisi.
Selezionando un pannello ETFE in Revit, si noterà che sono presenti quattro parametri di istanza, XYZ1, XYZ2, XYZ3 e XYZ4. Questi sono tutti vuoti dopo la loro creazione. Si tratta di parametri basati sul testo che richiedono valori. Verrà utilizzato Dynamo per scrivere le posizioni dei punti adattivi su ciascun parametro. Ciò consente l'interoperabilità se la geometria deve essere inviata ad un ingegnere o un consulente per le facciate.
In una tavola di esempio, è presente un abaco di grandi dimensioni vuoto. I parametri XYZ sono parametri condivisi nel file di Revit, il che consente di aggiungerli all'abaco.
Se si esegue lo zoom avanti, i parametri XYZ devono ancora essere immessi. I primi due parametri vengono gestiti da Revit.
Per scrivere questi valori, verrà eseguita un'operazione sugli elenchi complessa. Il grafico stesso è semplice, ma i concetti si basano in modo significativo sul mappaggio degli elenchi, come discusso nel capitolo sugli elenchi.
Selezionare tutti i componenti adattivi con due nodi.
Estrarre la posizione di ciascun punto con AdaptiveComponent.Locations.
Convertire questi punti in stringhe. Ricordarsi che il parametro è basato sul testo, quindi occorre immettere il tipo di dati corretto.
Creare un elenco delle quattro stringhe che definiscono i parametri da modificare: XYZ1, XYZ2, XYZ3 e XYZ4.
Collegare questo elenco all'input parameterName di Element.SetParameterByName.
Collegare Element.SetParameterByName all'input combinator di List.Combine. Collegare i componenti adattivi a list1. Collegare String from Object a list2.
Qui si sta eseguendo il mappaggio degli elenchi, poiché si stanno scrivendo quattro valori per ogni elemento, il che crea una struttura dei dati complessa. Il nodo List.Combine definisce un'operazione di un livello più basso nella gerarchia dei dati. Per questo motivo, gli input element e value di Element.SetParameterByName restano vuoti. List.Combine collega i sottoelenchi dei relativi input agli input vuoti di Element.SetParameterByName, in base all'ordine in cui sono collegati.
Selezionando un pannello in Revit, notare che sono presenti valori di stringa per ogni parametro. Realisticamente, è necessario creare un formato più semplice per scrivere un punto (X, Y, Z). Questa operazione può essere eseguita con operazioni di stringa in Dynamo, ma in questo caso viene ignorata per rimanere all'interno dell'ambito di questo capitolo.
Vista dell'abaco di esempio con i parametri compilati.
Ogni pannello ETFE ora dispone delle coordinate XYZ scritte per ogni punto adattivo, che rappresentano gli angoli di ogni pannello per la fabbricazione.
È possibile creare una serie di elementi di Revit in Dynamo con controllo parametrico completo. I nodi di Revit in Dynamo offrono la possibilità di importare elementi da geometrie generiche in tipi di categoria specifici (come muri e pavimenti). In questa sezione, si esaminerà l'importazione di elementi parametricamente flessibili con componenti adattivi.
Un componente adattivo è una categoria di famiglia flessibile che si presta bene alle applicazioni generative. Al momento della creazione dell'istanza, è possibile creare un elemento geometrico complesso che sia controllato dalla posizione fondamentale dei punti adattivi.
Di seguito è riportato un esempio di un componente adattivo a tre punti nell'Editor di famiglie. Questo genera una trave reticolare definita dalla posizione di ciascun punto adattivo. Nell'esercizio seguente, si utilizzerà questo componente per generare una serie di travi reticolari su una facciata.
Il componente adattivo è un buon esempio di procedure ottimali di interoperabilità. È possibile creare una serie di componenti adattivi definendo i punti adattivi fondamentali. Inoltre, quando si trasferiscono questi dati in altri programmi, è possibile ridurre la geometria in dati semplici. L'importazione e l'esportazione con un programma come Excel seguono una logica simile.
Si supponga che un consulente per le facciate voglia conoscere la posizione degli elementi della trave reticolare senza dover eseguire l'analisi attraverso una geometria completamente articolata. In preparazione alla fabbricazione, il consulente può fare riferimento alla posizione dei punti adattivi per rigenerare la geometria in un programma come Inventor.
Il workflow che si imposterà nell'esercizio seguente consente di accedere a tutti questi dati durante la generazione della definizione per la creazione di elementi di Revit. Con questo processo, è possibile unire la concettualizzazione, la documentazione e la fabbricazione in un workflow senza problemi. Ciò crea un processo più intelligente ed efficiente per l'interoperabilità.
Un altro metodo per importare la geometria di Dynamo parametrica in Revit è con DirectShape. In breve, l'elemento DirectShape e le classi correlate supportano la possibilità di memorizzare forme geometriche create esternamente in un documento di Revit. La geometria può includere mesh o solidi chiusi. DirectShape è principalmente destinato all'importazione di forme da altri formati di dati, ad esempio IFC o STEP, dove non sono disponibili informazioni sufficienti per creare un elemento di Revit "reale". Analogamente al workflow IFC e STEP, la funzionalità DirectShape funziona correttamente con l'importazione di geometrie create da Dynamo nei progetti di Revit come elementi reali.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
A partire dal file di esempio di questa sezione (o proseguendo con il file di Revit della sessione precedente), viene visualizzata la stessa massa di Revit.
Questo è il file aperto.
Questo è il sistema di travi reticolari creato con Dynamo, collegato in modo intelligente alla massa di Revit.
Sono stati utilizzati i nodi Select Model Element e Select Face. Ora si scenderà di un ulteriore livello nella gerarchia della geometria e si utilizzerà Select Edge. Con il risolutore Dynamo impostato sull'esecuzione Automatico, il grafico viene aggiornato costantemente in base alle modifiche apportate nel file di Revit. Il bordo selezionato viene collegato dinamicamente alla topologia dell'elemento di Revit. Se la topologia* non cambia, la connessione tra Revit e Dynamo rimane intatta.
Selezionare la curva più in alto della facciata con vetrate. Questa si estende per l'intera lunghezza dell'edificio. Se non si riesce a selezionare il bordo, ricordarsi di scegliere la selezione in Revit passando il cursore del mouse sul bordo e premendo TAB finché il bordo desiderato non viene evidenziato.
Utilizzando due nodi Select Edge, selezionare ogni bordo che rappresenta l'inclinazione al centro della facciata.
Ripetere la stessa operazione per i bordi inferiori della facciata in Revit.
I nodi Watch mostrano che ora sono presenti linee in Dynamo. Questo valore viene convertito automaticamente nella geometria di Dynamo poiché i bordi stessi non sono elementi di Revit. Queste curve sono i riferimenti che verranno utilizzati per creare un'istanza di travi reticolari adattive nella facciata.
*Per mantenere una topologia coerente, si sta facendo riferimento ad un modello che non ha facce o bordi supplementari aggiunti. Sebbene i parametri possano modificarne la forma, il modo in cui è stata creata rimane coerente.
È necessario innanzitutto unire le curve e accorparle in un elenco. In questo modo è possibile "raggruppare" le curve per eseguire operazioni di geometria.
Creare un elenco per le due curve al centro della facciata.
Unire le due curve in una PolyCurve collegando il componente List.Create in un nodo Polycurve.ByJoinedCurves.
Creare un elenco per le due curve nella parte inferiore della facciata.
Unire le due curve in una PolyCurve collegando il componente List.Create in un nodo Polycurve.ByJoinedCurves.
Infine, unire le tre curve principali (una linea e due PolyCurve) in un elenco.
Si desidera sfruttare la curva superiore, che è una linea, e rappresenta l'estensione completa della facciata. Verranno creati piani lungo questa linea per intersecare il gruppo di curve raggruppate in un elenco.
Con un Code Block, definire un intervallo utilizzando la sintassi:
0..1..#numberOfTrusses;
.Collegare un *integer slider *all'input per il Code Block. Come si poteva immaginare, questo rappresenterà il numero di travi reticolari. Notare che il dispositivo di scorrimento controlla il numero di elementi nell'intervallo definito da *0 *a 1.
Collegare il blocco di codice all'input param di un nodo Curve.PlaneAtParameter e collegare il bordo superiore all'input curve. Questo fornirà dieci piani, distribuiti uniformemente nell'estensione della facciata.
Un piano è un elemento di geometria astratto, che rappresenta uno spazio bidimensionale infinito. I piani sono ideali per le curve di livello e l'intersezione, come vengono impostati in questo passaggio.
Utilizzando il nodo Geometry.Intersect (impostare l'opzione Collegamento su Globale), collegare Curve.PlaneAtParameter all'input entity del nodo Geometry.Intersect. Collegare il nodo List.Create principale all'input geometry. Nella finestra di Dynamo vengono ora visualizzati i punti che rappresentano l'intersezione di ogni curva con i piani definiti.
Notare che l'output è un elenco di elenchi di elenchi. Sono troppi elenchi per gli scopi desiderati. Si intende eseguire una riduzione di livelli parziale qui. Occorre scendere di un livello nell'elenco e ridurre i livelli del risultato. A tale scopo, è necessario utilizzare l'operazione List.Map, come illustrato nel capitolo dell'elenco della guida introduttiva.
Collegare il nodo Geometry.Intersect all'input list di List.Map.
Collegare un nodo Flatten all'input f(x) di List.Map. I risultati forniscono 3 elenchi, ciascuno con un conteggio uguale al numero di travi reticolari.
Occorre modificare questi dati. Per creare un'istanza della trave reticolare, è necessario utilizzare lo stesso numero di punti adattivi definiti nella famiglia. Si tratta di un componente adattivo a tre punti, pertanto anziché tre elenchi con 10 elementi ciascuno (numberOfTrusses), si desidera ottenere 10 elenchi di tre elementi ciascuno. In questo modo è possibile creare 10 componenti adattivi.
Collegare List.Map ad un nodo List.Transpose. Ora si dispone dell'output di dati desiderato.
Per verificare che i dati siano corretti, aggiungere un nodo Polygon.ByPoints all'area di disegno e controllare con l'anteprima di Dynamo.
Allo stesso modo in cui sono stati creati i poligoni, disporre i componenti adattivi.
Aggiungere un nodo AdaptiveComponent.ByPoints all'area di disegno, collegare il nodo List.Transpose all'input points.
Utilizzando un nodo Family Types, selezionare la famiglia AdaptiveTruss e collegarla all'input FamilyType del nodo AdaptiveComponent.ByPoints.
In Revit, ora le dieci travi reticolari presentano una spaziatura uniforme sulla facciata.
Adattando il grafico, aumentare il valore numberOfTrusses a 30 modificando il dispositivo di scorrimento. Molte travi reticolari non sono molto realistiche, ma il collegamento parametrico funziona. Una volta eseguita la verifica, impostare numberOfTrusses su 15.
E per il test finale, selezionando la massa in Revit e modificando i parametri di istanza, è possibile modificare la forma dell'edificio e osservare come la trave reticolare fa la stessa cosa. Ricordarsi che questo grafico di Dynamo deve essere aperto per poter visualizzare questo aggiornamento e il collegamento verrà interrotto non appena verrà chiuso.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Per iniziare, aprire il file di esempio per questa lezione: ARCH-DirectShape-BaseFile.rvt.
Nella vista 3D, si utilizza la massa dell'edificio della lezione precedente.
Lungo il bordo dell'atrio vi è una curva di riferimento, che verrà utilizzata come curva di riferimento in Dynamo.
Lungo il bordo opposto dell'atrio vi è un'altra curva di riferimento, a cui si farà riferimento anche in Dynamo.
Per fare riferimento alla geometria in Dynamo, verrà utilizzato Select Model Element per ogni membro in Revit. Selezionare la massa in Revit e importare la geometria in Dynamo utilizzando Element.Faces. La massa dovrebbe ora essere visibile nell'anteprima di Dynamo.
Importare una curva di riferimento in Dynamo utilizzando Select Model Element e CurveElement.Curve.
Importare l'altra curva di riferimento in Dynamo utilizzando Select Model Element e CurveElement.Curve.
La struttura è gestita da tre parametri principali: Diagonal Shift, Camber e Radius.
Zoom con un'occhiata ravvicinata ai parametri per questo grafico. È possibile adattarli per ottenere diversi output della geometria.
Se si trascina il nodo DirectShape.ByGeometry nell'area di disegno, è possibile notare che presenta quattro input: geometry, category, material e name.
La geometria sarà il solido creato dalla parte di creazione della geometria del grafico.
L'input della categoria viene scelto tramite il nodo Categories dell'elenco a discesa. In questo caso si utilizzerà Telaio strutturale.
L'input del materiale viene selezionato attraverso la serie di nodi riportata sopra, anche se in questo caso può essere definito più semplicemente come "Default".
Dopo aver eseguito Dynamo, tornando in Revit, il progetto contiene la geometria importata sul tetto. Si tratta di un elemento del telaio strutturale, anziché di un modello generico. Il collegamento parametrico a Dynamo rimane intatto.
Una potente funzionalità di Dynamo è la possibilità di modificare i parametri su un livello parametrico. Ad esempio, un algoritmo generativo o i risultati di una simulazione possono essere utilizzati per determinare i parametri di una serie di elementi. In questo modo, un gruppo di istanze della stessa famiglia può avere proprietà personalizzate nel progetto di Revit.
I parametri di istanza definiscono l'apertura dei pannelli sulla superficie del tetto, che prevedono un rapporto di apertura compreso tra 0.1 e 0.4.
I parametri basati sul tipo vengono applicati ad ogni elemento della superficie in quanto si tratta dello stesso tipo di famiglia. Il materiale di ciascun pannello, ad esempio, può essere determinato da un parametro basato sul tipo.
Se in precedenza è stata configurata una famiglia di Revit, ricordarsi che è necessario assegnare un tipo di parametro (stringa, numero, quota e così via). Assicurarsi di utilizzare il tipo di dati corretto durante l'assegnazione di parametri da Dynamo.
È inoltre possibile utilizzare Dynamo in combinazione con i vincoli parametrici definiti nelle proprietà di una famiglia di Revit.
Come rapido ripasso dei parametri in Revit, si ricorda che sono presenti parametri di tipo e di istanza. Entrambi possono essere modificati da Dynamo, ma nell'esercizio riportato di seguito verranno utilizzati i parametri di istanza.
A partire dalla versione 0.8, Dynamo è fondamentalmente senza unità. Ciò consente a Dynamo di rimanere un ambiente di programmazione visiva astratto. I nodi di Dynamo che interagiscono con le quote di Revit faranno riferimento alle unità del progetto di Revit. Ad esempio, se si imposta un parametro della lunghezza in Revit da Dynamo, il numero in Dynamo per il valore corrisponderà alle unità di default nel progetto di Revit. L'esercizio riportato di seguito è basato sui metri.
Per una conversione rapida delle unità, utilizzare il nodo Convert Between Units. Questo è un comodo strumento per la conversione delle unità di lunghezza, area e volume al volo.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
L'esercizio riportato di seguito è basato sui metri.
Questo esercizio si concentra sulla modifica degli elementi di Revit senza eseguire un'operazione geometrica in Dynamo. Qui non si sta importando la geometria di Dynamo, ma si stanno modificando solo i parametri in un progetto di Revit. Questo è un esercizio di base e, per gli utenti più avanzati di Revit, notare che si tratta di parametri di istanza di una massa, ma la stessa logica può essere applicata ad una serie di elementi per la personalizzazione su larga scala. Tutto questo viene eseguito con il nodo "Element.SetParameterByName".
Iniziare con il file di esempio di Revit per questa sezione. Sono stati rimossi gli elementi strutturali e le travi reticolari adattive della sezione precedente. In questo esercizio, ci si concentrerà su una piattaforma petrolifera parametrica in Revit e sulla manipolazione in Dynamo.
Selezionando la massa dell'edificio in Revit, si vedono una serie di parametri di istanza nel gruppo Proprietà.
In Dynamo, è possibile recuperare i parametri selezionando l'elemento di destinazione.
Selezionare la massa dell'edificio con il nodo Select Model Element.
È possibile eseguire una query su tutti i parametri di questa massa con il nodo Element.Parameters. Ciò include i parametri di tipo e istanza.
Fare riferimento al nodo Element. Parameters per trovare i parametri di destinazione. In alternativa, è possibile visualizzare il gruppo Proprietà del passaggio precedente per scegliere i nomi dei parametri da modificare. In questo caso, si stanno cercando i parametri che influenzano i grandi movimenti geometrici sulla massa dell'edificio.
Verranno apportate modifiche all'elemento di Revit utilizzando il nodo Element.SetParameterByName.
Utilizzare C_ode Block per_ definire un elenco di parametri, con virgolette intorno ad ogni elemento per indicare una stringa. È inoltre possibile utilizzare il nodo List.Create con una serie di nodi string collegati a più input, ma Code Block è più veloce e più semplice. Assicurarsi che la stringa corrisponda al nome esatto in Revit, specifico per le maiuscole e minuscole:
{"BldgWidth","BldgLength","BldgHeight", "AtriumOffset", "InsideOffset","LiftUp"};
Si desidera inoltre designare i valori per ogni parametro. Aggiungere sei dispositivi di scorrimento di numeri interi all'area di disegno e rinominarli in base al parametro corrispondente nell'elenco. Inoltre, impostare i valori di ciascun dispositivo di scorrimento sull'immagine riportata sopra. In ordine dall'alto verso il basso: 62, 92, 25, 22, 8, 12.
Definire un altro Code Block con un elenco della stessa lunghezza dei nomi dei parametri. In questo caso, vengono denominate variabili (senza virgolette) che creano input per Code Block. Collegare i dispositivi di scorrimento a ciascun rispettivo input:
{bw,bl,bh,ao,io,lu};
.Collegare Code Block all'input del valore Element.SetParameterByName*. Con l'opzione Automatico selezionata, i risultati verranno visualizzati automaticamente.
*Questa dimostrazione funziona con i parametri di istanza, ma non con i parametri di tipo.
Come in Revit, molti di questi parametri dipendono l'uno dall'altro. Ci sono naturalmente delle combinazioni in cui la geometria può interrompersi. È possibile risolvere questo problema con formule definite nelle proprietà dei parametri oppure è possibile configurare una logica simile con operazioni matematiche in Dynamo (questa è una difficoltà aggiuntiva se si desidera espandere l'esercizio).
Questa combinazione conferisce una nuova bizzarra progettazione alla massa dell'edificio: 100, 92, 100, 25, 13, 51.
Si vedrà ora come modificare la facciata utilizzando un processo simile.
Copiare il grafico e concentrarsi sulla vetrata della facciata che ospiterà il sistema di travi reticolari. In questo caso, vengono isolati quattro parametri:
{"DblSkin_SouthOffset","DblSkin_MidOffset","DblSkin_NorthOffset","Facade Bend Location"};
.Inoltre, creare dispositivi di scorrimento numerici e rinominarli in base ai parametri appropriati. I primi tre dispositivi di scorrimento dall'alto verso il basso devono essere riassociati ad un dominio di [0,10], mentre il dispositivo di scorrimento finale Facade Bend Location deve essere riassociato ad un dominio di [0,1]. Questi valori, dall'alto verso il basso, dovrebbero iniziare con questi valori (sebbene siano arbitrari): 2.68, 2.64, 2.29, 0.5.
Definire un nuovo Code Block e collegare i dispositivi di scorrimento:
{so,mo,no,fbl};
.
Modificando i dispositivi di scorrimento in questa parte del grafico, è possibile ingrandire di molto la vetrata della facciata: 9.98, 10.0, 9.71, 0.31.
E se ci fossero 500 travi? La conversione di tutti questi elementi nella geometria di Dynamo risulterebbe davvero lenta. Se Dynamo richiede molto tempo per il calcolo dei nodi, è possibile utilizzare la funzionalità del nodo Congela per mettere in pausa l'esecuzione delle operazioni di Revit durante lo sviluppo del grafico. Per ulteriori informazioni sul congelamento dei nodi, controllare la sezione nel capitolo sui solidi.
Nel riportato di seguito viene illustrato come Dynamo fa riferimento ai dati per la creazione di elementi di Revit. Per generare più componenti adattivi, è necessario definire un elenco di elenchi, dove ogni elenco contiene tre punti che rappresentano ciascun punto del componente adattivo. Questo aspetto è importante da tenere presente quando si gestiscono le strutture di dati in Dynamo.
Si esaminerà dettagliatamente il per importare la geometria di Dynamo come DirectShape nel progetto di Revit. Utilizzando questo metodo, è possibile assegnare la categoria, il materiale e il nome di una geometria importata, mantenendo comunque un collegamento parametrico al grafico di Dynamo.
Eseguendo lo zoom indietro e la panoramica a destra nel grafico di esempio, viene visualizzato un gruppo esteso di nodi; si tratta di operazioni geometriche che generano la struttura del tetto a pergolato visibile nell'anteprima di Dynamo. Questi nodi vengono generati utilizzando la funzionalità Nodo da aggiungere al codice, come descritto nella della guida introduttiva.
Mentre si rileva l'applicazione estesa della modifica di parametri, potrebbe essere necessario modificare una grande quantità di elementi in Revit con Dynamo. Questa operazione può essere costosa dal punto di vista computazionale , ovvero può risultare lenta. Se si modifica un numero elevato di elementi, è possibile utilizzare la funzionalità Congela del nodo per interrompere l'esecuzione delle operazioni di Revit durante lo sviluppo del grafico. Per ulteriori informazioni sul congelamento dei nodi, controllare la sezione nel capitolo sui solidi.
Ora che si sa un po' di più sul quadro generale, è possibile iniziare subito a creare il primo grafico di Dynamo in Civil 3D.
Questo è un semplice esempio che serve a dimostrare le funzionalità di base di Dynamo. Si consiglia di eseguire i passaggi descritti in un nuovo documento vuoto di Civil 3D.
La prima cosa da fare è aprire un documento vuoto in Civil 3D. Una volta arrivati a questo punto, accedere alla scheda Gestione sulla barra multifunzione di Civil 3D e cercare il gruppo Programmazione visiva.
Fare clic sul pulsante Dynamo, che consente di avviare Dynamo in una finestra separata.
Qual è la differenza tra Dynamo e il Lettore Dynamo?
Dynamo è quello che si utilizza per creare ed eseguire grafici. Il Lettore Dynamo è un modo semplice per eseguire i grafici senza doverli aprire in Dynamo.
Accedere alla sezione Lettore Dynamo quando si è pronti per provarlo.
Una volta aperto Dynamo, verrà visualizzata la schermata iniziale. Fare clic su Nuovo per aprire un'area di lavoro vuota.
E gli esempi?
Dynamo for Civil 3D include alcuni grafici predefiniti che possono aiutare a dare vita ad altre idee su come utilizzare Dynamo. È consigliabile esaminare tali elementi, nonché Esempi di workflow qui nella Guida introduttiva.
Ora dovrebbe essere visualizzata un'area di lavoro vuota. Vediamo Dynamo in azione! Ecco il nostro obiettivo:
Molto semplice, giusto? Prima di iniziare, però, è necessario illustrare alcuni aspetti fondamentali.
I blocchi predefiniti principali di un grafico di Dynamo sono denominati nodi. Un nodo è come un piccolo computer: si inseriscono dei dati, la macchina li elabora e produce un risultato. Dynamo for Civil 3D dispone di una libreria di nodi che è possibile collegare insieme a dei fili per formare un grafico il quale consente di eseguire operazioni più grandi e migliori di quelle che un singolo nodo può fare da solo.
E se Dynamo non fosse mai stato utilizzato prima?
Alcune di queste nozioni potrebbero essere nuove, ma non importa perché le sezioni seguenti saranno d'aiuto.
Costruiamo il nostro grafico. Ecco un elenco di tutti i nodi che ci serviranno.
È possibile trovare questi nodi digitandone i nomi sulla barra di ricerca nella libreria oppure facendo clic con il pulsante destro del mouse in un punto qualsiasi dell'area di disegno ed eseguendo ricerche in tale area.
Come è possibile sapere quali nodi utilizzare e dove trovarli?
I nodi della libreria sono raggruppati in categorie logiche in base alle loro funzioni. Per una presentazione più approfondita, consultare la sezione Libreria di nodi.
Ecco come dovrebbe apparire il grafico finale.
Riepiloghiamo quello che abbiamo fatto qui:
Abbiamo scelto il documento in cui lavorare. In questo caso (e in molti casi), si desidera lavorare nel documento attivo in Civil 3D.
È stato definito il blocco di destinazione in cui creare l'oggetto text (in questo caso lo spazio modello).
È stato utilizzato un nodo String per specificare il layer su cui posizionare il testo.
È stato creato un punto utilizzando il nodo Point.ByCoordinates per definire la posizione in cui inserire il testo.
Sono state definite le coordinate X e Y del punto di inserimento del testo utilizzando due nodi Number Slider.
È stato utilizzato un altro nodo String per definire il contenuto dell'oggetto text.
Infine, è stato creato l'oggetto text.
Vediamo i risultati del nostro nuovo grafico!
In Civil 3D, verificare che la scheda Modello sia selezionata. Dovrebbe essere visualizzato il nuovo oggetto text creato da Dynamo.
Se non è possibile visualizzare il testo, potrebbe essere necessario eseguire il comando ZOOM -> ESTENSIONI per eseguire lo zoom sul punto giusto.
Forte! Ora facciamo degli aggiornamenti al testo.
Tornando al grafico di Dynamo, procedere e modificare alcuni dei valori di input, ad esempio la stringa di testo, le coordinate del punto di inserimento e così via. Dovrebbe essere possibile vedere l'aggiornamento automatico del testo in Civil 3D. Notare inoltre che se si scollega una delle porte di input, il testo viene rimosso. Se si ricollega tutto, il testo viene creato di nuovo.
Perché Dynamo non inserisce un nuovo oggetto text ogni volta che il grafico viene eseguito?
Per default, Dynamo "memorizza" gli oggetti che crea. Se si modificano i valori di input del nodo, gli oggetti in Civil 3D vengono aggiornati anziché crearne di nuovi. Per ulteriori informazioni su questo funzionamento, consultare la sezione Unione di oggetti.
Questo esempio è solo un assaggio di ciò che si può fare con Dynamo for Civil 3D. Continuare a leggere per saperne di più.
Mentre in precedenza è stata esaminata la modifica della massa di un edificio di base, si vuole approfondire ulteriormente il collegamento di Dynamo/Revit modificando un numero elevato di elementi in un'unica operazione. La personalizzazione su larga scala diventa più complessa, poiché le strutture di dati richiedono operazioni con gli elenchi più avanzate. Tuttavia, i principi alla base della loro esecuzione sono fondamentalmente gli stessi. Verranno esaminate alcune opportunità per l'analisi da un gruppo di componenti adattivi.
Si supponga di aver creato un'ampia gamma di componenti adattivi e di voler modificare i parametri in base alle relative posizioni dei punti. I punti, ad esempio, potrebbero controllare un parametro di spessore correlato all'area dell'elemento. Oppure potrebbero controllare un parametro di opacità correlato all'esposizione solare durante tutto l'anno. Dynamo consente il collegamento dell'analisi ai parametri in pochi semplici passaggi. Verrà analizzata una versione di base nell'esercizio riportato di seguito.
Eseguire una query sui punti adattivi del componente adattivo selezionato utilizzando il nodo AdaptiveComponent.Locations. Questo consente di utilizzare una versione astratta di un elemento di Revit per l'analisi.
Estraendo la posizione dei punti dei componenti adattivi, è possibile eseguire un'ampia gamma di analisi per tale elemento. Un componente adattivo a quattro punti consentirà, ad esempio, di studiare la deviazione dal piano di un determinato pannello.
Utilizzare il rimappaggio per associare un gruppo di dati ad un intervallo di parametri. Questo è uno strumento fondamentale utilizzato in un modello parametrico e verrà dimostrato nell'esercizio riportato di seguito.
Utilizzando Dynamo, le posizioni dei punti dei componenti adattivi possono essere utilizzate per creare un piano di adattamento per ogni elemento. È possibile anche eseguire una query sulla posizione del sole nel file di Revit e studiare l'orientamento relativo del piano rispetto al sole confrontandolo con altri componenti adattivi. Eseguire l'impostazione nell'esercizio riportato di seguito creando un tetto algoritmico.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Questo esercizio verterà sulle tecniche illustrate nella sezione precedente. In questo caso, verrà definita una superficie parametrica degli elementi di Revit, saranno create istanze di componenti adattivi a quattro punti, che verranno poi modificati in base all'orientamento rispetto al sole.
Iniziare selezionando due spigoli con il nodo Select Edge. I due spigoli sono i tratti lunghi dell'atrio.
Combinare i due spigoli in un elenco con il nodo List.Create.
Creare una superficie tra i due spigoli con Surface.ByLoft.
Utilizzando Code Block, definire un intervallo da 0 a 1 con 10 valori a spaziatura uniforme:
0..1..#10;
.Collegare Code Block agli input *u *e v di un nodo Surface.PointAtParameter e collegare il nodo Surface.ByLoft all'input surface. Fare clic con il pulsante destro del mouse sul nodo e modificare Collegamento in Globale. In questo modo si ottiene una griglia di punti sulla superficie.
Questa griglia di punti funge da punti di controllo per una superficie definita in modo parametrico. Si desidera estrarre le posizioni u e v di ciascuno di questi punti in modo da poterle collegare ad una formula parametrica e mantenere la stessa struttura di dati. A tale scopo, è possibile eseguire una query sulle posizioni dei parametri dei punti appena creati.
Aggiungere un nodo Surface.ParameterAtPoint all'area di disegno e collegare gli input come mostrato in precedenza.
Eseguire una query sui valori u di questi parametri con il nodo UV.U.
Eseguire una query sui valori v di questi parametri con il nodo UV.V.
Gli output mostrano i valori u e v corrispondenti per ogni punto della superficie. Ora è disponibile un intervallo compreso tra 0 e 1 per ogni valore, nella struttura di dati corretta, pertanto è possibile applicare un algoritmo parametrico.
Aggiungere Code Block all'area di disegno e immettere il codice:
Math.Sin(u*180)*Math.Sin(v*180)*w;
. Si tratta di una funzione parametrica che crea una protuberanza sinusoidale da una superficie piana.Collega UV.U all'input u e UV.V all'input v.
L'input w rappresenta l'ampiezza della forma, pertanto si associa Number Slider ad esso.
Ora è disponibile un elenco di valori come definito dall'algoritmo. Utilizzare questo elenco di valori per spostare i punti verso l'alto nella direzione +Z. Utilizzando Geometry.Translate, collegare *Code Block *a zTranslation e Surface.PointAtParameter all'input geometry. I nuovi punti dovrebbero essere visualizzati nell'anteprima di Dynamo.
Infine, creare una superficie con il nodo NurbsSurface.ByPoints, collegando il nodo del passaggio precedente all'input points. Si ottiene una superficie parametrica. È possibile trascinare il dispositivo di scorrimento per restringere e ingrandire la protuberanza.
Con la superficie parametrica, si vuole definire un modo per suddividerla in pannelli al fine di creare la serie di componenti adattivi a quattro punti. Dynamo non dispone di funzionalità predefinite per la suddivisione della superficie in pannelli, pertanto è possibile accedere alla community per i pacchetti di Dynamo utili.
Passare a Pacchetti > Cerca pacchetto.
Cercare LunchBox e installare LunchBox for Dynamo. Si tratta di un insieme veramente utile di strumenti per le operazioni di geometria come questa.
Dopo il download, si dispone ora dell'accesso completo alla suite LunchBox. Cercare Quad Grid e selezionare LunchBox Quad Grid By Face. Collegare la superficie parametrica all'input Surface e impostare le divisioni U e V su 15. Nell'anteprima di Dynamo dovrebbe essere visualizzata una superficie in quattro pannelli.
Se si desidera conoscere la relativa impostazione, è possibile fare doppio clic sul nodo Lunch Box e vedere come viene eseguita.
Tornando a Revit, si darà un rapido sguardo al componente adattivo utilizzato qui. Non occorre seguirlo, ma questo è il pannello del tetto di cui verrà creata un'istanza. Si tratta di un componente adattivo a quattro punti, che è una rappresentazione approssimata di un sistema ETFE. L'apertura del vuoto centrale si trova su un parametro denominato Aperture Ratio.
Verrà creata un'istanza di molti elementi della geometria in Revit. Assicurarsi quindi di impostare il risolutore Dynamo su Manuale.
Aggiungere un nodo Family Types all'area di disegno e selezionare ROOF-PANEL-4PT.
Aggiungere un nodo AdaptiveComponent.ByPoints all'area di disegno, collegare Panel Pts dall'output LunchBox Quad Grid by Face all'input points. Collegare il nodo Family Types all'input familySymbol.
Fare clic su Esegui. La creazione della geometria in Revit richiederà un po' di tempo. Se richiede troppo tempo, ridurre il valore 15 di Code Block ad un numero inferiore. In questo modo si riduce il numero di pannelli sul tetto.
Nota: se Dynamo richiede molto tempo per il calcolo dei nodi, potrebbe essere necessario utilizzare la funzionalità del nodo Congela per mettere in pausa l'esecuzione delle operazioni di Revit durante lo sviluppo del grafico. Per ulteriori informazioni sul congelamento dei nodi, controllare la sezione Congelamento nel capitolo sui solidi.
Tornando in Revit, ecco la serie di pannelli sul tetto.
Eseguendo lo zoom avanti, è possibile osservare più da vicino la qualità della superficie.
Continuando dal passaggio precedente, proseguire e controllare l'apertura di ogni pannello in base alla sua esposizione al sole. Se si esegue lo zoom in Revit e si seleziona un pannello, sulla barra delle proprietà viene visualizzato il parametro Aperture Ratio. La famiglia è impostata in modo che l'apertura sia compresa, approssimativamente, tra 0.05 e 0.45.
Se si osserva il percorso solare, è possibile vedere la posizione corrente del sole in Revit.
È possibile fare riferimento a questa posizione del sole utilizzando il nodo SunSettings.Current.
Collegare le impostazioni del sole a Sunsetting.SunDirection per ottenere il vettore solare.
Dal nodo Panel Pts utilizzato per creare i componenti adattivi, utilizzare Plane.ByBestFitThroughPoints per approssimare un piano per il componente.
Eseguire una query sulla normale di questo piano.
Utilizzare il prodotto scalare per calcolare l'orientamento solare. Il prodotto scalare è una formula che determina il possibile grado di parallelismo o antiparallelismo dei due vettori. Quindi utilizzare la normale del piano di ogni componente adattivo e confrontarla con il vettore solare per simulare approssimativamente l'orientamento solare.
Utilizzare il valore assoluto del risultato. In questo modo si garantisce che il prodotto scalare sia preciso se la normale del piano è rivolta verso la direzione inversa.
Fare clic su Esegui.
Osservando il prodotto scalare, si hanno diversi numeri. Si desidera utilizzare la distribuzione relativa, ma è necessario comprimere i numeri nell'intervallo appropriato del parametro Aperture Ratio che si intende modificare.
Math.RemapRange è uno strumento eccezionale per questa funzione. Prevede un elenco di input e ne riassocia i limiti a due valori obiettivo.
Definire i valori obiettivo come 0.15 e_0.45_ in Code Block.
Fare clic su Esegui.
Collegare i valori riassociati ad un nodo Element.SetParameterByName.
Collegare la stringa Aperture Ratio all'input parameterName.
Collegare AdaptiveComponent all'input element.
Fare clic su Esegui.
Tornando in Revit, da lontano è possibile notare l'effetto dell'orientamento solare sull'apertura dei pannelli ETFE.
Eseguendo lo zoom avanti, si può vedere che i pannelli ETFE sono più vicini alla superficie del sole. L'obiettivo è ridurre il surriscaldamento derivante dall'esposizione solare. Se si desidera far passare più luce in base all'esposizione solare, occorre solo cambiare il dominio in Math.RemapRange.
Strade, ferrovie, terreni, servizi, rilievi, GIS...
Le infrastrutture civili sono tutte queste cose e molto altro! Questa sezione contiene diversi grafici di esempio pratici e pertinenti per aiutare a raggiungere la padronanza di Dynamo e a sfruttare appieno il potenziale di Dynamo for Civil 3D. Ogni grafico è corredato di descrizioni dettagliate della logica con cui è stato creato, in modo da poterlo non solo utilizzare, ma anche comprendere.
Inoltre, questi esempi incarnano le pratiche ottimali collaudate nel tempo per la costruzione di grafici efficaci. Mentre si esaminano gli esempi, si consiglia di acquisire familiarità con la sezione Procedure ottimali per ulteriori idee su come creare grafici potenti, flessibili e gestibili.
Dynamo for Civil 3D offre il paradigma della programmazione visiva agli ingegneri e ai progettisti che lavorano su progetti di infrastrutture civili. Si può pensare a Dynamo come a una sorta di strumento digitale multiplo per gli utenti di Civil 3D; qualunque sia il compito da svolgere, c'è lo strumento giusto per farlo. La sua interfaccia intuitiva consente di creare routine potenti e personalizzabili senza dover scrivere una singola riga di codice. Non è necessario essere programmatori per utilizzare Dynamo, ma è necessario essere in grado di pensare con la logica di un programmatore. Insieme agli altri capitoli del Guida introduttiva, questo capitolo aiuterà a sviluppare le competenze logiche in modo da poter affrontare qualsiasi attività con una mentalità di progettazione computazionale.
Dynamo è stato introdotto per la prima volta in Civil 3D 2020 e da allora ha continuato a evolversi. Inizialmente installato separatamente tramite un aggiornamento software, ora è incluso in tutte le versioni di Civil 3D. A seconda della versione di Civil 3D in uso, si può notare che l'interfaccia di Dynamo è leggermente diversa dagli esempi visualizzati in questo capitolo. Ciò è dovuto al fatto che l'interfaccia è stata notevolmente rinnovata in Civil 3D 2023.
È consigliabile consultare il blog di Dynamo per le informazioni più aggiornate relative allo sviluppo di Dynamo. Nella tabella seguente sono riassunte le tappe principali dello sviluppo di Dynamo for Civil 3D.
2024.1
2.18
2024
2.17
Aggiornamento dell'interfaccia utente del Lettore Dynamo
2023.2
2.15
2023
2.13
Aggiornamento dell'interfaccia utente di Dynamo
2022.1
2.12
Aggiunte le impostazioni Archivio dati di unione per gli oggetti
Nuovi nodi per il controllo dell'unione di oggetti
2022
2.10
Inclusione nell'installazione principale di Civil 3D
Transizione da IronPython a Python.NET
2021
2.5
2020.2
2.4
2020 Update 2
2.4
Nuovi nodi aggiunti
2020.1
2.2
2020
2.1
Rilascio iniziale
È stato detto in precedenza che i nodi sono i blocchi predefiniti principali di un grafico di Dynamo e sono organizzati in gruppi logici nella libreria. In Dynamo for Civil 3D, sono presenti due categorie (o scaffali) nella libreria che contengono nodi dedicati per l'utilizzo di oggetti di AutoCAD e Civil 3D, quali tracciati, profili, modellatori, riferimenti di blocco e così via. Il resto della libreria contiene nodi che sono di natura più generica e sono coerenti tra tutte le "versioni" di Dynamo (ad esempio, Dynamo per Revit, Dynamo Sandbox e così via).
Per ulteriori informazioni sull'organizzazione dei nodi nella libreria di Dynamo principale, consultare la sezione .
Nodi specifici per l'utilizzo di oggetti di AutoCAD e Civil 3D
Nodi generici
Nodi di pacchetti di terze parti che è possibile installare separatamente
Utilizzando i nodi presenti negli scaffali di AutoCAD e Civil 3D, il grafico di Dynamo funzionerà solo in Dynamo for Civil 3D. Se un grafico di Dynamo for Civil 3D viene aperto altrove (ad esempio, in Dynamo per Revit), questi nodi verranno contrassegnati con un avviso e non verranno eseguiti.
Perché sono presenti due scaffali separati per AutoCAD e Civil 3D?
Questa organizzazione distingue i nodi per gli oggetti nativi di AutoCAD (linee, polilinee, riferimenti di blocco e così via) dai nodi per gli oggetti di Civil 3D (tracciati, modellatori, superfici e così via). Dal punto di vista tecnico, AutoCAD e Civil 3D sono due cose separate: AutoCAD è l'applicazione di base e Civil 3D si basa su essa.
Per utilizzare i nodi di AutoCAD e Civil 3D, è importante avere una conoscenza approfondita della gerarchia degli oggetti all'interno di ogni scaffale. Vi ricordate la tassonomia in biologia? Regno, phylum, classe, ordine, famiglia, genere, specie? Gli oggetti di AutoCAD e Civil 3D vengono classificati in modo simile. Esaminiamo alcuni esempi da spiegare.
Utilizziamo un tracciato come esempio.
Si supponga che l'obiettivo sia quello di modificare il nome del tracciato. Da qui, il nodo successivo che si desidera aggiungere è un nodo CivilObject.SetName.
All'inizio, questo potrebbe non sembrare molto intuitivo. Che cos'è CivilObject e perché la libreria non dispone di un nodo Alignment.SetName? La risposta è legata alla riutilizzabilità e alla semplicità. Se ci si pensa, il processo di modifica del nome di un oggetto di Civil 3D è lo stesso, sia che si tratti di un tracciato, un modellatore, un profilo o un altro elemento. Pertanto, invece di avere nodi ripetitivi che essenzialmente fanno tutti la stessa cosa (ad esempio, Alignment.SetName, Corridor.SetName, Profile.SetName e così via), sarebbe opportuno racchiudere tale funzionalità in un singolo nodo. Questo è esattamente ciò che fa CivilObject.SetName.
Un altro modo per riflettere su questo aspetto è in termini di relazioni. Un tracciato e un modellatore sono tipi di Oggetti Civil, come una mela e una pera sono tipi di frutta. I nodi CivilObject si applicano a qualsiasi tipo di oggetto di Civil, proprio come se si volesse utilizzare un unico sbucciatore per sbucciare una mela e di una pera. La cucina diventerebbe piuttosto disordinata se si avesse uno sbucciatore separato per ogni tipo di frutta! In questo senso, la libreria dei nodi di Dynamo è simile alla cucina.
Ora, facciamo un passo avanti. Supponiamo di voler modificare il layer del tracciato. Il nodo che si desidera utilizzare è il nodo Object.SetLayer.
Perché non è presente un nodo denominato CivilObject.SetLayer? Gli stessi principi di riutilizzabilità e semplicità di cui abbiamo parlato prima si applicano qui. La proprietà layer è comune a qualsiasi oggetto di AutoCAD che può essere disegnato o inserito, ad esempio linea, polilinea, pesto, riferimento di blocco e così via. Gli oggetti di Civil 3D, quali tracciati e modellatori, rientrano nella stessa categoria, pertanto qualsiasi nodo che si applica ad un Object può essere utilizzato anche con qualsiasi CivilObject.
L'utilizzo di punti COGO e gruppi di punti in Civil 3D è un elemento fondamentale di molti processi dall'inizio alla fine dei lavori. Dynamo si contraddistingue davvero quando si tratta di gestione dei dati; verrà illustrato un caso di utilizzo potenziale in questo esempio.
Utilizzo di elenchi
Raggruppamento di oggetti simili con il nodo List.GroupByKey
Visualizzazione dell'output personalizzato nel Lettore Dynamo
Questo grafico verrà eseguito su Civil 3D 2020 e versioni successive.
Iniziare scaricando i file di esempio riportati qui sotto, quindi aprendo il file DWG e il grafico di Dynamo.
Ecco una panoramica della logica di questo grafico.
Ottenere tutti i punti COGO nel documento
Raggruppare i punti COGO per descrizione
Creare gruppi di punti
Generare un riepilogo nel Lettore Dynamo
Procediamo!
Il primo passaggio consiste nell'ottenere tutti i gruppi di punti nel documento, quindi tutti i punti COGO all'interno di ciascun gruppo. In questo modo verrà fornito un elenco nidificato o un "elenco di elenchi", che sarà più semplice utilizzare in un secondo momento se si riduce la nidificazione di tutto trasformandolo in un unico elenco con il nodo List.Flatten.
Ora che si dispone di tutti i punti COGO, occorre separarli in gruppi in base alle loro descrizioni. Questo è esattamente ciò che fa il nodo List.GroupByKey. In pratica raggruppa eventuali elementi che condividono la stessa chiave.
Il lavoro duro è finito! Il passaggio finale consiste nella creazione di nuovi gruppi di punti Civil 3D dai punti COGO raggruppati.
Quando si esegue il grafico, non c'è nulla da vedere nell'anteprima di sfondo di Dynamo perché non stiamo lavorando con la geometria. L'unico modo per vedere se il grafico viene eseguito correttamente è controllare l'Area strumenti o osservare le anteprime di output dei nodi. Tuttavia, se si esegue il grafico utilizzando il Lettore Dynamo, è possibile fornire ulteriori commenti sui risultati del grafico generando un riepilogo dei gruppi di punti creati. È sufficiente fare clic con il pulsante destro del mouse su un nodo e impostarlo su È output. In questo caso, per visualizzare i risultati viene utilizzato un nodo Watch rinominato.
Di seguito è riportato un esempio di esecuzione del grafico mediante il Lettore Dynamo.
Ecco alcune idee su come espandere le funzionalità di questo grafico.
Modificare il raggruppamento di punti in modo che si basi sulla descrizione completa anziché sulla descrizione non elaborata.
Raggruppare i punti in altre categorie predefinite scelte (ad esempio, "Foto del suolo", "Monumenti" e così via).
Creare automaticamente superfici TIN per i punti in determinati gruppi.
Uno dei molti casi di utilizzo importanti di Dynamo è il posizionamento dinamico di oggetti distinti lungo un modello di modellatore. Spesso è necessario posizionare gli oggetti in punti indipendenti dagli assiemi inseriti lungo il modellatore, un compito molto noioso da svolgere manualmente. E quando la geometria orizzontale o verticale del modellatore cambia, ciò comporta una notevole mole di rilavorazione.
Lettura dei dati da un file esterno (in questo caso Excel)
Organizzazione dei dati nei dizionari
Utilizzo di sistemi di coordinate per controllare posizione/scala/rotazione
Inserimento di riferimenti di blocco
Visualizzazione della geometria in Dynamo
Questo grafico verrà eseguito su Civil 3D 2020 e versioni successive.
Iniziare scaricando i file di esempio riportati qui sotto, quindi aprendo il file DWG e il grafico di Dynamo.
È consigliabile salvare il file Excel nella stessa directory del grafico di Dynamo.
Ecco una panoramica della logica di questo grafico.
Leggere il file Excel e importare i dati in Dynamo
Ottenere le linee caratteristiche dalla linea base del modellatore specificata
Generare sistemi di coordinate lungo la linea caratteristica del modellatore in corrispondenza delle progressive desiderate
Utilizzare i sistemi di coordinate per posizionare i riferimenti di blocco nello spazio modello
Procediamo!
In questo grafico di esempio, si utilizzerà un file Excel per memorizzare i dati impiegati da Dynamo per posizionare i riferimenti di blocco dei lampioni. La tabella ha questo aspetto.
L'utilizzo di Dynamo per la lettura dei dati da un file esterno (ad esempio un file Excel) è una strategia ottimale, soprattutto quando i dati devono essere condivisi con altri membri del team.
I dati di Excel vengono importati in Dynamo in questo modo.
Ora che sono disponibili i dati, è necessario suddividerli per colonna (Corridor, Baseline, PointCode e così via) in modo che possano essere utilizzati nel resto del grafico. Un metodo comune per eseguire questa operazione consiste nell'utilizzare il nodo List.GetItemAtIndex e specificare il numero di indice di ogni colonna desiderata. Ad esempio, la colonna Corridor si trova all'indice 0, la colonna Baseline all'indice 1 e così via.
Sembra a posto, giusto? Ma c'è un potenziale problema con questo approccio. Cosa succede se l'ordine delle colonne nel file Excel cambia in futuro? Oppure tra due colonne ne viene aggiunta una nuova? Il grafico non funzionerà correttamente e richiederà un aggiornamento. È proteggere il grafico in futuro inserendo i dati in un dizionario, con le intestazioni di colonna di Excel come keys e gli altri dati come values.
In questo modo il grafico risulta più resiliente, perché consente di cambiare l'ordine delle colonne in Excel con una certa flessibilità. Finché le intestazioni di colonna rimangono invariate, è possibile recuperare i dati dal dizionario utilizzando key (ovvero l'intestazione di colonna), che è la procedura successiva.
Ora che i dati di Excel sono stati importati e sono pronti, iniziare a utilizzarli per ottenere da Civil 3D alcune informazioni sui modelli di modellatore.
Selezionare il modello di modellatore in base al nome.
Ottenere una linea base specifica all'interno del modellatore.
Ottenere una linea caratteristica all'interno della linea base secondo il relativo codice punto.
Ora si procederà alla generazione di sistemi di coordinate lungo le linee caratteristiche del modellatore in corrispondenza dei valori di progressiva specificati nel file Excel. Questi sistemi di coordinate verranno utilizzati per definire la posizione, la rotazione e la scala dei riferimenti di blocco dei lampioni.
Si noti che qui viene utilizzato un blocco di codice per ruotare i sistemi di coordinate in base al lato della linea base su cui si trovano. Si potrebbe ottenere questo risultato utilizzando una sequenza di più nodi, ma questo è un buon esempio di una situazione in cui è più facile scriverlo.
È quasi fatta! Si hanno tutte le informazioni necessarie per poter collocare effettivamente i riferimenti di blocco. La prima cosa da fare è ottenere le definizioni di blocco che si desidera utilizzare nella colonna BlockName del file Excel.
Da qui, l'ultimo passaggio consiste nella creazione dei riferimenti di blocco.
Quando si esegue il grafico, dovrebbero essere visualizzati nuovi riferimenti di blocco nello spazio modello lungo il modellatore. Ed ecco la parte più interessante. Se la modalità di esecuzione del grafico è impostata su Automatica e si modifica il file Excel, i riferimenti di blocco vengono aggiornati automaticamente.
Di seguito è riportato un esempio di esecuzione del grafico mediante il Lettore Dynamo.
Può essere utile visualizzare la geometria del modellatore in Dynamo per fornire un contesto. In questo particolare modello i solidi del modellatore sono già stati estratti nello spazio modello, pertanto verranno importati in Dynamo.
Ma c'è qualcos'altro che occorre considerare. I solidi sono di un tipo geometrico relativamente "pesante", il che significa che questa operazione rallenta il grafico. Sarebbe bello se esistesse un modo semplice per scegliere se si desidera visualizzare o meno i solidi. La risposta ovvia è semplicemente scollegare il nodo Corridor.GetSolids, ma in questo modo verranno generati avvisi per tutti i nodi a valle, il che crea un po' di confusione. Questa è una situazione in cui il nodo ScopeIf ha un ruolo fondamentale.
Notare che il nodo Object.Geometry mostra una barra grigia nella parte inferiore. Ciò significa che l'anteprima del nodo è disattivata (accessibile facendo clic con il pulsante destro del mouse sul nodo), il che consente a GeometryColor.ByGeometryColor di evitare di "contendersi" con altra geometria la priorità di visualizzazione nell'anteprima di sfondo.
Il nodo ScopeIf consente in sostanza di eseguire un intero ramo di nodi in modo selettivo. Se l'input test è false, non verrà eseguito alcun nodo connesso al nodo ScopeIf.
Di seguito è riportato il risultato dell'anteprima di sfondo di Dynamo.
Ecco alcune idee su come espandere le funzionalità di questo grafico.
Aggiungere una colonna rotation al file Excel e utilizzarla per guidare la rotazione dei sistemi di coordinate.
Aggiungere offset orizzontali o verticali al file Excel in modo che i lampioni possano deviare dalla linea caratteristica del modellatore, se necessario.
Anziché utilizzare un file Excel con valori di progressiva, generare i valori di progressiva ** direttamente in Dynamo** utilizzando una progressiva iniziale e una spaziatura tipica.
Creare un grafico di Dynamo che inserirà il testo nello spazio modello.
Missione compiuta!
Creare un gruppo di punti per ogni descrizione di punto COGO univoca.
Se non si ha familiarità con gli elenchi, consultare la sezione .
Se non si conosce il Lettore Dynamo, consultare la sezione .
Missione compiuta!
Posizionare i riferimenti di blocco dei lampioni lungo un modellatore in corrispondenza dei valori di progressiva specificati in un file Excel.
Se non si conoscono i dizionari, consultare la sezione .
Se non si conoscono i sistemi di coordinate, consultare la sezione .
Se non si conoscono i blocchi di codice, consultare la sezione .
È possibile leggere ulteriori informazioni sulle modalità di esecuzione del grafico nella sezione .
Se non si conosce il Lettore Dynamo, consultare la sezione .
Missione compiuta!
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.
Il Lettore Dynamo fornisce un metodo semplificato per eseguire i grafici di Dynamo in Civil 3D. Una volta creati i grafici, non è necessaria alcuna esperienza con Dynamo per utilizzare il lettore ed eseguire i grafici. In questo modo è più semplice condividere grafici con altri utenti che potrebbero non essere interessati a esplorare i dettagli di nodi e fili.
Per ulteriori informazioni sul Lettore Dynamo in Civil 3D, consultare la documentazione fornita nel sito Guida di Autodesk Civil 3D.
I pacchetti di Dynamo sono set di strumenti sviluppati da terze parti per estendere le funzionalità principali di Dynamo. Sono accessibili a tutti e sono pronti per il download con un semplice clic del pulsante.
Per ulteriori informazioni su come iniziare ad utilizzare i pacchetti, consultare la sezione Pacchetti.
Di seguito è riportato un elenco di alcuni dei pacchetti più diffusi che possono portare i grafici di Dynamo for Civil 3D al livello successivo.
Civil 3D Toolkit è un pacchetto di Dynamo for Civil 3D che fornisce miglioramenti significativi alle funzionalità di Dynamo grazie ad un ampio inventario di nodi aggiuntivi.
Camber è un pacchetto di Dynamo for Civil 3D open source che include centinaia di nodi per l'utilizzo di etichette, xrif, collegamenti ai dati, stili e altro ancora.
CivilConnection è un pacchetto di Dynamo per Revit open source che consente lo scambio di informazioni tra Civil 3D, Dynamo e Revit.
Arkance Systems Nodes è un pacchetto di Dynamo for Civil 3D con un'ampia gamma di nodi utili per l'utilizzo di quote, tabelle, viste, Drill Control e altro ancora.
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.
Considerare questo grafico che crea un cerchio nello spazio modello sul layer corrente.
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.
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 #binding-settings di seguito).
Dopo aver apportato questa modifica, otteniamo il funzionamento desiderato.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Se non si conosce il Lettore Dynamo, consultare la sezione Lettore Dynamo.
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.
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.
Lo sviluppo di sagome cinematiche per la convalida dello spazio libero è una parte importante della progettazione ferroviaria. Dynamo può essere utilizzato per generare solidi per la sagoma anziché creare e gestire sottoassiemi complessi di modellatori per eseguire il processo.
Utilizzo delle linee caratteristiche del modellatore
Trasformazione della geometria tra sistemi di coordinate
Creazione di solidi tramite loft
Controllo del funzionamento dei nodi con le impostazioni di collegamento
Questo grafico verrà eseguito su Civil 3D 2020 e versioni successive.
Iniziare scaricando i file di esempio riportati qui sotto, quindi aprendo il file DWG e il grafico di Dynamo.
Ecco una panoramica della logica di questo grafico.
Ottenere le linee caratteristiche dalla linea base del modellatore specificata
Generare sistemi di coordinate lungo la linea caratteristica del modellatore con la spaziatura desiderata
Trasformare la geometria del blocco del profilo in sistemi di coordinate
Eseguire il loft di un solido tra i profili
Creare i solidi in Civil 3D
Procediamo!
Il primo passaggio consiste nell'ottenere i dati sul modellatore. Selezionare il modello di modellatore in base al nome, ottenere una linea base specifica all'interno del modellatore e ottenere una linea caratteristica all'interno della linea base secondo il relativo codice punto.
Ora si procederà alla generazione di sistemi di coordinate lungo le linee caratteristiche del modellatore tra una progressiva iniziale e una progressiva finale. Questi sistemi di coordinate verranno utilizzati per allineare la geometria del blocco del profilo del veicolo al modellatore.
Notare il valore XXX nell'angolo inferiore destro del nodo. Ciò significa che le impostazioni di collegamento del nodo sono impostate su Globale, operazione che è necessaria per generare i sistemi di coordinate in corrispondenza degli stessi valori di progressiva per entrambe le linee caratteristiche.
Ora è necessario creare in qualche modo una serie di profili di veicoli lungo le linee caratteristiche. Si procederà alla trasformazione della geometria dalla definizione di blocco del profilo del veicolo utilizzando il nodo Geometry.Transform. Questo è un concetto complesso da visualizzare, quindi prima di osservare i nodi, ecco un grafico che mostra cosa succederà.
Quindi essenzialmente si tratta di "prendere" la geometria di Dynamo da una singola definizione di blocco e di spostarla/ruotarla, creando al contempo una serie lungo la linea caratteristica. Forte! Ecco come appare la sequenza di nodi.
In questo modo la definizione di blocco viene ottenuta dal documento.
Questi nodi ottengono la geometria di Dynamo degli oggetti all'interno del blocco.
Questi nodi definiscono essenzialmente il sistema di coordinate da cui si sta trasformando la geometria.
Infine, questo nodo esegue il lavoro effettivo di trasformazione della geometria.
Notare il collegamento Più lungo su questo nodo.
Ed ecco cosa si ottiene in Dynamo.
Buone notizie! Il lavoro duro è finito. Ora è sufficiente generare solidi tra i profili. Ciò è facilmente possibile con il nodo Solid.ByLoft.
Ed ecco il risultato. Tenere presente che questi sono solidi di Dynamo, ma è comunque necessario crearli in Civil 3D.
Il passaggio finale consiste nell'eseguire l'output dei solidi generati nello spazio modello. Verrà anche applicato del colore per renderli facilmente visibili.
Di seguito è riportato un esempio di esecuzione del grafico mediante il Lettore Dynamo.
Ecco alcune idee su come espandere le funzionalità di questo grafico.
Aggiungere la possibilità di utilizzare intervalli di progressive differenti separatamente per ogni binario.
Dividere i solidi in segmenti più piccoli che possono essere analizzati singolarmente per ricercare eventuali interferenze.
Verificare se i solidi della sagoma si intersecano con gli oggetti e colorano quelli che incontrano.
Utilizzare un blocco del profilo del veicolo per generare solidi 3D della sagoma dello spazio libero lungo un modellatore.
Se non si conoscono i sistemi di coordinate, consultare la sezione .
Se non si conosce il collegamento di nodi, consultare la sezione .
Se non si conosce il Lettore Dynamo, consultare la sezione .
Missione compiuta!
Quando si aggiungono tubi e strutture ad una rete di tubazioni, in Civil 3D viene utilizzato un modello per assegnare automaticamente i nomi. In genere, ciò è sufficiente durante il posizionamento iniziale, ma inevitabilmente i nomi dovranno cambiare in futuro man mano che il progetto si evolve. Inoltre, potrebbero essere necessari molti modelli di denominazione diversi, ad esempio nominare in modo sequenziale le strutture all'interno di un ramo a partire dalla struttura più a valle o seguire un modello di denominazione che sia allineato con lo schema di dati di un'agenzia locale. Questo esempio dimostrerà come Dynamo può essere utilizzato per definire qualsiasi tipo di strategia di denominazione che possa essere applicata in modo coerente.
Utilizzo delle caselle di delimitazione
Filtraggio dei dati mediante il nodo List.FilterByBoolMask
Ordinamento dei dati mediante il nodo List.SortByKey
Generazione e modifica di stringhe di testo
Questo grafico verrà eseguito su Civil 3D 2020 e versioni successive.
Iniziare scaricando i file di esempio riportati qui sotto, quindi aprendo il file DWG e il grafico di Dynamo.
Ecco una panoramica della logica di questo grafico.
Selezionare le strutture in base al layer
Ottenere le posizioni delle strutture
Filtrare le strutture per offset, quindi ordinarle in base alla progressiva
Generare i nuovi nomi
Rinominare le strutture
Procediamo!
La prima cosa da fare è selezionare tutte le strutture con cui si intende lavorare. A tale scopo, è sufficiente selezionare tutti gli oggetti su un determinato layer, ovvero le strutture di reti di tubi differenti (supponendo che condividano lo stesso layer).
Questo nodo garantisce che non vengano recuperati accidentalmente eventuali tipi di oggetto indesiderati che potrebbero condividere lo stesso layer delle strutture.
Ora che si hanno le strutture, occorre dove si trovano nello spazio in modo da poterle ordinare in base alla loro posizione. Per eseguire questa operazione, si utilizzerà la casella di delimitazione di ogni oggetto. La casella di delimitazione di un oggetto è il riquadro di dimensioni minime che contiene completamente le estensioni geometriche dell'oggetto. Calcolando il centro della casella di delimitazione, si ottiene un'approssimazione piuttosto buona del punto di inserimento della struttura.
Questi punti verranno utilizzati per ottenere la progressiva e l'offset delle strutture rispetto ad un tracciato selezionato.
Ecco dove le cose iniziano a diventare un po' complicate. A questo punto, si ha un grande elenco di tutte le strutture sul layer specificato ed è stato scelto un tracciato in base al quale ordinarle. Il problema è che nell'elenco potrebbero essere presenti strutture che non si vuole rinominare. Ad esempio, potrebbero non far parte del tratto specifico a cui si è interessati.
Il tracciato selezionato
Le strutture che si desidera rinominare
Le strutture da ignorare
Pertanto, è necessario filtrare l'elenco di strutture in modo da non considerare quelle che sono maggiori di un determinato offset rispetto al tracciato. Per ottenere questo risultato, è meglio utilizzare il nodo List.FilterByBoolMask. Dopo aver filtrato l'elenco di strutture, è possibile utilizzare il nodo List.SortByKey per ordinarle in base ai valori di progressiva.
Se non si conoscono gli elenchi, consultare la sezione Utilizzo di elenchi.
Verificare se l'offset della strutture è inferiore al valore di soglia.
Sostituire eventuali valori null con false.
Filtrare l'elenco di strutture e progressive.
Ordinare le strutture in base alle progressive
L'ultima operazione da eseguire è creare nuovi nomi per le strutture. Il formato che si utilizzerà è <alignment name>-STRC-<number>
. Sono disponibili qui alcuni nodi aggiuntivi per aggiungere nuovi zeri ai numeri, se lo si desidera (ad esempio, "01" anziché "1").
Infine, rinominare le strutture.
Di seguito è riportato un esempio di esecuzione del grafico mediante il Lettore Dynamo.
Se non si conosce il Lettore Dynamo, consultare la sezione Lettore Dynamo.
Può essere utile sfruttare l'anteprima di sfondo 3D di Dynamo per visualizzare gli output intermedi del grafico anziché solo il risultato finale. Una cosa semplice da fare è mostrare le caselle di delimitazione delle strutture. Inoltre, questo particolare set di dati include un modellatore nel documento, pertanto è possibile importare la geometria della linea caratteristica del modellatore in Dynamo per fornire un contesto per il punto in cui le strutture si trovano nello spazio. Se il grafico viene utilizzato in un set di dati che non dispone di modellatori, questi nodi non avranno alcuna funzione.
Ora è possibile capire meglio come funziona il processo di filtraggio delle strutture per offset.
Ecco alcune idee su come espandere le funzionalità di questo grafico.
Rinominare le strutture in base al relativo tracciato più vicino anziché selezionare un tracciato specifico.
Rinominare i tubi oltre alle strutture.
Impostare i layer delle strutture in base al loro tratto.
Il blocco di codice è una funzionalità unica di Dynamo che collega dinamicamente un ambiente di programmazione visiva con uno di programmazione basata su testo. Il blocco di codice ha accesso a tutti i nodi di Dynamo e può definire un intero grafico in un nodo. Leggere attentamente questo capitolo, poiché il blocco di codice è un elemento di base fondamentale di Dynamo.
Dynamo è un ottimo punto da cui iniziare a codificare per il mondo AEC. Si potrebbe essere interessati ad alcune di queste sezioni per iniziare il percorso di codifica:
I blocchi di codice sono una finestra sul mondo di DesignScript, il linguaggio di programmazione al centro di Dynamo. Sviluppato da zero per supportare i workflow di progettazione esplorativa, DesignScript è un linguaggio leggibile e conciso che offre feedback immediato a piccoli bit di codice e si adatta anche a interazioni complesse e di grandi dimensioni. DesignScript costituisce inoltre le fondamenta del motore che controlla la maggior parte degli aspetti di Dynamo "dietro le quinte". Poiché quasi tutte le funzionalità presenti nelle interazioni e nei nodi di Dynamo hanno una relazione uno ad uno con il linguaggio di scripting, esistono opportunità uniche di spostarsi tra le interazioni basate su nodi e lo scripting in modo fluido.
Per i principianti, i nodi possono essere convertiti automaticamente in sintassi di testo per agevolare l'apprendimento di DesignScript o semplicemente per ridurre la dimensione di sezioni più grandi dei grafici. A tale scopo, è necessario utilizzare un processo denominato "Nodo da aggiungere al codice", descritto in dettaglio nella sezione Sintassi di DesignScript. Gli utenti più esperti possono utilizzare i blocchi di codice per creare mashup personalizzati delle funzionalità esistenti e relazioni create dall'utente utilizzando molti paradigmi di codifica standard. Tra il principiante e l'utente avanzato, esistono innumerevoli scorciatoie e frammenti di codice che accelerano i progetti. Sebbene il termine "blocco di codice" possa risultare un po' intimidatorio per gli utenti non esperti di programmazione, è facile da utilizzare ed efficace. Un principiante può utilizzare il blocco di codice in modo efficiente con una codifica minima e un utente avanzato può definire definizioni di script da richiamare altrove in una definizione di Dynamo.
In breve, i blocchi di codice sono un'interfaccia dello scripting di testo all'interno di un ambiente di scripting visivo. Possono essere utilizzati come numeri, stringhe, formule e altri tipi di dati. Il blocco di codice è stato progettato per Dynamo, pertanto è possibile definire variabili arbitrarie nel blocco di codice e tali variabili vengono aggiunte automaticamente agli input del nodo:
Con i blocchi di codice, un utente ha la flessibilità di decidere come specificare gli input. Di seguito sono riportati diversi modi per creare un punto base con le coordinate (10, 5, 0):
Man mano che si acquisiscono ulteriori informazioni sulle funzioni disponibili nella libreria, si potrebbe persino scoprire che la digitazione di Point.ByCoordinates è più rapida rispetto alla ricerca nella libreria e all'individuazione del nodo appropriato. Quando si digita Point ad esempio, in Dynamo verrà visualizzato un elenco di possibili funzioni da applicare ad un punto. Ciò rende più intuitivo lo scripting e aiuterà ad imparare come applicare le funzioni in Dynamo.
Il blocco di codice è disponibile in Core > Input > Actions > Code Block. Ma per una procedura ancora più veloce per visualizzare il blocco di codice, è sufficiente fare doppio clic nell'area di disegno. Questo nodo viene utilizzato così spesso che dispone di tutte le funzioni accessibili con il doppio clic del mouse.
Anche i blocchi di codice sono flessibili rispetto ai tipi di dati. L'utente può definire rapidamente numeri, stringhe e formule e il blocco di codice fornirà l'output desiderato.
Nella seguente immagine, è possibile vedere che il modo di eseguire le operazioni della "vecchia scuola" è leggermente più lungo: l'utente cerca il nodo desiderato nell'interfaccia, aggiunge il nodo all'area di disegno e quindi inserisce i dati. Con il blocco di codice, l'utente può fare doppio clic nell'area di disegno per estrarre il nodo e digitare il tipo di dati corretto con la sintassi di base.
I nodi Number, String e Formula sono tre esempi di nodi di Dynamo che risultano probabilmente obsoleti rispetto al blocco di codice.
"Vecchia scuola"
Code Block
La progettazione ingegneristica di un tipico complesso residenziale prevede prevede la collaborazione con diversi impianti di pubblica utilità sotterranei, come le fognature, lo scarico delle acque piovane, l'acqua potabile o altri. In questo esempio si dimostrerà come Dynamo può essere utilizzato per disegnare le connessioni dei servizi da una conduttura di distribuzione ad un determinato lotto (ad esempio, una particella). È frequente che ogni lotto richieda una connessione dei servizi, il che comporta un notevole e noioso lavoro di posizionamento di tutti i servizi. Dynamo può accelerare il processo disegnando automaticamente la geometria necessaria con precisione, oltre a fornire input flessibili che possono essere adattati agli standard delle agenzie locali.
Utilizzo del nodo Select Object per l'input dell'utente
Utilizzo dei sistemi di coordinate
Utilizzo di operazioni geometriche quali Geometry.DistanceTo e Geometry.ClosestPointTo
Creazione di riferimenti di blocco
Controllo delle impostazioni di unione di oggetti
Questo grafico verrà eseguito su Civil 3D 2020 e versioni successive.
Iniziare scaricando i file di esempio riportati qui sotto, quindi aprendo il file DWG e il grafico di Dynamo.
Ecco una panoramica della logica di questo grafico.
Ottenere la geometria della curva per la conduttura di distribuzione
Ottenere la geometria della curva di una linea del lotto selezionata dall'utente, invertendola se necessario
Generare i punti di inserimento per i contatori
Ottenere i punti sulla conduttura di distribuzione più vicini alle posizioni dei contatori
Creare riferimenti di blocco e linee nello spazio modello
Procediamo!
Il primo passaggio consiste nel caricare la geometria per la conduttura di distribuzione in Dynamo. Anziché selezionare singole linee o polilinee, si otterranno tutti gli oggetti su un determinato layer e li si unirà come PolyCurve di Dynamo.
Se non si conosce la geometria della curva di Dynamo, consultare la sezione Curve.
Successivamente, è necessario caricare in Dynamo la geometria per una linea del lotto selezionata, in modo da potervi lavorare. Lo strumento giusto per il processo è il nodo Select Object, che consente all'utente del grafico di selezionare un oggetto specifico in Civil 3D.
Occorre anche gestire un potenziale problema che potrebbe sorgere. La linea del lotto ha un punto iniziale e un punto finale, il che significa che ha una direzione. Affinché il grafico produca risultati coerenti, è necessario che tutte le linee del lotto abbiano una direzione coerente. È possibile tenere conto di questa condizione direttamente nella logica del grafico, il che rende il grafico più resiliente.
Ottenere i punti iniziale e finale della linea del lotto.
Misurare la distanza da ogni punto alla conduttura di distribuzione, quindi determinare quale distanza è maggiore.
Il risultato desiderato è che il punto iniziale della linea è più vicino alla conduttura di distribuzione. In caso contrario, si inverte la direzione della linea del lotto. Altrimenti, è sufficiente tornare alla linea del lotto originale.
È arrivato il momento di capire dove verranno posizionati i contatori. In genere, il posizionamento è determinato dai requisiti dell'agenzia locale, pertanto è sufficiente fornire valori di input che possono essere modificati in base alle diverse condizioni. Utilizzeremo un sistema di coordinate lungo la linea del lotto come riferimento per la creazione dei punti. In questo modo è molto semplice definire gli offset rispetto alla linea del lotto, indipendentemente dall'orientamento.
Se non si conoscono i sistemi di coordinate, consultare la sezione Vettore, piano e sistema di coordinate.
Ora è necessario individuare i punti sulla conduttura di distribuzione più vicini alle posizioni dei contatori. In questo modo, è possibile disegnare le connessioni dei servizi nello spazio modello in modo che siano sempre perpendicolari alla conduttura di distribuzione. Il nodo Geometry.ClosestPointTo è la soluzione perfetta.
Questa è la PolyCurve della conduttura di distribuzione.
Questi sono i punti di inserimento dei contatori.
L'ultimo passaggio consiste nel creare effettivamente oggetti nello spazio modello. Si utilizzeranno i punti di inserimento generati in precedenza per creare i riferimenti di blocco, quindi si passerà ai punti presenti sulla conduttura di distribuzione per disegnare le linee sulle connessioni dei servizi.
Quando si esegue il grafico, dovrebbero essere visualizzati nuovi riferimenti di blocco e nuove linee di connessione dei servizi nello spazio modello. Provare a modificare alcuni input e a controllare che tutto venga aggiornato automaticamente.
Si può notare che dopo aver posizionato gli oggetti per una linea del lotto, selezionando una diversa gli oggetti vengono "spostati".
Si tratta del funzionamento di default di Dynamo ed è molto utile in molti casi. Tuttavia, è possibile che si vogliano posizionare diverse connessioni dei servizi in sequenza e fare in modo che Dynamo crei nuovi oggetti ad ogni esecuzione anziché modificare quelle originali. È possibile controllare questo funzionamento modificando le impostazioni di unione di oggetti.
Per ulteriori informazioni, consultare la sezione Unione di oggetti.
La modifica di questa impostazione forzerà Dynamo a "dimenticare" gli oggetti che crea ad ogni esecuzione. Di seguito è riportato un esempio di esecuzione del grafico con l'unionee di oggetti disattivata utilizzando il Lettore Dynamo.
Se non si conosce il Lettore Dynamo, consultare la sezione Lettore Dynamo.
Ecco alcune idee su come espandere le funzionalità di questo grafico.
Posizionare più collegamenti dei servizi contemporaneamente anziché selezionare ogni linea del lotto.
Regolare gli input per posizionare invece sportelli di ispezione per fognature anziché i contatori del servizio idrico.
Aggiungere un pulsante di commutazione per consentire il posizionamento di una singola connessione dei servizi su un lato particolare della linea del lotto anziché su entrambi i lati.
Questa Guida introduttiva è solo l'inizio del viaggio alla scoperta di Dynamo for Civil 3D. Una fiorente comunità di utenti di Dynamo mette a disposizione una grande quantità di conoscenze. Esaminare alcune di queste risorse per continuare ad imparare.
Rinominare le strutture della rete di tubi in ordine in base alla progressiva di un tracciato.
Missione compiuta!
Posizionare i riferimenti di blocco del contatore del servizio idrico in corrispondenza degli offset specificati da una linea del lotto e disegnare una linea per ogni connessione dei servizi perpendicolare alla conduttura di distribuzione.
Missione compiuta!
Nei nomi dei nodi di Dynamo è possibile aver notato un tema comune: ogni nodo utilizza una sintassi "." senza spazi. Questo perché il testo nella parte superiore di ogni nodo rappresenta la sintassi effettiva per lo scripting e "." (o notazione con punto) separa un elemento dai metodi possibili che è possibile chiamare. In questo modo è possibile creare una facile conversione dallo scripting visivo nello scripting basato su testo.
Come analogia generale per la notazione con punto, in che modo è possibile gestire una mela parametrica in Dynamo? Di seguito sono riportati alcuni metodi che si eseguiranno sulla mela prima di decidere di mangiarla (nota: questi non sono metodi di Dynamo effettivi):
Di che colore è la mela?
Apple.color
rosso
La mela è matura?
Apple.isRipe
true
Quanto pesa la mela?
Apple.weight
170 gr
Da dove è venuta la mela?
Apple.parent
albero
Cosa crea la mela?
Apple.children
semi
Questa mela è cresciuta localmente?
Apple.distanceFromOrchard
circa 96 km
Non so quello che pensate, ma a giudicare dagli output nella tabella riportata sopra, sembra una mela gustosa. Il risultato è Apple.eat().
Tenendo presente l'analogia con la mela, si esaminerà Point.ByCoordinates e sarà mostrato com'è possibile creare un punto utilizzando Code Block.
La sintassi di Code Block Point.ByCoordinates(0,10);
fornisce lo stesso risultato di un nodo Point.ByCoordinates in Dynamo, tranne per il fatto che è possibile creare un punto utilizzando un nodo. Ciò è più efficiente rispetto al collegamento di un nodo separato in X e Y.
Utilizzando Point.ByCoordinates in Code Block, si specificano gli input nello stesso ordine del nodo predefinito (X,Y).
È possibile chiamare qualsiasi nodo normale nella libreria tramite Code Block, purché il nodo non sia un nodo "UI" speciale: quelli con una funzionalità speciale dell'interfaccia utente. Ad esempio, è possibile chiamare Circle.ByCenterPointRadius, ma non sarebbe molto utile chiamare un nodo Watch 3D.
I nodi regolari (nella maggior parte della libreria) in genere sono di tre tipi. Si scoprirà che la libreria è organizzata in base a queste categorie. I metodi, o nodi, di questi tre tipi vengono trattati in modo diverso quando vengono richiamati all'interno di Code Block.
Crea: consente di creare (o costruire) un elemento.
Azione: consente di eseguire un'azione su un elemento.
Query: consente di ottenere una proprietà di un elemento già esistente.
La categoria Crea costruirà la geometria da zero. I valori vengono immessi in Code Block da sinistra a destra. Questi input sono nello stesso ordine degli input nel nodo dall'alto verso il basso.
Confrontando il nodo Line.ByStartPointEndPoint e la sintassi corrispondente in Code Block, si ottengono gli stessi risultati.
Un'azione è un'operazione che si esegue su un oggetto di quel tipo. In Dynamo si utilizza la notazione con punto, comune a molti linguaggi di codifica, per applicare un'azione ad un elemento. Una volta ottenuto l'elemento, digitare un punto, quindi il nome dell'azione. L'input del metodo di tipo Azione viene inserito tra parentesi, come i metodi di tipo Crea, solo che non è necessario specificare il primo input visualizzato nel nodo corrispondente. È necessario specificare invece l'elemento su cui si sta eseguendo l'azione:
Il nodo Point.Add è un nodo di tipo Azione, pertanto la sintassi funziona in modo leggermente diverso.
Gli input sono (1) Point e (2) Vector da aggiungere ad esso. In Code Block, è stato denominato il punto (l'elemento) "pt". Per aggiungere un vettore denominato *"vec" *a "pt", è necessario scrivere pt.Add(vec) o: elemento, punto, azione. L'azione Add presenta solo un input o tutti gli input del nodo Point.Add meno il primo. Il primo input per il nodo Point.Add è il punto stesso.
I metodi di tipo Query consentono di ottenere una proprietà di un oggetto. Poiché l'oggetto stesso è l'input, non è necessario specificare alcun input. Non sono richieste parentesi.
Il collegamento con i nodi è piuttosto diverso dal collegamento con il blocco di codice. Con i nodi, l'utente fa clic con il pulsante destro del mouse sul nodo e seleziona l'opzione Collegamento da eseguire. Con il blocco di codice, l'utente dispone di un maggiore controllo sulla modalità di strutturazione dei dati. Il metodo abbreviato del blocco di codice utilizza guide di replica per impostare il modo in cui occorre associare diversi elenchi unidimensionali. I numeri tra parentesi angolari "<>" definiscono la gerarchia dell'elenco nidificato risultante: <1>,<2>,<3> e così via.
In questo esempio, si utilizza un metodo abbreviato per definire due intervalli (ulteriori informazioni sul metodo abbreviato saranno fornite nella sezione seguente di questo capitolo). In breve,
0..1;
è equivalente a{0,1}
e-3..-7
è equivalente a{-3,-4,-5,-6,-7}
. Il risultato offre un elenco di 2 valori X e 5 valori Y. Se non si utilizzano le guide di replica con questi elenchi non corrispondenti, si ottiene un elenco di due punti, che rappresenta la lunghezza dell'elenco più breve. Utilizzando le guide di replica, è possibile trovare tutte le combinazioni possibili di 2 e 5 coordinate (o un collegamento Globale).Utilizzando la sintassi Point.ByCoordinates
(x_vals<1>,y_vals<2>);
si ottengono due elenchi con cinque voci in ogni elenco.Utilizzando la sintassi Point.ByCoordinates
(x_vals<2>,y_vals<1>);
si ottengono cinque elenchi con due voci in ogni elenco.
Con questa notazione, è possibile anche specificare quale elenco sarà dominante: 2 elenchi di 5 cose o 5 elenchi di 2 cose. Nell'esempio, la modifica dell'ordine delle guide di replica restituisce come risultato un elenco di righe di punti o un elenco di colonne di punti in una griglia.
Sebbene i metodi del blocco di codice riportati sopra possano richiedere del tempo per acquisire familiarità, in Dynamo è disponibile una funzionalità denominata Nodo da aggiungere al codice che facilita il processo. Per utilizzare questa funzionalità, selezionare una serie di nodi nel grafico di Dynamo, fare clic con il pulsante destro del mouse sull'area di disegno e selezionare Nodo da aggiungere al codice. In Dynamo vengono compressi questi nodi in un blocco di codice, con tutti gli input e gli output. Questo non è solo un ottimo strumento per apprendere il blocco di codice, ma consente anche di utilizzare un grafico di Dynamo più efficiente e parametrico. Per concludere l'esercizio riportato di seguito, utilizzare Nodo da aggiungere al codice.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Per mostrare l'efficacia del blocco di codice, verrà convertita una definizione di campo attrattore esistente nel formato blocco di codice. L'utilizzo di una definizione esistente dimostra come il blocco di codice si correla allo scripting visivo ed è utile per apprendere la sintassi di DesignScript.
Iniziare ricreando la definizione nell'immagine riportata sopra (o aprendo il file di esempio).
Notare che il collegamento in Point.ByCoordinates è stato impostato su Globale.
Ogni punto di una griglia viene spostato verso l'alto nella direzione Z in base alla sua distanza dal punto di riferimento.
Viene ricreata e ispessita una superficie, creando una bombatura nella geometria rispetto alla distanza dal punto di riferimento.
Partendo dall'inizio, definire innanzitutto il punto di riferimento: Point.ByCoordinates
(x,y,0);
. Viene utilizzata la stessa sintassi di Point.ByCoordinates specificata nella parte superiore del nodo del punto di riferimento.Le variabili x e y vengono inserite in Code Block in modo che sia possibile aggiornarle dinamicamente con i dispositivi di scorrimento.
Aggiungere alcuni dispositivi di scorrimento agli input di Code Block che vanno da -50 a 50. In questo modo, è possibile estendersi in tutta la griglia di default di Dynamo.
Nella seconda riga di Code Block, definire una sintassi abbreviata per sostituire il nodo della sequenza numerica:
coordsXY = (-50..50..#11);
. Se ne discuterà più in dettaglio nella prossima sezione. Per il momento, notare che questo metodo abbreviato è equivalente al nodo Number Sequence nello script visivo.
A questo punto, si desidera creare una griglia di punti dalla sequenza coordsXY. A tale scopo, si desidera utilizzare la sintassi di Point.ByCoordinates, ma è anche necessario avviare un collegamento Globale dell'elenco nello stesso modo di quello utilizzato nello script visivo. A tale scopo, digitare la riga:
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
. Le parentesi angolari indicano il riferimento Globale.Notare nel nodo Watch3D che è presente una griglia di punti nella griglia di Dynamo.
Ora per la parte complessa: si desidera spostare la griglia di punti verso l'alto in base alla loro distanza dal punto di riferimento. Innanzitutto, denominare questo nuovo gruppo di punti transPts. E poiché la traslazione è un'azione su un elemento esistente, anziché utilizzare
Geometry.Translate...
, utilizzaregridPts.Translate
.Leggendo dal nodo effettivo nell'area di disegno, si noterà che sono presenti tre input. La geometria da traslare è già stata dichiarata perché si sta eseguendo l'azione su quell'elemento (con gridPts.Translate). I due input rimanenti verranno inseriti tra le parentesi della funzione: direction e distance.
direction è abbastanza semplice. Per spostarla verticalmente, utilizzare
Vector.ZAxis()
.distance tra il punto di riferimento e ogni punto della griglia deve ancora essere calcolata, pertanto è necessario eseguire questa operazione come azione per il punto di riferimento nello stesso modo:
refPt.DistanceTo(gridPts)
.La riga di codice finale fornisce i punti traslati:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
.
Ora si ha una griglia di punti con la struttura di dati appropriata per creare una superficie NURBS. Costruire la superficie utilizzando
srf = NurbsSurface.ByControlPoints(transPts);
.
E infine, per aggiungere profondità alla superficie, costruire un solido utilizzando
solid = srf.Thicken(5);
. In questo caso, la superficie è stata ispessita di 5 unità nel codice, ma la si potrebbe sempre dichiarare come variabile (ad esempio, chiamandola thickness) e poi controllare quel valore con un dispositivo di scorrimento.
La funzionalità Nodo da aggiungere al codice consente di automatizzare l'intero esercizio appena completato facendo clic su un pulsante. Questa funzione non solo è efficiente per la creazione di definizioni personalizzate e blocchi di codice riutilizzabili, ma è anche uno strumento molto utile per apprendere come eseguire lo script in Dynamo:
Iniziare con lo script visivo esistente del passaggio 1 dell'esercizio. Selezionare tutti i nodi, fare clic con il pulsante destro del mouse sull'area di disegno e selezionare Nodo da aggiungere al codice. È semplicissimo.
Dynamo dispone di una versione automatizzata basata su testo del grafico visivo, del collegamento e di tutto il resto. Verificare tutto questo negli script visivi e sfruttare la potenza del blocco di codice.
Nel blocco di codice esistono alcuni metodi di sintassi abbreviata di base che, in poche parole, rendono la gestione dei dati molto più facile. Le nozioni di base riportate di seguito verranno analizzate e sarà descritto come utilizzare questa sintassi abbreviata sia per la creazione che per l'esecuzione di una query sui dati.
Tipo dati
Dynamo standard
Equivalente a Code Block
Numeri
Stringhe
Sequenze
Intervalli
Recupero di una voce nell'indice
Creazione di un elenco
Concatenazione di stringhe
Istruzioni condizionali
Nodo/i
Equivalente a Code Block
Nota
Qualsiasi operatore (+, &&, >=, Not e così via)
+, &&, >=, !, e così via.
Notare che "Not" diventa "!", ma il nodo viene chiamato "Not" per distinguerlo da "Factorial"
Boolean True
true;
Notare la lettera minuscola
Boolean False
false;
Notare la lettera minuscola
Il metodo per la definizione di intervalli e sequenze può essere ridotto ad una sintassi abbreviata di base. Utilizzare l'immagine riportata di seguito come guida per la sintassi "..." per definire un elenco di dati numerici con il blocco di codice. Dopo aver appreso come eseguire questa notazione, la creazione di dati numerici è un processo davvero efficiente:
In questo esempio, un intervallo di numeri viene sostituito dalla sintassi di Code Block di base che definisce
beginning..end..step-size;
. Rappresentata numericamente, si ottiene:0..10..1;
.Notare che la sintassi
0..10..1;
è equivalente a0..10;
. Una dimensione di incremento di 1 è il valore di default per la notazione della sintassi abbreviata. Pertanto,0..10;
darà una sequenza da 0 a 10 con una dimensione di incremento di 1.L'esempio di sequenza è simile, ad eccezione del fatto che viene utilizzato un simbolo "#" per indicare che nell'elenco si desiderano 15 valori, anziché un elenco che arriva fino a 15. In questo caso, si sta definendo:
beginning..#ofSteps..step-size:
. La sintassi effettiva per la sequenza è0..#15..2
.Utilizzando il simbolo "#" del passaggio precedente, è ora possibile posizionarlo nella parte "step-size" della sintassi. Ora, è presente un intervallo di numeri che si estende dall'"inizio" alla "fine" e la notazione "step-size" distribuisce uniformemente un numero di valori tra i due:
beginning..end..#ofSteps
.
La creazione di intervalli avanzati consente di utilizzare l'elenco di elenchi in modo semplice. Negli esempi riportati di seguito, si isola una variabile dalla notazione dell'intervallo primario e si crea un altro intervallo di tale elenco.
1. Creando intervalli nidificati, confrontare la notazione con un simbolo "#" rispetto alla notazione senza. La stessa logica si applica agli intervalli di base, tranne per il fatto che diventa un po' più complesso.
2. È possibile definire un sottointervallo in qualsiasi punto dell'intervallo primario e notare che si possono anche avere due sottointervalli.
3. Controllando il valore di "fine" in un intervallo, si creano più intervalli di lunghezze differenti.
Come esercizio logico, confrontare le due sintassi abbreviate riportate sopra e provare ad analizzare il modo in cui i sottointervalli e la notazione # determinano l'output risultante.
Oltre a creare elenchi con la sintassi abbreviata, è anche possibile creare elenchi al volo. Questo elenco può contenere una vasta gamma di tipi di elementi e può anche essere sottoposto ad una query (ricordare che gli elenchi sono oggetti di per sé). Per riepilogare, con Code Block si creano elenchi e si esegue una query sulle voci di un elenco con le parentesi quadre:
1. Creare rapidamente elenchi con stringhe ed eseguire una query su di essi utilizzando l'indice delle voci.
2. Create elenchi con variabili ed eseguire una query utilizzando la notazione della sintassi abbreviata dell'intervallo.
La gestione di elenchi nidificati è un processo simile. Tenere presente l'ordine dell'elenco e richiamarlo utilizzando più gruppi di parentesi quadre:
1. Definire un elenco di elenchi.
2. Eseguire una query su un elenco con la notazione della parentesi quadra singola.
3. Eseguire una query su una voce con la notazione della parentesi quadra doppia.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esercizio, si mostreranno le nuove competenze in termini di sintassi abbreviata per creare una bizzarra superficie di guscio definita da intervalli e formule. Durante questo esercizio, notare come si utilizzano il blocco di codice e i nodi di Dynamo esistenti contemporaneamente: viene utilizzato il blocco di codice per l'elaborazione di dati di grandi dimensioni, mentre i nodi di Dynamo vengono disposti visivamente per la leggibilità della definizione.
Iniziare creando una superficie collegando i nodi riportati sopra. Anziché utilizzare un nodo del numero per definire la larghezza e la lunghezza, fare doppio clic sull'area di disegno e digitare 100;
in un Code Block.
Definire un intervallo compreso tra 0 e 1 con 50 divisioni digitando
0..1..#50
in un Code Block.Collegare l'intervallo a Surface.PointAtParameter, che utilizza i valori u e v compresi tra 0 e 1 sulla superficie. Ricordarsi di modificare Collegamento in Globale facendo clic con il pulsante destro del mouse sul nodo Surface.PointAtParameter.
In questo passaggio, si utilizza la prima funzione per spostare la griglia di punti verso l'alto nella direzione Z. Questa griglia determinerà una superficie generata in base alla funzione sottostante. Aggiungere nuovi nodi come mostrato nell'immagine seguente.
Anziché utilizzare un nodo di formula, viene utilizzato un Code Block con la riga:
(0..Math.Sin(x*360)..#50)*5;
. Per suddividerlo rapidamente, definire un intervallo con una formula al suo interno. Questa formula è la funzione seno. La funzione seno riceve gli input di gradi in Dynamo, pertanto per ottenere un'onda seno completa, è necessario moltiplicare i valori x (questo è l'input di intervallo da 0 a 1) per 360. Successivamente, si desidera che il numero di divisioni corrisponda a quello dei punti della griglia di controllo per ogni riga, pertanto si definiscono 50 suddivisioni con #50. Infine, il moltiplicatore 5 aumenta semplicemente l'ampiezza della traslazione in modo da poter vedere l'effetto nell'anteprima di Dynamo.
Sebbene il Code Block precedente funzionasse correttamente, non era completamente parametrico. Si desidera animare dinamicamente i relativi parametri, pertanto si sostituirà la riga del passaggio precedente con
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
. In questo modo è possibile definire questi valori in base agli input.
Modificando i dispositivi di scorrimento (compresi tra 0 e 10), si ottengono alcuni risultati interessanti.
Eseguendo una trasposizione sull'intervallo di numeri, si inverte la direzione dell'onda della tenda:
transposeList = List.Transpose(sineList);
.
Quando si aggiungono sineList e tranposeList, viene visualizzata una superficie di guscio distorta:
eggShellList = sineList+transposeList;
.
Modifichiamo i valori dei dispositivi di scorrimento specificati qui sotto per ottenere un algoritmo che consenta un maggiore controllo sulla superficie.
Infine, si esegue una query su parti isolate dei dati con Code Block. Per rigenerare la superficie con un intervallo specifico di punti, aggiungere il blocco di codice riportato sopra tra i nodi Geometry.Translate e NurbsSurface.ByPoints. Contiene la riga di testo: sineStrips[0..15..1];
. Verranno selezionate le prime 16 righe di punti (su 50). Ricreando la superficie, si può vedere che è stata generata una parte isolata della griglia di punti.
Nel passaggio finale, per rendere Code Block più parametrico, eseguire la query utilizzando un dispositivo di scorrimento compreso tra 0 e 1. Questa operazione viene eseguita con la seguente riga di codice:
sineStrips[0..((List.Count(sineStrips)-1)*u)];
. Ciò può sembrare confuso, ma la riga di codice offre un modo rapido per scalare la lunghezza dell'elenco in un moltiplicatore compreso tra 0 e 1.
Un valore di 0.53
nel dispositivo di scorrimento consente di creare una superficie appena oltre il punto medio della griglia.
Come previsto, un dispositivo di scorrimento di 1
crea una superficie dalla griglia completa di punti.
Osservando il grafico visivo, è possibile evidenziare i Code Block e vedere ciascuna delle loro funzioni.
1. Il primo Code Block sostituisce il nodo Number.
2. Il secondo Code Block sostituisce il nodo Range.
3. Il terzo Code Block sostituisce il nodo Formula (nonché List.Transpose, List.Count e Range).
4. Il quarto Code Block esegue una query su un elenco di elenchi, sostituendo il nodo List.GetItemAtIndex.
In questa sezione, è disponibile una serie di lezioni sulla creazione della geometria con DesignScript. Seguire la procedura copiando l'esempio di DesignScript nei blocchi di codice di Dynamo.
Sebbene Dynamo sia in grado di creare una vasta gamma di forme geometriche complesse, le primitive geometriche semplici formano le fondamenta di qualsiasi progettazione computazionale: direttamente espresse nella forma finale progettata o utilizzata come impalcatura dalla quale viene generata una geometria più complessa.
Anche se non è strettamente un elemento di geometria, CoordinateSystem è uno strumento importante per la costruzione della geometria. Un oggetto CoordinateSystem tiene traccia delle trasformazioni geometriche e di posizione, quali rotazione, taglio e messa in scala.
La creazione di un CoordinateSystem centrato in un punto con x = 0, y = 0, z = 0, senza rotazioni, messa in scala o trasformazioni di taglio, richiede semplicemente di chiamare il costruttore Identity:
I CoordinateSystem con trasformazioni geometriche non rientrano nell'ambito di questo capitolo, sebbene un altro costruttore consenta di creare un sistema di coordinate in un punto specifico, CoordinateSystem.ByOriginVectors:
La primitiva geometrica più semplice è un punto, che rappresenta una posizione a zero dimensioni nello spazio tridimensionale. Come detto in precedenza, esistono diversi modi per creare un punto in un particolare sistema di coordinate: Point.ByCoordinates crea un punto con coordinate x, y e z specificate; Point.ByCartesianCoordinates crea un punto con coordinate x, y e z specificate in un sistema di coordinate specifico; Point.ByCylindricalCoordinates crea un punto su un cilindro con raggio, angolo di rotazione e altezza e Point.BySphericalCoordinates crea un punto su una sfera con raggio e due angoli di rotazione.
In questo esempio sono mostrati i punti creati in diversi sistemi di coordinate:
La successiva primitiva di Dynamo dimensionale maggiore è un segmento di linea, che rappresenta un numero infinito di punti tra due punti finali. Le linee possono essere create specificando esplicitamente i due punti di contorno con il costruttore Line.ByStartPointEndPoint o specificando un punto iniziale, una direzione e una lunghezza in tale direzione, Line.ByStartPointDirectionLength.
Dynamo dispone di oggetti che rappresentano i tipi più elementari di primitive geometriche in tre dimensioni: cuboidi, creati con Cuboid.ByLengths; coni, creati con Cone.ByPointsRadius e Cone.ByPointsRadii; cilindri, creati con Cylinder.ByRadiusHeight e sfere create con Sphere.ByCenterPointRadius.
L'analogia bidimensionale con una NurbsCurve è la NurbsSurface e, come la NurbsCurve di forma libera, le NurbsSurface possono essere costruite con due metodi di base: l'inserimento di un insieme di punti base con l'interpolazione di Dynamo tra di essi e l'indicazione esplicita dei punti di controllo della superficie. Come per le curve a mano libera, le superfici interpolate sono utili quando un progettista conosce con precisione la forma che una superficie deve assumere o se un progetto richiede che la superficie attraversi punti di vincolo. Dall'altra parte, le superfici create mediante punti di controllo possono essere più utili per la progettazione esplorativa in diversi livelli di levigatezza.
Per creare una superficie interpolata, è sufficiente generare una raccolta bidimensionale di punti che si avvicinano alla forma di una superficie. La raccolta deve essere rettangolare, ovvero non irregolare. Il metodo NurbsSurface.ByPoints costruisce una superficie da questi punti.
Le NurbsSurface di forma libera possono essere create anche specificando i punti di controllo sottostanti di una superficie. Come per le NurbsCurve, i punti di controllo possono essere considerati come la rappresentazione di una mesh quadrilatera con segmenti retti, che, a seconda del grado della superficie, viene levigata nella forma della superficie finale. Per creare una NurbsSurface tramite punti di controllo, includere due parametri aggiuntivi a NurbsSurface.ByPoints, indicando i gradi delle curve sottostanti in entrambe le direzioni della superficie.
È possibile aumentare il grado della NurbsSurface per modificare la geometria della superficie risultante:
Così come è possibile creare le superfici interpolando un insieme di punti di input, è possibile crearle interpolando un insieme di curve di base. Questa procedura è denominata loft. Viene creata una curva di loft utilizzando il costruttore Surface.ByLoft, con una raccolta di curve di input come unico parametro.
Le superfici di rivoluzione sono un tipo aggiuntivo di superficie creato tramite l'estrusione di una curva di base attorno ad un asse centrale. Se le superfici interpolate sono l'analogia bidimensionale con le curve interpolate, le superfici di rivoluzione sono l'analogia bidimensionale con i cerchi e gli archi.
Le superfici di rivoluzione sono specificate da una curva di base, che rappresenta lo "spigolo" della superficie; l'origine di un asse, il punto base della superficie; la direzione di un asse, la direzione centrale; un angolo iniziale di sweep e un angolo finale di sweep. Questi vengono utilizzati come input per il costruttore Surface.Revolve.
Alcuni oggetti della geometria possono essere creati indicando in modo esplicito le coordinate x, y e z nello spazio tridimensionale. Più spesso, tuttavia, la geometria viene spostata nella sua posizione finale utilizzando le trasformazioni geometriche sull'oggetto stesso o sul relativo CoordinateSystem sottostante.
La trasformazione geometrica più semplice è una traslazione, che sposta un oggetto in base ad un numero specificato di unità nelle direzioni x, y e z.
Sebbene tutti gli oggetti in Dynamo possano essere convertiti aggiungendo il metodo .Translate alla fine del nome dell'oggetto, le trasformazioni più complesse richiedono la trasformazione dell'oggetto da un CoordinateSystem sottostante ad un nuovo CoordinateSystem. Ad esempio, per ruotare un oggetto di 45 gradi attorno all'asse x, è necessario trasformare l'oggetto dal CoordinateSystem esistente senza rotazione ad un CoordinateSystem che è stato ruotato di 45 gradi attorno all'asse x con il metodo .Transform:
Oltre a essere traslati e ruotati, è possibile creare anche CoordinateSystems messi in scala o tagliati. Un CoordinateSystem può essere messa in scala con il metodo .Scale:
I CoordinateSystems tagliati vengono creati mediante l'inserimento di vettori non ortogonali nel costruttore CoordinateSystem.
La messa in scala e il taglio sono trasformazioni geometriche relativamente più complesse rispetto alla rotazione e alla traslazione, pertanto non tutti gli oggetti di Dynamo possono essere sottoposti a queste trasformazioni. Nella seguente tabella sono riportati i contorni degli oggetti di Dynamo che possono presentare CoordinateSystem messi in scala in modo non uniforme e i CoordinateSystem tagliati.
Arco
No
No
NurbsCurve
Sì
Sì
NurbsSurface
No
No
Cerchio
No
No
Linea
Sì
Sì
Piano
No
No
Punto
Sì
Sì
Poligono
No
No
Uniforme
No
No
Superficie
No
No
Testo
No
No
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:
Scrivere DesignScript utilizzando un blocco di codice
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.
Per ulteriori informazioni generali sull'utilizzo di Python in Dynamo, consultare la sezione Python.
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.
AutoCAD .NET API Developer's Guide
Manuale di riferimento dell'API di AutoCAD .NET
Civil 3D .NET API Developer's Guide
Civil 3D .NET API Reference Guide
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.
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.
Importa i moduli
sys
eclr
, entrambi necessari per il corretto funzionamento dell'interprete Python. In particolare, il moduloclr
consente di trattare gli spazi dei nomi .NET essenzialmente come pacchetti Python.Carica gli assiemi standard (ad esempio, DLL) per l'utilizzo delle API .NET gestite per AutoCAD e Civil 3D.
Aggiunge riferimenti agli spazi dei nomi standard di AutoCAD e Civil 3D. Sono equivalenti alle direttive
using
oImports
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 esempiodataInFirstPort = 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.
Personalizzazione
È possibile modificare il modello Python di default modificando il file PythonTemplate.py
che si trova in C:\ProgramData\Autodesk\C3D <versione>\Dynamo
.
Esaminiamo un esempio per dimostrare alcuni dei concetti essenziali della scrittura di script Python in Dynamo for Civil 3D.
Di seguito sono riportati alcuni file di esempio a cui è possibile fare riferimento per questo esercizio.
Ecco una panoramica della logica di questo grafico.
Rivedere la documentazione sull'API di Civil 3D
Selezionare tutti i drenaggi nel documento in base al nome del layer
Annullamento del wrapping degli oggetti di Dynamo per accedere ai membri interni dell'API di Civil 3D
Creare punti di Dynamo da punti di AutoCAD
Crea PolyCurve dai punti
Procediamo!
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 proprietà nella classe Catchment 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ù.
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.
Prima di proseguire, occorre parlare brevemente di un concetto importante. Nella sezione Libreria di nodi, è 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
.
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity
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.
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.
Fare clic sul testo sottolineato nello script per una spiegazione di ogni riga.
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.
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.
Ed ecco la geometria finale di Dynamo.
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.
È possibile leggere ulteriori informazioni su questa transizione e su come aggiornare gli script precedenti nel blog di Dynamo. Se si desidera continuare ad utilizzare IronPython, sarà sufficiente installare il pacchetto DynamoIronPython2.7 utilizzando Dynamo Package Manager.
questa riga ottiene la classe specifica necessaria dalla libreria della geometria di Dynamo. Notare che qui viene specificato import Point as DynPoint
anziché import *
, poiché quest'ultimo introdurrebbe interferenze di denominazione.
qui è possibile specificare esattamente quale porta di input contiene i dati desiderati anziché il valore di default IN
, che fa riferimento all'intero elenco di tutti gli input.
Le funzioni possono essere create in un blocco di codice e richiamate in un altro punto della definizione di Dynamo. In questo modo viene creato un altro livello di controllo in un file parametrico e può essere visualizzato come versione basata su testo di un nodo personalizzato. In questo caso, il blocco di codice "principale" è facilmente accessibile e può essere posizionato ovunque nel grafico. Non sono necessari i fili.
La prima riga contiene la parola chiave "def", il nome della funzione e i nomi degli input tra parentesi. Le parentesi graffe definiscono il corpo della funzione. Restituiscono un valore con "return =". I blocchi di codice che definiscono una funzione non presentano porte di input o output, in quanto vengono chiamati da altri blocchi di codice.
Chiamano la funzione con un altro blocco di codice nello stesso file, assegnando lo stesso nome e lo stesso numero di argomenti. Funzionano come i nodi predefiniti nella libreria.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esercizio verrà eseguita una definizione generica che creerà sfere da un elenco di input di punti. Il raggio di queste sfere viene gestito dalla proprietà Z di ogni punto.
Iniziare con un numero di dieci valori compresi tra 0 e 100. Collegarli ai nodi Point.ByCoordinates per creare una linea diagonale.
Creare un Code Block e introdurre la definizione.
Utilizzare queste righe di codice:
inputPt è il nome fornito per rappresentare i punti che controlleranno la funzione. Per ora, la funzione non sta eseguendo alcuna operazione, ma si costruirà questa funzione nei prossimi passaggi.
Alla funzione Code Block, si aggiungono un commento e una variabile sphereRadius che esegue una query sulla posizione Z di ogni punto. Tenere presente che inputPt.Z non richiede parentesi come metodo. Si tratta di una query sulle proprietà di un elemento esistente, pertanto non sono necessari input:
Ora, richiamare la funzione che è stata creata in un altro Code Block. Se si fa doppio clic sull'area di disegno per creare un nuovo Code Block e si digita sphereB, si noterà che Dynamo suggerisce la funzione sphereByZ definita. La funzione è stata aggiunta alla libreria di IntelliSense. Ottimo.
Ora richiamare la funzione e creare una variabile denominata Pt per collegare i punti creati nei passaggi precedenti:
Dall'output si noterà che tutti i valori sono nulli. Perché? Quando è stata definita la funzione, si stava calcolando la variabile sphereRadius, ma non è stato definito che cosa la funzione dovrebbe restituire come output. È possibile risolvere il problema nel passaggio successivo.
Un passaggio importante: è necessario definire l'output della funzione aggiungendo la riga
return = sphereRadius;
alla funzione sphereByZ.Ora si può vedere che l'output di Code Block fornisce le coordinate Z di ciascun punto.
Procedere alla creazione di sfere effettive modificando la funzione principale.
Per prima cosa si definisce una sfera con la riga di codice:
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
.Successivamente, si modifica il valore restituito in modo che sia sphere anziché sphereRadius:
return = sphere;
. In questo modo vengono restituite alcune sfere giganti nell'anteprima di Dynamo.
1. Per ridurre le dimensioni di queste sfere, aggiornare il valore sphereRadius aggiungendo un divisore:
sphereRadius = inputPt.Z/20;
. Ora è possibile vedere le sfere separate. Inizia ad avere un senso la relazione tra il raggio e il valore Z.
Nel nodo Point.ByCoordinates, modificando il collegamento da Più breve a Globale, verrà creata una griglia di punti. La funzione sphereByZ è ancora attiva, per cui tutti i punti creano sfere con i raggi basati sui valori Z.
E solo per fare delle prove, è necessario collegare l'elenco originale di numeri all'input X per Point.ByCoordinates. Ora si ottiene un cubo di sfere.
Nota: se il calcolo al computer richiede molto tempo, provare a modificare #10 impostandolo su un valore simile a #5.
Tenere presente che la funzione sphereByZ che è stata creata è una funzione generica, pertanto è possibile richiamare l'elica da una lezione precedente e applicare la funzione ad essa.
Un passaggio finale: controllare il rapporto del raggio con un parametro definito dall'utente. A tale scopo, è necessario creare un nuovo input per la funzione e sostituire anche il divisore 20 con un parametro.
Aggiornare la definizione di sphereByZ a:
Aggiornare il Code Block degli elementi derivati aggiungendo una variabile ratio all'input:
sphereByZ(Pt,ratio);
. Collegare un dispositivo di scorrimento all'input Code Block appena creato e modificare la dimensione dei raggi in base al rapporto del raggio.
L'oggetto geometrico più semplice nella libreria della geometria standard di Dynamo è un punto. Tutta la geometria viene creata utilizzando funzioni speciali denominate costruttori, i quali singolarmente restituiscono una nuova istanza di quel particolare tipo di geometria. In Dynamo, i costruttori iniziano con il nome del tipo di oggetto, in questo caso Point, seguito dal metodo di costruzione. Per creare un punto tridimensionale specificato dalle coordinate cartesiane x, y e z, utilizzare il costruttore ByCoordinates:
In Dynamo, i costruttori vengono in genere designati con il prefisso By e il richiamo di queste funzioni restituisce un oggetto appena creato di quel tipo. Questo oggetto appena creato viene memorizzato nella variabile indicata sul lato sinistro del segno di uguale.
La maggior parte degli oggetti ha molti differenti costruttori ed è possibile utilizzare il costruttore BySphericalCoordinates per creare un punto su una sfera, specificato dal raggio della sfera, un primo angolo di rotazione e un secondo angolo di rotazione (specificato in gradi):
I punti possono essere utilizzati per costruire la geometria dimensionale maggiore, come le linee. È possibile utilizzare il costruttore ByStartPointEndPoint per creare un oggetto Line tra due punti:
Analogamente, le linee possono essere utilizzate per creare la geometria di superfici dimensionale maggiore, ad esempio utilizzando il costruttore Loft, che utilizza una serie di linee o curve e interpola una superficie tra loro.
È possibile utilizzare anche superfici per creare la geometria di solidi dimensionale maggiore, ad esempio mediante l'ispessimento della superficie in base ad una distanza specificata. Molti oggetti hanno funzioni associate, denominate metodi, che consentono al programmatore di eseguire comandi su quel particolare oggetto. I metodi comuni a tutti gli elementi della geometria includono Translate e Rotate, che rispettivamente traslano (spostano) e ruotano la geometria di un valore specificato. Le superfici hanno un metodo Thicken, che acquisisce un singolo input, un numero che specifica il nuovo spessore della superficie.
I comandi Intersection consentono di estrarre la geometria dimensionale minore da oggetti dimensionali maggiori. Questa geometria dimensionale minore estratta può formare la base per la geometria dimensionale maggiore, in un processo ciclico di creazione, estrazione e ricreazione geometriche. In questo esempio, si utilizzerà il solido generato per creare una superficie e si utilizzerà la superficie per creare una curva.
Gli oggetti nelle progettazioni computazionali raramente vengono creati esplicitamente nella loro posizione e nella loro forma finali e più spesso vengono traslati, ruotati e altrimenti posizionati in base alla geometria esistente. La matematica vettoriale serve come una sorta di impalcatura geometrica per dare direzione e orientamento alla geometria, nonché per concettualizzare i movimenti attraverso lo spazio 3D senza rappresentazione visiva.
Fondamentalmente, un vettore rappresenta una posizione nello spazio 3D e spesso viene considerato come il punto finale di una freccia dalla posizione (0, 0, 0) a quella posizione. I vettori possono essere creati con il costruttore ByCoordinates, utilizzando la posizione x, y e z dell'oggetto vettoriale appena creato. Notare che gli oggetti vettoriali non sono oggetti geometrici e non compaiono nella finestra di Dynamo. Tuttavia, le informazioni relative ad un vettore appena creato o modificato possono essere stampate nella finestra della console:
Un insieme di operazioni matematiche viene definito sugli oggetti vettoriali, consentendo di aggiungere, sottrarre, moltiplicare e altrimenti spostare oggetti nello spazio 3D, come si sposterebbero numeri reali nello spazio 1D su una linea numerica.
L'addizione vettoriale è definita come la somma dei componenti di due vettori e può essere considerata come il vettore risultante se le frecce dei componenti dei due vettori vengono posizionate "dalla punta alla coda". L'addizione vettoriale viene eseguita con il metodo Add ed è rappresentata dal diagramma a sinistra.
Analogamente, due oggetti vettoriali possono essere sottratti l'uno dall'altro con il metodo Subtract. La sottrazione vettore può essere considerata come direzione dal primo vettore al secondo vettore.
La moltiplicazione vettoriale può essere considerata come lo spostamento del punto finale di un vettore nella sua direzione mediante un determinato fattore di scala.
Spesso è necessario durante la messa in scala di un vettore avere la lunghezza del vettore risultante esattamente uguale al valore in scala. Ciò si ottiene facilmente normalizzando prima un vettore, in altre parole impostando la lunghezza del vettore esattamente uguale ad uno.
c punta ancora nella stessa direzione di a (1, 2, 3), anche se ora ha una lunghezza esattamente uguale a 5.
Nella matematica vettoriale esistono due metodi di addizione che non hanno paralleli chiari con la matematica 1D, il prodotto incrociato e il prodotto punto. Il prodotto incrociato è un mezzo per generare un vettore ortogonale (a 90 gradi) rispetto a due vettori esistenti. Ad esempio, il prodotto incrociato degli assi x e y è l'asse x, sebbene i due vettori di input non debbano essere ortogonali tra loro. Viene calcolato un vettore del prodotto incrociato con il metodo Cross.
Un'ulteriore funzione, sebbene più avanzata di matematica vettoriale, è il prodotto punto. Il prodotto punto tra due vettori è un numero reale (non un oggetto Vector) che è correlato, ma non è esattamente, all'angolo tra due vettori. Una delle proprietà utili del prodotto punto è che il prodotto punto tra due vettori sarà 0 se e solo se sono perpendicolari. Il prodotto punto viene calcolato con il metodo Dot.
In Dynamo vi sono due metodi fondamentali per creare curve di forma libera: la specifica di una raccolta di punti e l'impostazione del programma in modo che venga interpolata una curva levigata tra di essi oppure esiste un metodo di livello molto più basso, ossia specificare i punti di controllo sottostanti di una curva di un determinato grado. Le curve interpolate sono utili quando un progettista sa esattamente la forma che deve assumere una linea o se il progetto ha vincoli specifici per il punto in cui la curva può e non può attraversare. Le curve specificate tramite i punti di controllo sono essenzialmente una serie di segmenti di linee rette che un algoritmo leviga in una forma di curva finale. Specificare una curva tramite punti di controllo può essere utile per esplorare forme di curva con diversi gradi di levigatezza o quando è necessaria una continuità uniforme tra segmenti di curva.
Per creare una curva interpolata, è sufficiente trasferire una raccolta di punti al metodo NurbsCurve.ByPoints.
La curva generata interseca ciascuno dei punti di input, iniziando e terminando rispettivamente nel primo e nell'ultimo punto della raccolta. È possibile utilizzare un parametro periodico facoltativo per creare una curva periodica chiusa. Dynamo inserirà automaticamente il segmento mancante, pertanto non è necessario un punto finale duplicato (identico al punto iniziale).
Le NurbsCurve vengono generate in modo molto simile, con i punti di input che rappresentano i punti finali di un segmento di linea retta e un secondo parametro che specifica il livello e il tipo di levigatezza a cui è sottoposta la curva, denominati grado.* Una curva di grado 1 non ha alcuna levigatezza; è una polilinea.
Una curva di grado 2 viene levigata in modo che si intersechi ed è tangente al punto medio dei segmenti della polilinea:
Dynamo supporta curve NURBS (Non-Uniform Rational B-Spline) fino ad un massimo di 20 gradi. Nel seguente script è illustrato l'effetto che l'aumento dei livelli di levigatezza ha sulla forma di una curva:
Notare che è necessario disporre di almeno un altro punto di controllo rispetto al grado della curva.
Un altro vantaggio della costruzione delle curve tramite vertici di controllo è la possibilità di mantenere la tangenza tra singoli segmenti della curva. Per eseguire questa operazione, estrarre la direzione tra gli ultimi due punti di controllo e continuare in questa direzione con i primi due punti di controllo della curva seguente. Nel seguente esempio vengono create due curve NURBS separate, che sono tuttavia levigate come una curva:
*Questa è una descrizione molto semplificata della geometria della curva NURBS. Per una descrizione più accurata e dettagliata, vedere Pottmann, et al, 2007, nei riferimenti.
Nelle progettazioni computazionali, le curve e le superfici vengono spesso utilizzate come l'impalcatura sottostante per costruire la geometria successiva. Per poter utilizzare questa geometria iniziale come base per la geometria successiva, lo script deve essere in grado di estrarre qualità quali la posizione e l'orientamento nell'intera area dell'oggetto. Sia le curve che le superfici supportano questa estrazione, che è denominata parametrizzazione.
Tutti i punti su una curva possono essere considerati come un parametro unico compreso tra 0 e 1. Se si desidera creare una NurbsCurve basata su diversi punti di controllo o interpolati, il primo punto avrà il parametro 0 e l'ultimo punto avrà il parametro 1. Non è possibile sapere in anticipo quale sia l'esatto parametro qualunque sia il punto intermedio, il che potrebbe sembrare una limitazione grave, tuttavia ciò è mitigato da una serie di funzioni di utilità. Le superfici hanno una parametrizzazione simile a quella delle curve, anche se con due parametri invece di uno, denominati u e v. Se si desidera creare una superficie con i seguenti punti:
p1 avrebbe il parametro u = 0 v = 0, mentre p9 avrebbe i parametri u = 1 v = 1.
La parametrizzazione non è particolarmente utile per determinare i punti utilizzati per generare le curve; il suo uso principale è determinare le posizioni dei punti intermedi generati dai costruttori NurbsCurve e NurbsSurface.
Le curve hanno un metodo PointAtParameter, che utilizza un singolo argomento doppio compreso tra 0 e 1 e restituisce l'oggetto Point in corrispondenza di tale parametro. Ad esempio, questo script trova i Point in corrispondenza dei parametri 0, .1, .2, .3, .4, .5, .6, .7, .8, .9 e 1:
Analogamente, le superfici hanno un metodo PointAtParameter che utilizza due argomenti, il parametro u e v del Point generato.
Sebbene l'estrazione di punti singoli su una curva e una superficie possa essere utile, gli script spesso richiedono la conoscenza delle particolari caratteristiche geometriche in corrispondenza di un parametro, ad esempio qual è la direzione della curva o della superficie. Il metodo CoordinateSystemAtParameter non solo individua la posizione, ma anche un CoordinateSystem orientato in corrispondenza del parametro di una curva o superficie. Ad esempio, il seguente script estrae i CoordinateSystem orientati lungo una superficie di rivoluzione e utilizza l'orientamento dei CoordinateSystem per generare linee che si staccano dalla normale alla superficie:
Come detto in precedenza, la parametrizzazione non è sempre uniforme per tutta la lunghezza di una curva o di una superficie, ovvero il parametro 0.5 non corrisponde sempre al punto medio e 0.25 non sempre corrisponde al punto un quarto lungo una curva o superficie. Per ovviare a questa limitazione, le curve dispongono di un insieme aggiuntivo di comandi di parametrizzazione che consentono di trovare un punto in corrispondenza di lunghezze specifiche lungo una curva.
Molti degli esempi riportati finora si sono concentrati sulla costruzione di geometria dimensionale maggiore a partire da oggetti dimensionali minori. I metodi di intersezione consentono a questa geometria dimensionale maggiore di generare oggetti dimensionali minori, mentre i comandi di taglio e selezione del taglio consentono di modificare pesantemente le forme geometriche mediante script dopo la creazione.
Il metodo Intersect è definito su tutti gli elementi della geometria in Dynamo, ovvero, in teoria qualsiasi elemento della geometria può essere intersecato con qualsiasi altro elemento della geometria. Naturalmente alcune intersezioni sono insignificanti, come le intersezioni che coinvolgono i punti, poiché l'oggetto risultante sarà sempre il punto di input stesso. Le altre possibili combinazioni di intersezioni tra gli oggetti sono descritte nel seguente grafico, in cui è illustrato il risultato di diverse operazioni di intersezione:
Con:
Superficie
Curva
Piano
Uniforme
Superficie
Curva
Punto
Punto, curva
Superficie
Curva
Punto
Punto
Punto
Curva
Piano
Curva
Punto
Curva
Curva
Uniforme
Superficie
Curva
Curva
Uniforme
Nel semplicissimo esempio riportato di seguito è mostrata l'intersezione di un piano con una NurbsSurface. L'intersezione genera una serie di NurbsCurve, che può essere utilizzata come qualsiasi altra NurbsCurve.
Il metodo Trim è molto simile al metodo Intersect, in quanto viene definito per quasi ogni elemento della geometria. Tuttavia, esistono molte più limitazioni per Trim rispetto a Intersect.
Mediante: Point
Curva
Piano
Superficie
Uniforme
Su: Curva
Sì
No
No
No
No
Poligono
-
No
Sì
No
No
Superficie
-
Sì
Sì
Sì
Sì
Uniforme
-
-
Sì
Sì
Sì
Qualcosa da notare sui metodi Trim è il requisito di un punto di "selezione", un punto che determina quale geometria eliminare e quali elementi mantenere. In Dynamo viene trovata ed eliminata la geometria ritagliata più vicina al punto di selezione.
Intersect, Trim e SelectTrim vengono utilizzati principalmente nella geometria dimensionale minore come punti, curve e superfici. La geometria solida, invece, presenta un insieme aggiuntivo di metodi per la modifica della forma dopo la costruzione, sottraendo il materiale in modo simile a Trim e combinando gli elementi insieme per formare un intero più grande.
Il metodo Unione utilizza due oggetti solidi e crea un singolo oggetto solido partendo dallo spazio coperto da entrambi gli oggetti. Lo spazio sovrapposto tra oggetti viene combinato nella forma finale. In questo esempio si combina una sfera e un cuboide in un'unica forma solida sfera-cubo:
Il metodo Difference, come Trim, sottrae il contenuto del solido strumento di input dal solido di base. In questo esempio, viene ritagliata una piccola rientranza da una sfera:
Il metodo Intersect restituisce il solido sovrapposto tra due input solidi. Nel seguente esempio, Difference è stato modificato in Intersect e il solido risultante è il vuoto mancante inizialmente ritagliato:
Python è un linguaggio di programmazione ampiamente utilizzato, la cui popolarità ha molto a che fare con il suo stile di sintassi. È altamente leggibile, il che rende più semplice l'apprendimento di molti altri linguaggi. Python supporta moduli e pacchetti e può essere incorporato nelle applicazioni esistenti. Per informazioni su come iniziare ad utilizzare Python, una buona risorsa è la pagina "Getting Started" sul sito Python.org
I seguenti script Python generano serie di punti per diversi esempi. È necessario incollarli in un nodo Python Script come segue:
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
Questa parte della guida introduttiva è organizzata come una raccolta di procedure ottimali. Evidenzia diverse strategie apprese, attraverso l'esperienza e la ricerca, per favorire workflow parametrici di qualità. In qualità di progettisti e programmatori, la metrica di qualità è principalmente interessata alla manutenibilità, all'affidabilità, all'usabilità e all'efficienza degli strumenti. Benché queste procedure ottimali presentino esempi specifici per lo scripting basato su testo o visivo, i principi sono applicabili a tutti gli ambienti di programmazione e possono caratterizzare molti workflow computazionali.
Con Dynamo 2.0 è possibile specificare un modello di default (.py extension)
da utilizzare all'apertura della finestra di Python per la prima volta. Questa è stata una richiesta a lungo desiderata perché consente di accelerare l'utilizzo di Python all'interno di Dynamo. La possibilità di utilizzare un modello consente di avere importazioni di default pronte per lo sviluppo di uno script Python personalizzato.
La posizione di questo modello è APPDATA
per l'installazione di Dynamo.
In genere, è la seguente: ( %appdata%\Dynamo\Dynamo Core\{version}\ )
.
Per utilizzare questa funzionalità, è necessario aggiungere la seguente riga nel file DynamoSettings.xml
. (Modifica nel Blocco note)
Dove è visibile la riga <PythonTemplateFilePath />
, è sufficiente sostituirla con quanto segue:
Nota Sostituire CURRENTUSER con il nome utente.
Successivamente, è necessario creare un modello con le funzionalità incorporate che si desidera utilizzare. In questo caso, si incorporano le importazioni correlate a Revit e alcuni degli altri elementi tipici quando si utilizza Revit.
È possibile aprire un documento del Blocco note vuoto e incollare il seguente codice all'interno:
Al termine, salvare il file come PythonTemplate.py
nella posizione APPDATA
.
D_o_po aver definito un modello di Python, verrà cercato in Dynamo ogni volta che viene posizionato un nodo Python. Se non viene trovato, sarà simile alla finestra di Python di default.
Se viene trovato il modello di Python (ad esempio, come il modello di Revit), verranno visualizzati tutti gli elementi di default incorporati.
Ulteriori informazioni su questa straordinaria aggiunta (di Radu Gidei) sono disponibili qui. https://github.com/DynamoDS/Dynamo/pull/8122
Ora che è stato dimostrato come utilizzare gli script di Python in Dynamo, verrà esaminato il collegamento delle librerie di Revit nell'ambiente di scripting. Tenere presente che sono stati importati i nodi standard di Python e i nodi principali di Dynamo con le prime tre righe del blocco di codice riportato di seguito. Per importare i nodi di Revit, gli elementi di Revit e la gestione dei documenti di Revit, è necessario aggiungere solo alcune righe:
Questo consente di accedere all'API di Revit e offre scripting personalizzato per qualsiasi operazione di Revit. Combinando il processo di programmazione visiva con lo scripting, la collaborazione e lo sviluppo di strumenti dell'API di Revit, si ottiene un miglioramento significativo. Ad esempio, un responsabile BIM e un progettista di schemi possono lavorare insieme sullo stesso grafico. In questa collaborazione, possono migliorare la progettazione e l'esecuzione del modello.
Creare un nuovo progetto di Revit.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questi esercizi, verranno esaminati gli script di Python elementari in Dynamo for Revit. L'esercizio si concentrerà sull'utilizzo di file ed elementi di Revit, nonché sulla comunicazione tra Revit e Dynamo.
Questo è un metodo molto semplice per il recupero di doc, uiapp e app del file di Revit collegato alla sessione di Dynamo. I programmatori che hanno lavorato in precedenza nell'API di Revit possono notare le voci dell'elenco di controllo. Se questi elementi non risultano familiari, sarà possibile utilizzare altri esempi negli esercizi riportati di seguito.
Di seguito è mostrato il modo in cui si importano i servizi di Revit e si recuperano i dati dei documenti in Dynamo.
Osservare il nodo Python in Dynamo. Il codice è disponibile anche di seguito:
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esercizio, verrà creata una semplice curva di modello in Revit mediante il nodo Python di Dynamo.
Iniziare creando una nuova famiglia di masse concettuali in Revit.
Aprire la cartella Conceptual Mass e utilizzare il file modello Metric Mass.rft.
In Revit, utilizzare il tasto di scelta rapida un
per visualizzare le impostazioni Unità di misura, quindi modificare l'unità di lunghezza in metri.
Avviare Dynamo e creare il gruppo di nodi nell'immagine riportata sotto. Innanzitutto, verranno creati due punti di riferimento in Revit dai nodi di Dynamo.
Creare un Code Block e assegnargli un valore di
"0;"
.Collegare questo valore ad un nodo ReferencePoint.ByCoordinates per gli input X, Y e Z.
Creare tre dispositivi di scorrimento, compresi tra -100 e 100, con una dimensione di incremento pari a 1.
Collegare ogni dispositivo di scorrimento ad un nodo ReferencePoint.ByCoordinates.
Aggiungere un nodo Python all'area di lavoro, fare clic sul pulsante + sul nodo per aggiungere un altro input e collegare i due punti di riferimento ad ogni input. Aprire il nodo Python.
Osservare il nodo Python in Dynamo. Per il codice completo, vedere di seguito.
System.Array: Revit richiede una matrice di sistema come input (anziché un elenco di Python). Si tratta solo di un'altra riga di codice, ma prestare attenzione ai tipi di argomento faciliterà la programmazione di Python in Revit.
In Dynamo, sono stati creati due punti di riferimento con una linea che li collega utilizzando Python. Si aumenterà un po' il livello di complessità nel prossimo esercizio.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Questo esercizio semplifica la procedura, ma enfatizza gli argomenti relativi al collegamento di dati e geometria da Revit a Dynamo e viceversa. Per iniziare, aprire Revit-StructuralFraming.rvt. Una volta aperto il file, avviare Dynamo e aprire il file Revit-StructuralFraming.dyn.
Questo file di Revit contiene dati di base. Due curve di riferimento: una disegnata sul livello 1 e l'altra sul livello 2. Si desidera ottenere queste curve in Dynamo e mantenere un collegamento attivo.
In questo file è presente un gruppo di nodi che si collegano a cinque input di un nodo Python.
Nodi Select Model Element: fare clic sul pulsante Seleziona per ogni elemento e selezionare una curva corrispondente in Revit.
Code Block: utilizzando la sintassi
0..1..#x;
, collegare un dispositivo di scorrimento di numeri interi compreso tra 0 e 20 all'input x. Questo indica il numero di travi da disegnare tra le due curve.Structural Framing Types: dal menu a discesa, scegliere la trave di default W12x26.
Levels: selezionare "Livello 1".
Questo codice in Python è un po' più denso, ma i commenti all'interno del codice descrivono cosa sta accadendo nel processo:
In Revit, è presente una serie di travi che si estendono sulle due curve come elementi strutturali. Nota: questo non è un esempio realistico; gli elementi strutturali vengono utilizzati come esempio per le istanze native di Revit create da Dynamo.
In Dynamo, è possibile visualizzare anche i risultati. Le travi del nodo Watch 3D fanno riferimento alla geometria sottoposta a query dagli elementi di Revit.
Notare che è presente un processo continuo di conversione dei dati dall'ambiente di Revit all'ambiente di Dynamo. In sintesi, ecco come viene riprodotto il processo:
Selezionare l'elemento di Revit.
Convertire l'elemento di Revit nella curva di Dynamo.
Dividere la curva di Dynamo in una serie di punti di Dynamo.
Utilizzare i punti di Dynamo tra due curve per creare le linee di Dynamo.
Creare le travi di Revit facendo riferimento alle linee di Dynamo.
Generare le superfici di Dynamo eseguendo una query sulla geometria delle travi di Revit.
Questo processo può sembrare un po' complicato, ma lo script lo rende semplice quanto la modifica della curva in Revit e la riesecuzione del risolutore (anche se potrebbe essere necessario eliminare le travi precedenti quando si esegue questa operazione). Ciò è dovuto al fatto che si stanno posizionando le travi in Python, interrompendo così l'associazione che hanno i nodi OOTB.
Con un aggiornamento delle curve di riferimento in Revit, si ottiene una nuova serie di travi.
Perché è opportuno utilizzare la programmazione testuale nell'ambiente di programmazione visiva di Dynamo? La offre molti vantaggi. Consente di creare programmi senza apprendere una sintassi speciale in un'interfaccia visiva intuitiva. Tuttavia, un programma visivo può diventare disordinato e a volte può risultare carente in termini di funzionalità. Ad esempio, Python offre metodi molto più facili da realizzare per la scrittura di istruzioni condizionali (if/then) e il loop. Python è un potente strumento in grado di ampliare le funzionalità di Dynamo e di consentire di sostituire molti nodi con alcune righe di codice concise.
Programma visivo:
Programma testuale:
Come i blocchi di codice, i nodi Python sono un'interfaccia di script all'interno di un ambiente di programmazione visiva. Il nodo Python è disponibile in Script>Editor>Script Python nella libreria.
Facendo doppio clic sul nodo, viene aperto l'editor di script Python. È inoltre possibile fare clic con il pulsante destro del mouse sul nodo e scegliere Modifica. Si noterà del testo boilerplate in alto, che è utile per fare riferimento alle librerie necessarie. Gli input vengono memorizzati nella matrice IN. I valori vengono restituiti a Dynamo assegnandoli alla variabile OUT.
I metodi includono costruttori quali ByCoordinates, azioni quali Add e query quali le coordinate X, Y e Z.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
In questo esempio, si scriverà uno script di Python che crea modelli da un modulo solido e lo si trasformerà in un nodo personalizzato. Innanzitutto, creare il modulo solido utilizzando i nodi di Dynamo.
Rectangle.ByWidthLength: creare un rettangolo che sarà la base del solido.
Surface.ByPatch: collegare il rettangolo all'input "closedCurve" per creare la superficie inferiore.
Geometry.Translate: collegate il rettangolo all'input "geometry" per spostarlo verso l'alto, utilizzando un blocco di codice per specificare lo spessore di base del solido.
Polygon.Points: eseguire la query sul rettangolo traslato per estrarre i punti degli angoli.
Geometry.Translate: utilizzare un blocco di codice per creare un elenco di quattro valori corrispondenti ai quattro punti, traslando un angolo del solido verso l'alto.
Polygon.ByPoints: utilizzare i punti traslati per ricreare il poligono superiore.
Surface.ByPatch: collegare il poligono per creare la superficie superiore.
Ora che sono presenti le superfici superiore e inferiore, creati i lati del solido tramite loft tra i due profili.
List.Create: collegare il rettangolo inferiore e il poligono superiore agli input dell'indice.
Surface.ByLoft: eseguire il loft dei due profili per creare i lati del solido.
List.Create: collegare le superfici superiore, laterale e inferiore agli input dell'indice per creare un elenco di superfici.
Solid.ByJoinedSurfaces: unire le superfici per creare il modulo solido.
Ora che è stato realizzato il solido, rilasciare un nodo Script Python nell'area di lavoro.
Per aggiungere altri input al nodo, fare clic sull'icona + sul nodo. Gli input sono denominati IN[0], IN[1] e così via per indicare che rappresentano le voci di un elenco.
Iniziare definendo gli input e l'output. Fare doppio clic sul nodo per aprire l'editor di Python. Seguire il codice riportato qui sotto per modificare il codice nell'editor.
Questo codice risulterà più utile mentre si prosegue nell'esercizio. Successivamente, occorre pensare alle informazioni necessarie per includere in una matrice il modulo solido. Per prima cosa, è necessario conoscere le quote del solido per determinare la distanza di traslazione. A causa di un bug del riquadro di delimitazione, è necessario utilizzare la geometria della curva dello spigolo per creare un riquadro di delimitazione.
Osservare il nodo Python in Dynamo. Si noti che viene utilizzata la stessa sintassi presente nei titoli dei nodi in Dynamo. Consultare il codice commentato qui sotto.
Poiché si eseguiranno sia la traslazione che la rotazione dei moduli solidi, utilizzare l'operazione Geometry.Transform. Guardando il nodo Geometry.Transform, si sa che per trasformare il solido sarà necessario un sistema di coordinate di origine e un sistema di coordinate di destinazione. L'origine è il sistema di coordinate contestuale del solido, mentre la destinazione sarà un sistema di coordinate diverso per ogni modulo incluso nella matrice. Ciò significa che si dovrà riprodurre a ciclo continuo i valori X e Y per trasformare il sistema di coordinate in modo diverso ogni volta.
Fare clic su Esegui, quindi salvare il codice. Collegare il nodo Python con lo script esistente come indicato di seguito.
Collegare l'output da Solid.ByJoinedSurfaces come primo input per il nodo Python e utilizzare un Code Block per definire gli altri input.
Creare un nodo Topology.Edges e utilizzare l'output del nodo Python come input.
Infine, creare un nodo Edge.CurveGeometry e utilizzare l'output di Topology.Edges come input.
Provare a modificare il valore iniziale (seme) per creare modelli diversi. È anche possibile modificare i parametri del modulo solido stesso per effetti differenti.
Dopo aver creato uno script di Python utile, salvarlo come nodo personalizzato. Selezionare il nodo dello script Python, fare clic con il pulsante destro del mouse su Area di lavoro e selezionare Crea nodo personalizzato.
Assegnare un nome, una descrizione e una categoria.
Verrà aperta una nuova area di lavoro in cui modificare il nodo personalizzato.
Input: modificare i nomi di input in modo che siano più descrittivi e aggiungere i tipi di dati e i valori di default.
Output: consente di modificare il nome di output.
Salvare il nodo come file .dyf e il nodo personalizzato dovrebbe riflettere le modifiche appena apportate.
Prima di questo capitolo, nella guida introduttiva è stato descritto come implementare le potenti funzionalità di scripting visivo di Dynamo. Una buona comprensione di queste funzionalità è una solida base e il primo passo nella compilazione di efficaci programmi visivi. Quando si utilizzano i programmi visivi sul campo, li si condivide con i colleghi, si correggono gli errori oppure si testano i limiti, ci sono altri problemi da risolvere. Se un altro utente sta utilizzando il programma o ci si aspetta di aprirlo tra sei mesi, deve avere un'immediata chiarezza grafica e logica. Dynamo dispone di molti strumenti per gestire la complessità del programma e in questo capitolo sono fornite linee guida su quando utilizzarli.
Man mano che si sviluppa il grafico di Dynamo e si testano le idee, è possibile che la dimensione e la complessità aumentino rapidamente. Sebbene sia importante creare un programma funzionante, è altrettanto importante farlo il più semplicemente possibile. Non solo il grafico verrà eseguito in modo più rapido e più prevedibile, ma insieme ad altri utenti si potrà comprendere la sua logica in un secondo momento. Di seguito sono riportati diversi modi che consentono di chiarire la logica del grafico.
I gruppi consentono di creare parti distinte dal punto di vista funzionale durante la compilazione di un programma.
I gruppi consentono di spostare parti di grandi dimensioni del programma mantenendo al contempo la modularità e l'allineamento.
È possibile modificare il colore del gruppo per differenziare l'azione dei gruppi (input e funzioni).
È possibile utilizzare i gruppi per iniziare a organizzare il grafico per semplificare la creazione di nodi personalizzati.
I colori in questo programma identificano lo scopo di ciascun gruppo. Questa strategia può essere utilizzata per creare la gerarchia in eventuali modelli o standard grafici sviluppati.
Gruppo di funzioni (blu)
Gruppo di input (arancione)
Gruppo di script (verde)
A volte, è possibile utilizzare un blocco di codice per digitare un metodo di nodo o numero più rapidamente della ricerca (Point.ByCoordinates, Number, String, Formula).
I blocchi di codice sono utili quando si desidera definire funzioni personalizzate in DesignScript per ridurre il numero di nodi in un grafico.
Entrambi i valori 1 e 2 svolgono la stessa funzione. La scrittura di alcune righe di codice è molto più rapida rispetto alla ricerca e all'aggiunta di ogni nodo singolarmente. Anche il blocco di codice è molto più conciso.
Linguaggio DesignScript scritto nel blocco di codice
Programma equivalente nei nodi
È possibile ridurre la complessità di un grafico utilizzando Nodo da aggiungere al codice, che consente di acquisire una raccolta di nodi semplici e di scrivere il linguaggio DesignScript corrispondente in un unico blocco di codice.
Nodo da aggiungere al codice può** comprimere il codice senza eliminare la chiarezza del programma.**
Di seguito sono riportati i vantaggi dell'utilizzo di Nodo da aggiungere al codice:
Comprime facilmente il codice in un componente che è ancora modificabile.
Può semplificare una parte significativa del grafico.
È utile se il "mini-programma" non verrà spesso modificato.
È utile per incorporare altre funzionalità del blocco di codice, come le funzioni.
Di seguito sono riportati gli svantaggi dell'utilizzo di Nodo da aggiungere al codice:
La denominazione generica lo rende meno leggibile.
È più difficile da comprendere per altri utenti.
Non è possibile tornare facilmente alla versione di programmazione visiva.
Programma esistente
Blocco di codice creato da Nodo da aggiungere al codice
L'utilizzo di List@Level può aiutare a ridurre la complessità del grafico sostituendo i nodi List.Map e List.Combine che potrebbero occupare una notevole quantità di spazio nell'area di disegno.
List@Level offre un** modo più rapido rispetto a List.Map/List.Combine per costruire la logica dei nodi**, consentendo di accedere ai dati a qualsiasi livello in un elenco direttamente dalla porta di input di un nodo.
Si può verificare quanti valori True BoundingBox.Contains restituisce e in quali elenchi attivando List@Level per l'input "list" di CountTrue. List@Level consente all'utente di determinare da quale livello l'input acquisirà i dati. L'utilizzo di List@Level è flessibile, efficiente e altamente incoraggiato rispetto ad altri metodi che coinvolgono List.Map e List.Combine.
Conteggio dei valori true al livello di elenco 2
Conteggio dei valori true al livello di elenco 3
Oltre a rendere il grafico il più semplice ed efficiente possibile, è necessario puntare alla chiarezza grafica. Nonostante i grandi sforzi compiuti per rendere il grafico intuitivo con raggruppamenti logici, le relazioni potrebbero non essere subito visibili. Una semplice nota all'interno di un gruppo o la ridenominazione di un dispositivo di scorrimento consente all'utente corrente o ad un altro utente di evitare un'inutile confusione o panoramica del grafico. Di seguito sono riportati diversi modi per applicare la coerenza grafica tra i grafici e al loro interno.
Per ridurre il lavoro dopo aver completato la creazione del grafico, è necessario provare ad assicurarsi che il layout del nodo sia leggibile tramite l'allineamento di nodi spesso e mentre si procede.
Se altri utenti lavoreranno con il grafico, è necessario verificare che il layout nodo-collegamento fluisca facilmente prima del rilascio.
Per semplificare l'allineamento, utilizzare la funzionalità Semplifica layout nodi per allineare automaticamente il grafico, anche se in modo meno preciso rispetto a quello eseguito manualmente.
Grafico non organizzato
Grafico allineato
La ridenominazione degli input consente ad altri utenti di comprendere facilmente il grafico, in particolare se ciò in cui questi si inseriranno sarà fuori dallo schermo.
È consigliabile rinominare i nodi diversamente dagli input. In alternativa, è possibile creare un nodo personalizzato da un cluster di nodi e rinominarlo. Si capirà che contiene qualcos'altro.
Input per la manipolazione della superficie
Input per i parametri architettonici
Input per lo script di simulazione del drenaggio
Per rinominare un nodo, fare clic con il pulsante destro del mouse sul nome e scegliere "Rinomina nodo...".
Se un elemento del grafico richiede una spiegazione in un linguaggio semplice che i nodi non possono esprimere, è necessario aggiungere una nota.
Se una raccolta di nodi o un gruppo è troppo grande o complesso e non può essere facilmente compreso immediatamente, è necessario aggiungere una nota.
Una nota che descrive la parte del programma che restituisce le distanze di traslazione non elaborate
Una nota che descrive il codice che associa tali valori a un'onda sinusoidale
Durante la compilazione del programma, utilizzare i simboli circolari di anteprima o controllo per** verificare che gli output chiave restituiscano ciò che è previsto.**
I nodi Watch vengono utilizzati per confrontare:
Le distanze di traslazione non elaborate
I valori passati tramite l'equazione in seno
È molto probabile che qualcun altro stia aprendo il programma in un certo punto, anche se si lavora in modo indipendente. Deve essere in grado di comprendere rapidamente cosa il programma richiede e produce dai relativi input e output. Ciò è particolarmente importante quando si sviluppa un nodo personalizzato da condividere con la community di Dynamo e utilizzarlo nel programma di qualcun'altro. Queste pratiche portano a programmi e nodi solidi e riutilizzabili.
Per garantire la leggibilità e la scalabilità, è necessario provare a ridurre al minimo input e output il più possibile.
È necessario tentare di pianificare la modalità di compilazione della logica creando innanzitutto una descrizione approssimativa di come la logica potrebbe funzionare anche prima di aggiungere un singolo nodo all'area di disegno. Mentre si sviluppa la descrizione approssimativa, è necessario tenere traccia degli input e degli output che verranno inseriti negli script.
Se nel grafico sono presenti determinate opzioni o condizioni che si desidera incorporare, è necessario utilizzare le preimpostazioni per l'accesso rapido.
È inoltre possibile utilizzare le preimpostazioni per ridurre la complessità memorizzando nella cache valori specifici del dispositivo di scorrimento in un grafico con tempi di esecuzione lunghi.
È necessario utilizzare un nodo personalizzato se è possibile raccogliere il programma in un unico contenitore.
È necessario utilizzare un nodo personalizzato quando una parte del grafico verrà riutilizzata spesso in altri programmi.
È necessario utilizzare un nodo personalizzato se si desidera condividere una funzionalità con la community di Dynamo.
La raccolta del programma di traslazione dei punti in un nodo personalizzato rende un programma affidabile, unico e molto più facile da comprendere. Le porte di input con nome significativo consentono ad altri utenti di comprendere come utilizzare il nodo. Ricordarsi di aggiungere le descrizioni e i tipi di dati richiesti per ogni input.
Programma dell'attrattore esistente
Nodo personalizzato che raccoglie questo programma, PointGrid
È possibile creare modelli per stabilire standard grafici nei grafici visivi al fine di garantire che i collaboratori abbiano un metodo standardizzato di comprensione del grafico.
Durante la creazione di un modello, è possibile standardizzare i colori dei gruppi e le dimensioni dei font per suddividere in categorie i tipi di workflow o le azioni di dati.
Durante la creazione di un modello, è anche possibile standardizzare il modo in cui si desidera etichettare, colorare o applicare stili alla differenza tra i workflow front-end e back-end nel grafico.
L'interfaccia utente, o front-end, del programma include un nome di progetto, dispositivi di scorrimento di input e geometria di importazione.
Il back-end del programma.
Categorie di colori dei gruppi (progettazione generale, input, scripting Python, geometria importata).
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Ora che sono state definite diverse pratiche ottimali, è possibile applicarle ad un programma che è stato realizzato rapidamente. Sebbene il programma possa generare il tetto, lo stato del grafico è una "mappa mentale" del programmatore. Non è presente alcuna organizzazione o descrizione del suo utilizzo. Si esamineranno le procedure ottimali per organizzare, descrivere e analizzare il programma in modo che altri utenti possano comprendere come utilizzarlo.
Il programma funziona, ma il grafico è disorganizzato.
Iniziare determinando i dati e la geometria restituiti dal programma.
Comprendere quando si apportano modifiche importanti ai dati è fondamentale per stabilire le divisioni logiche o la modularità. Provare a controllare il resto del programma con i nodi Watch per verificare se è possibile determinare i gruppi prima di andare al passaggio successivo.
Questo Code Block con un'equazione matematica è un elemento cruciale del programma. Un nodo Watch visualizza ciò che restituisce elenchi di distanze di traslazione.
Lo scopo di quest'area non è immediatamente ovvio. La disposizione dei valori True al livello di elenco L2 di BoundingBox.Contains e la presenza di List.FilterByBoolMask suggeriscono che si sta campionando una parte della griglia di punti.
Una volta comprese le parti elementari del programma, si possono inserirle in gruppi.
I gruppi consentono all'utente di differenziare visivamente le parti del programma.
Importare il modello della planimetria 3D
Convertire la griglia di punti in base all'equazione in seno
Parte campione della griglia di punti
Creare una superficie del tetto architettonico
Creare una facciata continua in vetro
Con i gruppi stabiliti, allineare i nodi per creare una continuità visiva nel grafico.
La continuità visiva consente all'utente di vedere il flusso del programma e le relazioni implicite tra i nodi.
Rendere il programma più accessibile aggiungendo un altro livello di miglioramenti grafici. Aggiungere note per descrivere il funzionamento di una specifica area del programma, assegnare nomi personalizzati agli input e assegnare colori a diversi tipi di gruppi.
Questi miglioramenti grafici consentono all'utente di conoscere meglio le attività del programma. I diversi colori dei gruppi consentono di distinguere gli input dalle funzioni.
Note
Input con nomi descrittivi
Prima di iniziare a comprimere il programma, è necessario individuare una posizione strategica per introdurre il simulatore di drenaggio dello script Python. Inserire l'output della prima superficie del tetto in scala nel rispettivo input di scripting.
Si è scelto di integrare lo scripting in questo punto del programma in modo che la simulazione del drenaggio possa essere eseguita sulla superficie originale del tetto singolo. Questa superficie specifica non viene visualizzata in anteprima, ma consente di evitare di scegliere la superficie superiore della PolySurface smussata.
Geometria di origine per l'input dello script
Nodo Python
Dispositivi di scorrimento di input
"Interruttore" attivato/disattivato
Si può semplificare il grafico ora che tutto è pronto.
La compressione del programma con Nodo da aggiungere al codice e Nodo personalizzato ha ridotto notevolmente la dimensione del grafico. I gruppi che creano la superficie del tetto e i muri sono stati convertiti in codice poiché sono molto specifici di questo programma. Il gruppo di traslazione dei punti è contenuto in un nodo personalizzato, in quanto potrebbe essere utilizzato in un altro programma. Nel file di esempio, creare il proprio nodo personalizzato dal gruppo di traslazione dei punti.
Nodo personalizzato per contenere il gruppo di "traslazione della griglia di punti"
Nodo da aggiungere al codice per comprimere i gruppi di "creazione della superficie del tetto architettonico e della facciata continua"
Come passaggio finale, creare preimpostazioni per forme di tetto esemplificative.
Questi input sono i fattori principali della forma del tetto e consentiranno agli utenti di vedere il potenziale del programma.
Il programma con le viste di due preimpostazioni.
I modelli di drenaggio del tetto offrono all'utente una vista analitica delle rispettive preimpostazioni.
Lo scripting basato su testo all'interno dell'ambiente di creazione di scripting visivo consente relazioni potenti e visive utilizzando DesignScript, Python e ZeroTouch (C#). L'utente può esporre elementi quali dispositivi di scorrimento di input, comprimere operazioni di grandi dimensioni in DesignScript e accedere a potenti strumenti e librerie tramite Python o C#, tutto nella stessa area di lavoro. Se gestita in modo efficace, la combinazione di queste strategie può conferire un elevato livello di personalizzazione, chiarezza ed efficienza al programma generale. Di seguito è riportato un insieme di linee guida per ottimizzare lo script visivo con lo script testuale.
Lo scripting di testo può stabilire relazioni di maggiore complessità rispetto alla programmazione visiva, ma anche le loro funzionalità si sovrappongono in modo significativo. Ciò è utile perché i nodi sono di fatto codice preconfezionato e probabilmente si potrebbe scrivere un intero programma Dynamo in DesignScript o Python. Tuttavia, si utilizza lo scripting visivo perché l'interfaccia di nodi e collegamenti crea un flusso intuitivo di informazioni grafiche. Sapere dove le funzionalità dello scripting di testo vanno oltre lo scripting visivo fornirà importanti dettagli su quando deve essere utilizzato senza dover dimenticare la natura intuitiva di nodi e collegamenti. Di seguito sono riportate le linee guida su quando eseguire lo script e su quale linguaggio utilizzare.
Utilizzare lo scripting di testo per:
Loop
Ricorsione
Accesso alle librerie esterne
Scegliere una linguaggio:
Quando si esegue lo scripting in Dynamo, un ambiente inevitabilmente parametrico, è opportuno strutturare il codice in relazione alla struttura dei nodi e dei collegamenti in cui si troverà. Considerare il nodo contenente lo script di testo come se si trattasse di qualsiasi altro nodo del programma con alcuni input specifici, una funzione e un output previsto. In questo modo il codice all'interno del nodo viene immediatamente corredato di un piccolo gruppo di variabili con cui lavorare, la chiave per un sistema parametrico ordinato. Di seguito sono riportate alcune linee guida per una migliore integrazione del codice in un programma visivo.
Identificare le variabili esterne:
Provare a determinare i parametri specificati nel problema di progettazione in modo da poter costruire un modello che consenta la creazione diretta di tali dati.
Prima di scrivere il codice, identificare le variabili:
Un gruppo minimo di input
L'output desiderato
Costanti
Prima di scrivere il codice, sono state definite diverse variabili.
La superficie su cui verrà simulata la pioggia.
Il numero di gocce di pioggia (agenti) desiderato.
La distanza percorsa delle gocce di pioggia.
Alternare tra scendere nel percorso più ripido e attraversare la superficie.
Nodo Python con il rispettivo numero di input.
Un blocco di codice per rendere blu le curve restituite.
Progettare le relazioni interne:
Il parametricismo consente la modifica di determinati parametri o variabili per manipolare o cambiare il risultato finale di un'equazione o un sistema.
Ogni volta che le entità nello script sono correlate in modo logico, è necessario definirle come funzioni l'una dell'altra. In questo modo, quando una viene modificata, l'altra può essere aggiornata in modo proporzionale.
Ridurre al minimo il numero di input esponendo solo i parametri chiave:
Se è possibile derivare un gruppo di parametri da più parametri principali, esporre solo i parametri principali come input di script. Ciò consente di migliorare la fruibilità dello script riducendone la complessità dell'interfaccia.
Input.
Variabili interne allo script.
Un loop che utilizza questi input e variabili per eseguirne la funzione.
Suggerimento Porre l'accento sul processo come si fa con la soluzione.
Quando si hanno più modi per esprimere la stessa cosa nello script, ad un certo punto le rappresentazioni duplicate non verranno sincronizzate, cosa che può portare a problemi di manutenzione, scarsa scomposizione in fattori e contraddizioni interne.
Il principio DRY prevede che "ogni conoscenza deve avere una rappresentazione unica, inequivocabile e autorevole all'interno di un sistema":
Se il principio viene applicato correttamente, tutti gli elementi correlati nello script cambiano in modo prevedibile e uniforme e tutti gli elementi non correlati non hanno conseguenze logiche l'uno sull'altro.
Suggerimento Prima di duplicare le entità nello script (ad esempio una costante nell'esempio precedente), chiedere se è invece possibile eseguire il collegamento all'origine.
Man mano che il codice diventa sempre più lungo e più complesso, la "grande idea" o l'algoritmo complessivo diventa sempre più illeggibile. Inoltre, diventa più difficile tenere traccia di quali cose specifiche accadono (e dove), trovare bug quando le cose vanno male, integrare altro codice e assegnare attività di sviluppo. Per evitare questi problemi, è opportuno scrivere il codice in moduli, una strategia organizzativa che suddivide il codice in base all'attività che esegue. Di seguito sono riportati alcuni suggerimenti per rendere gli script più gestibili tramite la modularizzazione.
Scrivere il codice in moduli:
Un "modulo" è un gruppo di codice che esegue un'attività specifica, simile ad un nodo di Dynamo nell'area di lavoro.
Può trattarsi di qualsiasi elemento che deve essere separato visivamente dal codice adiacente (una funzione, una classe, un gruppo di input o le librerie che si stanno importando).
Lo sviluppo di codice nei moduli consente di sfruttare la qualità visiva e intuitiva dei nodi, nonché le complesse relazioni che possono essere ottenute solo tramite lo scripting di testo.
Questi loop chiamano una classe denominata "agente" che verrà sviluppata nell'esercizio.
Un modulo del codice che definisce il punto iniziale di ogni agente.
Un modulo del codice che aggiorna l'agente.
Un modulo del codice che disegna una traccia per il percorso dell'agente.
Individuare il riutilizzo del codice:
Se il codice esegue la stessa operazione (o molto simile) in più posizioni, trovare modi di raggrupparla in una funzione che può essere chiamata.
Le funzioni "manager" controllano il flusso del programma e contengono principalmente chiamate alle funzioni "worker" che gestiscono dettagli di basso livello, ad esempio lo spostamento di dati tra le strutture.
In questo esempio vengono create sfere con raggi e colori in base al valore Z dei punti centrali.
Due funzioni principali "worker": una che crea sfere con raggi e visualizza i colori in base al valore Z del punto centrale.
Una funzione principale "manager" che combina le due funzioni worker. Chiamando questa funzione si chiameranno entrambe le funzioni al suo interno.
Mostrare solo ciò che è necessario vedere:
Un'interfaccia del modulo esprime gli elementi forniti e richiesti dal modulo.
Una volta definite le interfacce tra le unità, la progettazione dettagliata di ciascuna unità può procedere separatamente.
Separabilità/Sostituibilità:
Ogni modulo ignora l'esistenza dell'altro.
Forme generali di modularizzazione:
Raggruppamento di codici:
Funzioni:
Classi:
Durante lo sviluppo di script di testo in Dynamo, è opportuno assicurarsi costantemente che ciò che viene creato sia allineato con quello che si prevede. Ciò garantirà che eventi imprevisti, come errori di sintassi, discrepanze logiche, imprecisioni di valore, risultati anomali e così via, vengano rapidamente scoperti e affrontati quando si presentano piuttosto che tutti contemporaneamente alla fine. Poiché gli script di testo sono presenti all'interno dei nodi dell'area di disegno, sono già integrati nel flusso di dati del programma visivo. In questo modo, il monitoraggio consecutivo dello script sarà semplice quanto l'assegnazione di dati di output, l'esecuzione del programma e la valutazione del flusso di dati dello script utilizzando un nodo Watch. Di seguito sono riportati alcuni suggerimenti per un'ispezione continua degli script durante la loro costruzione.
Fare delle prove mentre si procede:
Ogni volta che si completa un cluster di funzionalità:
Tornare indietro e ispezionare il codice.
Essere critici. Un collaboratore potrebbe capire cosa sta facendo? Occorre farlo? Questa funzione può essere eseguita in modo più efficiente? Si stanno creando dipendenze o duplicati non necessari?
Fare rapidamente delle prove per assicurarsi che restituisca dati "appropriati".
Assegnare come output i dati più recenti che si stanno utilizzando nello script, in modo che il nodo generi sempre dati pertinenti quando lo script viene aggiornato:
Verificare che tutti i bordi del solido vengano restituiti come curve per creare un riquadro di delimitazione attorno.
Verificare che gli input del conteggio siano stati convertiti correttamente in intervalli.
Verificare che i sistemi di coordinate siano stati correttamente convertiti e ruotati in questo loop.
Prevedere "casi limite":
Durante lo scripting, aumentare i parametri di input ai valori minimo e massimo del relativo dominio assegnato per verificare se il programma funziona ancora in condizioni estreme.
Anche se il programma funziona in condizioni estreme, verificare se restituisce valori nulli/vuoti/zero indesiderati.
Talvolta, i bug e gli errori che evidenziano un problema di base relativo allo script compariranno solo durante questi casi limite.
Comprendere la causa dell'errore, quindi decidere se deve essere corretto internamente o se è necessario ridefinire un dominio dei parametri per evitare il problema.
Suggerimento Assicurarsi sempre che l'utente utilizzi ogni combinazione di ogni valore di input che gli è stato esposto. Questo aiuterà ad eliminare sorprese indesiderate.
Il debug è il processo di eliminazione dei "bug" dallo script. I bug possono essere errori, inefficienze, imprecisioni o eventuali risultati imprevisti. La risoluzione di un bug può essere semplice quanto la correzione di errori di ortografia nel nome di una variabile fino a problemi strutturali più diffusi con lo script. Idealmente, la flessibilità dello script durante la compilazione consentirà di individuare i potenziali problemi in anticipo, anche se non vi è garanzia che sia privo di bug. Di seguito è riportato un riepilogo delle diverse procedure ottimali descritte sopra per aiutare a risolvere i bug in modo sistematico.
Utilizzare il simbolo circolare di controllo:
Verificare i dati restituiti in posizioni diverse nel codice assegnandoli alla variabile OUT, in modo simile al concetto di flessibilità del programma.
Scrivere commenti significativi:
Se l'esito previsto è chiaramente descritto, sarà più semplice eseguire il debug di un modulo di codice.
In genere, si tratta di una quantità eccessiva di commenti e righe vuote, ma quando si esegue il debug può essere utile suddividere i dati in parti gestibili.
Sfruttare la modularità del codice:
L'origine di un problema può essere isolata in determinati moduli.
Una volta identificato il modulo difettoso, correggere il problema è notevolmente più semplice.
Quando un programma deve essere modificato, il codice sviluppato in moduli sarà molto più facile da modificare:
È possibile inserire moduli nuovi o sottoposti al debug in un programma esistente con la certezza che il resto del programma non cambierà.
La geometria di input restituisce un riquadro di delimitazione di dimensioni maggiori, come si può vedere dall'assegnazione di xDist e yDist ad OUT.
Le curve dei bordi della geometria di input restituiscono un riquadro di delimitazione appropriato con le distanze corrette per xDist e yDist.
Il "modulo" del codice inserito per risolvere il problema relativo ai valori xDist e yDist.
Scaricare il file di esempio facendo clic sul collegamento seguente.
Un elenco completo di file di esempio è disponibile nell'Appendice.
Tenendo a mente le procedure ottimali per lo scripting di testo, si scrive uno script di simulazione della pioggia. Sebbene sia stato possibile applicare le procedure ottimali ad un programma visivo disorganizzato in Strategie sui grafici, è molto più difficile farlo con lo scripting di testo. Le relazioni logiche definite nello scripting di testo sono meno visibili e sono quasi impossibile da distinguere in un codice caotico. La potenza dello scripting di testo comporta una responsabilità più grande nell'organizzazione. Si esaminerà ogni passaggio e si applicheranno le pratiche ottimali lungo il percorso.
Lo script è stato applicato ad una superficie deformata dall'attrattore.
La prima cosa da fare è importare le librerie di Dynamo necessarie. Questa prima operazione garantirà l'accesso globale alle funzionalità di Dynamo in Python.
Tutte le librerie che si intende utilizzare devono essere importate qui.
Successivamente dobbiamo definire gli input e l'output dello script, che verranno visualizzati come porte di input sul nodo. Questi input esterni sono la base dello script e la chiave per stabilire un ambiente parametrico.
È necessario definire input corrispondenti alle variabili nello script Python e determinare l'output desiderato:
La superficie che si intende percorrere.
Il numero di agenti che si desidera far camminare.
Il numero massimo di passi che gli agenti possono fare.
Un'opzione che consente di fare il percorso più breve lungo la superficie o di attraversarla.
Il nodo Python con identificatori di input corrispondenti agli input nello script (IN[0], IN[1]).
Le curve di output che possono essere visualizzate con un colore diverso.
Ora, si applicherà la pratica della modularità e verrà creato il corpo dello script. La simulazione del percorso più breve lungo una superficie per più punti iniziali è un'attività significativa che richiede diverse funzioni. Invece di chiamare le diverse funzioni in tutto lo script, è possibile modularizzare il codice raccogliendole in un'unica classe, l'agente. Le diverse funzioni di questa classe o di questo "modulo" possono essere chiamate con variabili differenti o persino riutilizzate in un altro script.
Occorre definire una classe, o cianografia, per un agente con l'intenzione di percorrere una superficie scegliendo di viaggiare nella direzione più ripida possibile ogni volta che fa un passo:
Nome.
Attributi globali condivisi da tutti gli agenti.
Attributi di istanza univoci per ogni agente.
Una funzione per fare un passo.
Una funzione per la catalogazione della posizione di ciascun passo in un elenco di tracce.
Si inizializzano gli agenti definendo la loro posizione iniziale. Questa è un'ottima opportunità per adattare lo script e verificare che la classe degli agenti funzioni.
Occorre creare un'istanza di tutti gli agenti che si desidera osservare percorrere la superficie e definire i loro attributi iniziali:
Un nuovo elenco di tracce vuoto.
Dove inizieranno il loro viaggio sulla superficie.
È stato assegnato l'elenco degli agenti come output per verificare che lo script venga restituito qui. Viene restituito il numero corretto di agenti, ma sarà necessario adattare nuovamente lo script in un secondo momento per verificare la geometria che restituisce.
Aggiornare ogni agente ad ogni passo. Sarà quindi necessario immettere un loop nidificato where per ogni agente e per ogni passo, quindi aggiornare e registrare la loro posizione nell'elenco delle loro tracce. Ad ogni passo, occorre assicurarsi inoltre che l'agente non abbia raggiunto un punto sulla superficie dove non può fare un altro passo che gli consenta la discesa. Se questa condizione è soddisfatta, finirà il viaggio dell'agente.
Ora che i nostri agenti sono stati completamente aggiornati, si può tornare alla geometria che li rappresenta. Dopo che tutti gli agenti hanno raggiunto il loro limite di discesa o il loro numero massimo di passi, verrà creata una PolyCurve attraverso i punti nell'elenco delle loro tracce e verranno generate le tracce di PolyCurve.
Lo script per trovare i percorsi più ripidi.
Una preimpostazione che simula la pioggia sulla superficie sottostante.
Anziché trovare il percorso più ripido, gli agenti possono essere attivati per attraversare la superficie sottostante.
Lo script di testo di Python completo.
Ottenere la geometria del contorno di tutti i drenaggi di un disegno.
Missione compiuta!
Il piano che sta dietro al progetto di Dynamo è quello di ampliare l'ambito di implementazione della piattaforma. Poiché Dynamo aggiunge altri programmi all'elenco di casi, gli utenti potranno accedere alle API specifiche della piattaforma dall'ambiente di scripting di Python. Sebbene Revit sia il case study di questa sezione, è possibile prevedere altri capitoli in futuro che offrono esercitazioni complete sullo scripting in altre piattaforme. Inoltre, ora sono disponibili numerose librerie di , che possono essere importate in Dynamo.
Negli esempi riportati di seguito sono illustrati modi per implementare operazioni specifiche di Revit da Dynamo utilizzando Python. Per una revisione più dettagliata sulla relazione di Python con Dynamo e Revit, fare riferimento alla . Un'altra utile risorsa per Python e Revit è il progetto .
La libreria Autodesk.DesignScript.Geometry consente di utilizzare la notazione punto analogamente ai blocchi di codice. Per ulteriori informazioni sulla sintassi di Dynamo, fare riferimento a e a (per scaricare questo documento PDF, fare clic con il pulsante destro del mouse sul collegamento e scegliere Salva link con nome...). Digitando un tipo di geometria, ad esempio Point., verrà visualizzato un elenco di metodi per la creazione e l'esecuzione di una query sui punti.
Per informazioni sull'utilizzo dei gruppi, fare riferimento a .
Per informazioni su come utilizzare il blocco di codice, vedere .
Per informazioni su come utilizzare Nodo da aggiungere al codice, vedere .
Per informazioni su come utilizzare List@Level, fare riferimento a .
Per informazioni sull'utilizzo dell'allineamento dei nodi, fare riferimento a .
Per informazioni su come aggiungere una nota, fare riferimento a .
Durante la compilazione dello script visivo, è importante verificare che ciò che viene restituito sia quello previsto. Non tutti gli errori o i problemi causano immediatamente la mancata esecuzione del programma, in particolare valori nulli o pari a zero che potrebbero influire più a valle. Questa strategia viene inoltre discussa nel contesto dello scripting di testo in . La seguente procedura consentirà di assicurarsi di ottenere quanto previsto.
Per informazioni su come utilizzare Watch, fare riferimento a .
Per informazioni sull'uso delle preimpostazioni, fare riferimento a .
Per informazioni sull'utilizzo dei nodi personalizzati, fare riferimento a .
Consultare per visualizzare un elenco delle funzionalità rese disponibili da ogni libreria di Dynamo.
I "moduli" del codice dell'esempio nel .
Debug del file di esempio del .
Loop
Ricorsione
Compressione di nodi
Librerie est.
Sintassi abbreviata
DesignScript
Sì
Sì
Sì
No
Sì
Python
Sì
Sì
Parzialmente
Sì
No
ZeroTouch (C#)
No
No
No
Sì
No
Lavorare all'interno di un processo di programmazione visiva può essere una potente attività creativa, ma molto rapidamente il flusso di programma e gli input utente chiave possono essere oscurati dalla complessità e/o dal layout dell'area di lavoro. Saranno esaminate alcune procedure ottimali per la gestione del programma.
Dopo aver aggiunto più di qualche nodo all'area di lavoro, è possibile riorganizzare il layout dei nodi per maggiore chiarezza. Selezionando più nodi e facendo clic con il pulsante destro del mouse sull'area di lavoro, nella finestra a comparsa è disponibile un menu Allinea selezione con le opzioni di giustificazione e distribuzione in X e Y.
Selezionare più di un nodo.
Fare clic con il pulsante destro del mouse sulla area di lavoro.
Utilizzare le opzioni di Allinea selezione.
Avendo maturato un po' di esperienza, si potrebbe "leggere" il programma visivo esaminando i nomi dei nodi e seguendo il flusso di programma. Per gli utenti di tutti i livelli di esperienza, è inoltre consigliabile includere etichette e descrizioni con linguaggio semplice. A tale scopo, in Dynamo è disponibile un nodo delle note con un campo di testo modificabile. È possibile aggiungere note all'area di lavoro in due modi:
Individuare il menu Modifica > Crea nota.
Utilizzare il tasto di scelta rapida da tastiera CTRL+W.
Una volta aggiunta la nota all'area di lavoro, verrà visualizzato un campo di testo che consente di modificare il testo nella nota. Una volta creata, è possibile modificare la nota facendo doppio clic o facendo clic con il pulsante destro del mouse sul nodo della nota.
Quando le dimensioni del programma visivo aumentano, è utile identificare i passaggi più lunghi che verranno eseguiti. È possibile evidenziare raccolte di nodi di dimensioni maggiori con un gruppo per etichettarle con un rettangolo colorato nello sfondo e un titolo. Esistono tre modi per creare un gruppo con più di un nodo selezionato:
Individuare il menu Modifica > Crea gruppo.
Utilizzare il tasto di scelta rapida da tastiera CTRL+G.
Fare clic con il pulsante destro del mouse sull'area di lavoro e selezionare Crea gruppo.
Una volta creato un gruppo, è possibile modificarne le impostazioni, come titolo e colore.
Suggerimento L'utilizzo di note e gruppi è un modo efficace per annotare il file e aumentare la leggibilità.
Ecco un esempio di programma a cui sono stati aggiunti gruppi e note:
Nota: "Grid Parameters"
Nota: "Grid Points"
Gruppo: "Create a Grid of Points"
Gruppo: "Create an Attractor Point"
Nota: "Calibrate Distance Values"
Nota: "Variable Grid of Circles"
Questa pagina di riferimento estende le procedure ottimali descritte in Strategie di scripting con maggiori dettagli su librerie di codici, etichettatura e applicazione di stili. Per illustrare i concetti riportati di seguito, verrà utilizzato Python, ma gli stessi principi si applicano a Python e C# (zero-touch) ma con una sintassi diversa.
Le librerie standard sono esterne a Dynamo e sono presenti nei linguaggi di programmazione Python e C# (zero-touch). Dynamo dispone anche di un suo gruppo di librerie che corrispondono direttamente alla gerarchia dei nodi, consentendo all'utente di creare qualsiasi elemento nel codice che potrebbe essere creato con nodi e fili. Di seguito è riportata una guida per gli elementi a cui ciascuna libreria di Dynamo consente di accedere e per quando utilizzarne una standard.
Librerie standard e librerie di Dynamo
Le librerie standard di Python e C# possono essere utilizzate per creare strutture avanzate di flussi e dati nell'ambiente Dynamo.
Le librerie di Dynamo corrispondono direttamente alla gerarchia dei nodi per la creazione della geometria e di altri oggetti di Dynamo.
Librerie di Dynamo
ProtoGeometry*
Funzionalità: arco, riquadro di delimitazione, cerchio, cono, sistema di coordinate, cuboide, curva, cilindro, spigolo, ellisse, arco di ellisse, faccia, geometria, elica, gruppo di indici, linea, mesh, curva NURBS, superficie NURBS, piano, punto, poligono, rettangolo, solido, sfera, superficie, topologia, TSpline, UV, vettore, vertice.
Modalità di importazione: import Autodesk.DesignScript.Geometry
``
DSCoreNodes
Funzionalità: colore, intervallo di colori 2D, data e ora, intervallo di tempo, IO, formula, logica, elenco, matematica, Quadtree, stringa, filettatura.
Modalità di importazione: import DSCore
Tassellamento
Funzionalità: superficie convessa, Delaunay, Voronoi.
Modalità di importazione: import Tessellation
DSOffice
Funzionalità: Excel.
Modalità di importazione: import DSOffice
*Nota Quando si utilizza ProtoGeometry tramite Python o C#, si stanno creando oggetti non gestiti, che richiedono la gestione manuale della memoria. Per ulteriori informazioni, vedere la sezione riportata di seguito: Oggetti non gestiti.
Durante lo scripting, vengono costantemente utilizzati identificatori per denotare elementi quali variabili, tipi, funzioni e altre entità. Attraverso questo sistema di notazione simbolica, mentre si creano algoritmi si può comodamente fare riferimento alle informazioni tramite etichette, solitamente composte da una sequenza di caratteri. L'assegnazione di nomi alle cose gioca un ruolo significativo nella scrittura di un codice che possa essere facilmente letto e compreso da altri e in futuro anche dal programmatore stesso. Di seguito sono riportati alcuni suggerimenti da tenere presenti durante la denominazione di elementi nello script:
È possibile utilizzare abbreviazioni, ma spiegare l'abbreviazione con un commento:
Evitare l'etichettatura ridondante:
Utilizzare la logica positiva per i nomi delle variabili anziché la logica negativa:
Preferire la "notazione inversa":
È più adatta, in termini strutturali.
Per accorciare le catene troppo lunghe e spesso ripetute, è necessario utilizzare alias:
L'aliasing può portare rapidamente a programmi molto confusi e non standard.
Utilizzare solo parole necessarie:
"Tutto dovrebbe essere reso il più semplice possibile, ma non più semplice." – Albert Einstein
In generale, esistono più modi per programmare qualsiasi cosa, quindi lo "stile personale" di scripting è il risultato delle innumerevoli piccole decisioni che si è scelto di prendere (o di non prendere) lungo la strada. Detto questo, la leggibilità e la gestibilità del codice sono un risultato diretto della sua coerenza interna e della sua conformità alle convenzioni stilistiche generali. Come regola generale, anche il codice che risulta identico in due punti dovrebbe funzionare allo stesso modo. Di seguito sono riportati alcuni suggerimenti per la scrittura di un codice chiaro e coerente.
Convenzioni di denominazione: scegliere una delle convenzioni riportate di seguito per ogni tipo di entità nel codice e attenersi ad essa.
Variabili, funzioni, metodi, pacchetti, moduli:
lower_case_with_underscores
Classi ed eccezioni:
CapWords
Metodi protetti e funzioni interne:
_single_leading_underscore(self, ...)
Metodi privati:
__double_leading_underscore(self, ...)
Costanti:
ALL_CAPS_WITH_UNDERSCORES
Suggerimento: evitare variabili con una lettera (soprattutto l, O, I) tranne che in blocchi molto corti, quando il significato è chiaramente visibile dal contesto immediato.
Utilizzo di righe vuote:
Circondare le definizioni di classi e funzioni di livello superiore con due righe vuote.
Le definizioni dei metodi all'interno di una classe sono circondate da una singola riga vuota.
È possibile utilizzare (con moderazione) righe vuote aggiuntive per separare gruppi di funzioni correlate.
Evitare spazi estranei:
Immediatamente all'interno delle parentesi tonde, quadre o graffe:
Subito prima di una virgola, un punto e virgola o due punti:
Subito prima della parentesi aperta che inizia l'elenco di argomenti di una chiamata di funzione:
Subito prima della parentesi aperta che inizia un'indicizzazione o un sezionamento:
Circondare sempre questi operatori binari con uno spazio su entrambi i lati:
Controllare la lunghezza della riga:
Non superare circa i 79 caratteri.
Limitare la larghezza richiesta per la finestra dell'editor consente di mostrare diversi file aperti affiancati e funziona bene quando si utilizzano gli strumenti di verifica del codice che presentano le due versioni in colonne adiacenti.
Le righe lunghe possono essere suddivise su più righe con il ritorno a capo delle espressioni tra parentesi:
Evitare commenti ovvi e ridondanti:
A volte meno commenti creano codice più leggibile. Soprattutto se obbliga ad utilizzare nomi di simboli significativi.
L'adozione di buone abitudini di codifica riduce la dipendenza dai commenti:
Suggerimento: i commenti indicano perché, il codice indica come.
Verificare il codice open source:
I progetti open source sono realizzati grazie alle iniziative collaborative di molti sviluppatori. Questi progetti devono mantenere un elevato livello di leggibilità del codice, in modo che il team possa collaborare nel modo più efficiente possibile. È pertanto consigliabile esaminare il codice sorgente di questi progetti per osservare le attività di questi sviluppatori.
Migliorare le convenzioni:
Chiedersi se ciascuna convenzione soddisfa o meno le esigenze imminenti.
Le funzionalità/L'efficienza sono compromesse?
Consultare queste pagine Wiki per indicazioni sulla scrittura di C# per la funzionalità zero-touch e sul contributo a Dynamo:
Questa Wiki illustra alcuni standard di codifica generali per la documentazione e il test del codice: https://github.com/DynamoDS/Dynamo/wiki/Coding-Standards.
Questa Wiki illustra in particolare gli standard di denominazione per librerie, categorie, nomi di nodi, nomi di porte e abbreviazioni: https://github.com/DynamoDS/Dynamo/wiki/Naming-Standards.
Oggetti non gestiti:
Quando si utilizza la libreria della geometria di Dynamo (ProtoGeometry) da Python o C#, gli oggetti della geometria che si creano non verranno gestiti dalla macchina virtuale e la memoria di molti di questi oggetti dovrà essere pulita manualmente. Per eliminare oggetti nativi o non gestiti, è possibile utilizzare il metodo Dispose o la parola chiave using. Per una panoramica, vedere questa voce Wiki: https://github.com/DynamoDS/Dynamo/wiki/Zero-Touch-Plugin-Development#dispose--using-statement.
È sufficiente eliminare le risorse non gestite che non vengono restituite nel grafico o in cui non viene memorizzato un riferimento. Per il resto di questa sezione, si farà riferimento a questi oggetti come geometria intermedia. Nell'esempio di codice riportato di seguito è mostrato un esempio di questa classe di oggetto. Questa funzione di C# zero-touch singleCube restituisce un singolo cubo, ma crea 10000 cubi aggiuntivi durante l'esecuzione. Si può far finta che quest'altra geometria sia stata utilizzata come geometria di costruzione intermedia.
Questa funzione zero-touch probabilmente provocherà un arresto anomalo di Dynamo. E ciò perché sono stati creati 10000 solidi, ma ne è stato memorizzato solo uno e ne è stato restituito solo uno. Si dovrebbero invece eliminare tutti i cubi intermedi, tranne quello restituito. Non si desidera eliminare ciò che viene restituito, perché verrà propagato nel grafico e utilizzato da altri nodi.
Il codice corretto avrà un aspetto simile al seguente:
In generale, è necessario eliminare solo la geometria come Surfaces
, Curves
e Solids
. Per essere sicuri, tuttavia, è possibile eliminare tutti i tipi di geometria (Vectors
, Points
, CoordinateSystems
).