Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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:
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.
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.
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):
Testo leggibile dall'utente | Notazione con punto | Output |
---|---|---|
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.
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.
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.
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.
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
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.
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:
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.
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.
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.
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 sul sito
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:
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.
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.
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
Classe | CoordinateSystem messo in scala in modo non uniforme | CoordinateSystem tagliato |
---|
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.
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 |
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ì |
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
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.
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 IronPython, 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 pagina Wiki di Dynamo. Un'altra utile risorsa per Python e Revit è il progetto Revit Python Shell.
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.
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
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 |
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
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.