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...
Un punto è 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]
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 relativa correlazione 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.
Dynamo Package Manager offre funzionalità aggiuntive per le operazioni e i tipi di geometria estesi. Visitare la pagina sul pacchetto Mesh Toolkit.
Le curve 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
NURBS è 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.
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.
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.
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 solidi (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 operazioni booleane 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.
YÈ possibile leggere ulteriori informazioni sul congelamento dei nodi nella sezione Nodi e fili.
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 vettore è 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.
Il piano è 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).
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.
Il sistema di coordinate è 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.
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
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.
Nel campo della modellazione computazionale, le 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
La libreria fornisce inoltre strumenti per modificare e correggere la mesh o estrarre sezioni orizzontali da utilizzare nella fabbricazione.
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.
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.
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.
Icona | Nome (Sintassi) | Input | Output |
---|
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.
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.
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.
In questa sezione, vengono introdotti i nodi essenziali disponibili nella libreria di Dynamo che consentono di creare un programma visivo personalizzato come un professionista.
: come si lavora con gli elementi geometrici in Dynamo? Si esplorano diversi modi per creare geometrie semplici o complesse da primitive.
: 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.
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.
che cosa sono i dizionari? È descritto come utilizzare i dizionari per cercare dati e valori specifici dai risultati esistenti.
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.
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.
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.
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.
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:
Icona | Nome (Sintassi) | Input | Output |
---|
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.
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.
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.
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.
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.
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.
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.
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.
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.
**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.
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.
Icona | Nome (Sintassi) | Input | Output |
---|
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.
Icona | Nome (Sintassi) | Input | Output |
---|
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à.
Icona | Nome (Sintassi) | Input | Output |
---|
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
La linea è 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.
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.
Le funzionalità della mesh di Dynamo possono essere estese installando il pacchetto . 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.
Visitare i , ad esempio sull'utilizzo di questo pacchetto.
Ora, la maggior parte dei nodi del passaggio precedente funzionerà correttamente, ma richiede molto lavoro. Per creare un workflow più efficiente, esaminare 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.
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 .
Icona | Nome/Sintassi | Input | Output |
---|
Photo by .
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.
In questo esercizio, si utilizzeranno i metodi di esecuzione delle query e manipolazione delle stringhe per analizzare l'ultima strofa di 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.
Successivamente, è necessario decidere quali chiavi utilizzare per la ricerca di questi dati. Per informazioni sulle chiavi, vedere la sezione .
Immagine gentilmente concessa da
Foto di
Object.IsNull | obj | booleano |
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. |
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. |
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à |
Add (+) | var[]...[], var[]...[] | var[]...[] |
Subtract (-) | var[]...[], var[]...[] | var[]...[] |
Multiply (*) | var[]...[], var[]...[] | var[]...[] |
Divide (/) | var[]...[], var[]...[] | var[]...[] |
If (If) | test, true, false | risultato |
Formula (IF(x,y,z)) | x, y, z | risultato |
Code Block ((x?y:z);) | X, Y, Z | risultato |
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 Zeta) è 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.