Dynamo – Antonino Sciortino

A beneficio di un cliente, traduco in italiano uno degli esercizi che si trovano sul Dynamo Primer, guida stupenda per chi vuole iniziare a lavorare con lo strumento di Computational Design per Revit. In particolare, traduco il set di esercizi che insegna a maneggiare le liste e che sembra uno script nato per creare le sculture […]

A beneficio di un cliente, traduco in italiano uno degli esercizi che si trovano sul Dynamo Primer, guida stupenda per chi vuole iniziare a lavorare con lo strumento di Computational Design per Revit. In particolare, traduco il set di esercizi che insegna a maneggiare le liste e che sembra uno script nato per creare le sculture di Antonino Sciortino.

L’esercizio nel Dynamo Primer fornisce i passaggi uno per uno, in sequenza. Io preferisco spiegarli in sequenza logica, spesso partendo dal fondo, quindi non si tratta di un’effettiva traduzione ma di una spiegazione in italiano di quello che trovate sulla guida. Può essere utile, quindi, anche a chi mastica bene l’inglese.

Antonino Sciortino è uno straordinario scultore contemporaneo con laboratorio a Milano.
Antonino Sciortino è uno straordinario scultore contemporaneo con laboratorio a Milano.

1. Un vaso dritto

L’inizio dell’esercizio richiede di creare due cerchi, uno di base e uno per la bocca del vaso, e una serie di linee che passano per punti posizionati su quei due cerchi.

Sciortino_000

 

Per farlo, abbiamo intanto necessità di tracciare il cerchio di base e poi di crearne una copia all’altezza desiderata. Per tracciare il cerchio di base, l’esercizio originale usa il nodo Circle.ByPlaneRadius, ma io ritengo che sia infinitamente più semplice utilizzare – in questo frangente – il nodo Circle.ByCenterPointRadius, che vuole semplicemente il punto iniziale e il raggio. Se non ricordate il funzionamento di questo nodi, potreste voler dare un’occhiata a questo esercizio che praticamente non fa altro se non aggrovigliarsi in cerchi e cilindri.

Sciortino_001a

Una volta tracciato il primo cerchio, si può tracciare il secondo semplicemente traslando la geometria, ovvero utilizzando il nodo Geometry.Translate. Anche in questo caso ne esistono varie versioni, ma credo sia più semplice utilizzare quello che trasla per coordinate e limitarsi a fornire nella “zTranslation” un valore che è pari all’altezza del vaso.

Sciortino_001b
Possiamo sempre rinominare un nodo facendo doppio click sulla sua barra del titolo: consiglio di farlo solo sugli input, pena non ricordare più nulla di quello che faceva lo script.

A questo punto, bisogna posizionare una sequenza di punti sulle curve della base e della bocca del vaso. La suddivisione che Dynamo fa di una curva è parametrica e in questo si comporta come nell’ambiente dei componenti adattivi: non avendo lui assolutamente nessuna idea della lunghezza effettiva dell’elemento, considera un range da 0 a 1, dove 0 è l’inizio della curva e 1 è la sua fine. Dato che si tratta di un cerchio, quindi di una curva chiusa, 0 e 1 coincidono.

Per iniziare, si può fare una sequenza di 10 valori da 0 a 1. La sintassi in un code block è “0..1..#10”.

Attenzione, perché Geometry.Translate a tutti gli effetti sposta la geometria, mentre a me continuano ad interessare entrambe. Bisogna quindi creare una lista che contiene entrambi i cerchi, per agire contemporaneamente su entrambi.

Sciortino_001c

In questo frangente ci troviamo a misurarci nuovamente con un concetto importante, già visto nei precedenti esercizi, ovvero il concetto di lacing. Ho due cerchi, ma dieci punti e voglio che ogni cerchio abbia tutti i punti. Il lacing deve quindi essere impostato su Cross-Product.

Sciortino_001d

 

A questo punto, avrò una lista strutturata in due gruppi: tutti i punti sul primo cerchio e tutti i punti sul secondo cerchio.

Sciortino_001e

Per connetterli con una linea, quindi, il comando sarebbe Line.ByStartPointEndPoint, ma ho necessità di suddividere le due liste. Ho vari modi di farlo, ma posso accontentarmi di un List.GetItemAtIndex la cui notazione breve in un code block è x[n] dove “n” è il numero dell’indice da estrarre.

Sciortino001f

Nota: l’esercizio originale non entra nel concetto di lacing, quindi procede diversamente.


 

2. Torciamo il vaso

In questo momento, stiamo collegando il primo punto della prima lista al primo punto della seconda lista. Ne risultano delle aste dritte, verticali. Se vogliamo iniziare a dare un twist al nostro oggetto, possiamo iniziare a provare a far collegare il primo punto della prima lista all’ultimo punto della seconda lista. Per farlo, una delle due liste deve essere rivoltata, come un guanto, ovvero fatta procedere in ordine inverso. Per fare questo, l’esercizio usa il nodo List.Reverse.

Reverse

La cosa diventa un pochino più interessante, dal punto di vista visivo, se aumentiamo il numero di punti posizionati sulla curva.

Sciortino_002


 

3. Forse è troppo…

Una volta ottenuto il vaso torto, potremmo anche decidere che non ci piace poi così tanto. Un’altra cosa che si può provare a fare è dare un twist meno prepotente, qualcosa di più delicato. Potrei, come se stessi intrecciando un oggetto di paglia, provare a collegare il primo punto della prima lista con il secondo punto della seconda lista, il secondo punto della prima lista con il terzo punto della seconda e così via. Questo concetto si esprime con il comando List.ShiftIndex.

ShiftIndex

Il nodo vuole un numero intero nella porta “Amount” e questo numero rappresenta la quantità di indici lungo i quali deve spostarsi.

Sciortino_003

Sostituendo questo comando al List.Reverse, otteniamo una torsione più delicata dell’elemento.

Sciortino_003

Shift.Index funziona come il cifrario di un codice: sto dicendo allo script che ad un certo punto ne corrisponde un altro, in una posizione diversa della lista.

Combinare due liste in questo modo è un po come usare un disco cifrante nella foto, quello di Leon Battista Alberti)
Combinare due liste in questo modo è un po come usare un disco cifrante nella foto, quello di Leon Battista Alberti)

Per un vecchio principio geometrico, aumentando il numero di shift ottengo un vaso più o meno assottigliato al suo centro.

ezgif.com-gif-maker (1)

 


4. Un cifrario un po’ più complesso

Il cifrario che abbiamo costruito in questo momento è un cifrario abbastanza scarso: ci siamo limitati a spostare l’indice di un valore fisso. Lo decodificherebbe anche un bambino. Per fare qualcosa di un pochino più complesso, e ottenere una geometria un pochino più aggrovigliata, possiamo provare a introdurre un elemento di casualità. Uno dei nodi con cui è possibile farlo è List.Shuffle, che rimescola la lista come un mazzo di carte.

Non dite che non vi piace: è arte.
Non dite che non vi piace: è arte.

 


 

5. Non tutti i punti

Se ancora non siamo soddisfatti, potremmo voler saltare alcuni punti che non ci piacciono. Ogni volta che vogliamo impostare una condizione e chiedere allo script di non considerare alcuni indici che corrispondono ad una certa condizione, quello che stiamo cercando di fare è una maschera booleana.

FilterByBooleanMask

La maschera booleana funziona come una scheda perforata che sovrappongo alla mia lista in modo da vedere solo i valori che mi interessano.

PunchCard

Buona parte della difficoltà risiede nello spiegare a Dynamo cosa mi interessa e perché. Buona parte della difficoltà risiede anche nello spiegarlo a noi stessi.

Nell’esercizio del Dynamo Primer, l’obiettivo è isolare un punto ogni quattro. Non chiedetemi perché. Non lo sa nessuno.

Sciortino005

Lo script usa una serie di nodi dal funzionamento semplice, ma dalla sintassi complessa. Li scompongo gruppo per gruppo e vediamo come possono essere sostituiti da qualcosa di più semplice.

  1. Il code block definisce un’espressione usando la sintassi 0..List.Count(list). ma può essere facilmente sostituito da List.Count: connettendolo a Curve.PointAtParameter, ci restituisce un valore che è la lunghezza della lista. Avendo parametrizzato il numero di punti, non ne abbiamo bisogno: possiamo utilizzare direttamente quel valore. Quello che dobbiamo fare però è una sequenza che vada da 0 a quel valore.
  2. Il nodo percentuale (%) ha bisogno di due input: il primo input è la sequenza che va da 0 al totale di indici e l’altro è l’indice che ci interessa considerare (nel nostro caso, 4). Ci restituisce la rimanenza una volta divisa la lista in indici a gruppi di 4, ovvero una serie di (0,1,2,3).
  3. Di queste sequenze, mi interessano gli indici con valore 0 e quindi imposto una semplice condizione di uguaglianza stretta (==) con 0: sto letteralmente chiedendo al sistema, in modo algebrico, di raccontarmi quali di questi indici è divisibile per 4.
  4. Il risultato è una lista di true e false, laddove true sono gli indici divisibili per 4. Si tratta della mascheda booleana che volevo.
  5. Il nodo Filter.ByBoolMask vuole come input la lista e la maschera così ottenuta.

Sciortino005b

 

Sciortino005a

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.