Scriptable Ambience
Moduli didattici sullo script
(per scorrere il modulo abilitare ActiveX e servirsi della barra in alto)
Arch. Antonino Di Raimo
Corso di Progettazione Architettonica Assistita aa2008-2009 - CAAD 2009 - Prof. Antonino Saggio
I moduli qui presentati fanno parte di un ciclo di ricerca condotto all´interno del Dottorato di Ricerca in 'Composizione Architettonica - Teorie dell'Architettura' - XXIII Ciclo -
Dottorando: Antonino Di Raimo - tutor: Prof. Arch. Antonino Saggio
La riproduzione e l'estrapolazione dei dati qui presentati sono consentiti nell'ambito di una serie di regole condivise ovvero citare gli autori e le altre fonti, utili a ricostruire la storiad della formazione delle idee....
Cominciamo col ricapitolare alcuni degli aspetti relativi al rapporto strutturale dell'informatica con l'architettura, rapporto che è stato definito già come tale in questo corso; possiamo anche osservare come esso si articoli su diversi livelli quali quello culturale, sociologico, filosofico, e... naturalmente estetico! Possiamo ancora individuarne molti, poichè è un vero e proprio rapporto strutturale, che coinvolge quindi questioni molto profonde, quali ad esempio quelle dentitarie, e condiziona l'architettura in maniera permanente... Allora, Riguardiamo infatti questo link a cura del Prof. A. Saggio: Informazione Materia Prima dell'Architettura e facciamo le nostre considerazioni riallacciandoci ad alcune delle conquiste che avrete cominciato a fare nel corso....; Ci interessano però alcuni aspetti evidenti di tale rapporto che ci portano su un piano progettuale; tutto ciò non tanto per costruire, alimentare e cristallizzare, una presunta cultura del progetto frutto della Rivoluzione Informatica, (il che probabilmente corrisponderebbe al voler imbrigliare in una struttura burocratica un fenomeno ancora così vitale), quanto per costruire rispetto al fenomeno architettonico, un pensiero nel quale l'informatica e la sua strumentazione siano centrali. Perchè lo Strumento è la chiave di un ragionamento finalizzato alla costruzione (e decostruzione) del progetto architettonico,quale fenomeno basato su meccanismi che ne determinano la sostanza? Riferiamoci come base di questo ragionamento ancora ad una Conferenza del Prof. Saggio >>>>qui E poi per chi volesse il testo in italiano di questo pensiero, lo si può trovare >>>>qui
|
|||
Più che dello strumento, ampiamente trattato dal Prof. Saggio al link precedente, vorrei indicare come spunto su cui riflettere a partire da quel pensiero, la condizione di strumentazione, ovvero una dimensione cognitiva, nella quale una certa strumentazione, intesa come un insieme di apparati anche composti di strumenti diversi, assuma una condizione cruciale all'interno dell'operare umano.
|
|||
La condizione è cruciale poichè intendo dire che lo strumento e la strumentazione:
|
|||
A) Rivelano dimensioni altrimenti non date, che entrano a far parte del dominio descrittivo di un osservatore; costituiscono il suo mondo o anche il suo dominio cognitivo; intendo dire riallacciandomi a quanto afferma Saggio che un'architettura prospettivizzabile sia quanto mai inimmaginabile senza un dominio cognitivo nel quale la prospettiva non sia entrata a far parte; | B) Permettono di operare con quelle dimensioni....
|
C) Operare con quelle dimensioni significherebbe per un architetto:
rappresentarle riprodurle ovvero manipolarle >>>>>>>>>>> notiamo però: Lo strumento rivela delle dimensioni ma l'osservatore ovvero chi manipola lo strumento, fa comunque parte della scena! |
|
osservazioni...
|
|||
a) Una premessa fondamentale è l’osservazione che l’architettura fra i vari piani che le competono investe quello formale in maniera cruciale, e che la preoccupazione della forma, sia in senso parossistico (intendo i cosiddetti formalisti e formalismi) che nel suo contrario (ovvero il minimal) è naturalmente questione quanto mai fondamentale nel processo progettuale, ferma restando l’importanza di tutte le altre. | b) Un’altra osservazione che faremo sin da ora e che progressivamente amplieremo durante il corso, è che gli atti, le azioni che eseguiremo con la forma e per la forma, sia in fase di progettazione che nella realtà di un’opera di architettura, costituiscono la condizione e le promesse di quello che definiamo da un lato come produzione del progetto e dall’altro il suo programma d’uso. |
c) Tutto ciò premesso, se il rapporto con l’informatica è strutturale e ragion per cui abbiamo più volte definito il mondo dei dati come un mondo in-formazione; vogliamo proprio attraverso questa circostanza (che forse è quella che rivela di più la sostanza di questo rapporto) evidenziare un insieme di strumenti progettuali, ma anche modalità processuali consustanziali al progetto d’architettura all’epoca della rivoluzione informatica, che indicheremo come script |
Ma.....................................................................................................Cos’è lo script?!? Tecnicamente uno script è una serie di istruzioni. Il computer esegue le istruzioni, quindi restituisce dei dati, o dei valori quali potrebbero essere numeri, stringhe, elenchi, o ancora altri tipi di dati. Alcune osservazioni: Coerentemente alla definizione del Prof. Saggio, sull'informazione, osserviamo che il computer restituisce delle informazioni; le operazioni che noi facciamo quindi sono nel senso più letterale del termine, applicazioni continue di convenzioni a dati.
.................................. |
||
Alcune osservazioni di base, utili per orientarci in questo argomento: |
||
Programmazione |
Non ci riferiamo certo alla programmazione quando ci occupiamo di Script. Sebbene alcuni livelli operativi di programmabilità è fin troppo ovvio che ci siano, la programmazione è qualcosa di più complesso e dagli obiettivi ancora più generali. Quando un programmatore scrive un programma, 'insegna' letteralmente alla macchina a fare un compito. Posso scrivere un programma per disegnare, uno per scrivere e-o per impaginare, posso scriverne un altro per fare musica. I Programmi stessi poi si suddividono a seconda di come sono scritti e compilati... |
|
Script |
Lo Script invece, sebbene possa avere dei livelli di programmazione, avviene in un ambiente già precostituito, sia un OS, o una determinata applicazione. Quando il caso è quest'ultimo, esso diventa un modo non solo per avere un accesso più diretto ad alcune funzionalità del programma, ma per assemblarle, manipolarle, e costruirne altre in maniera più personale e specifica. Lo script salta il livello dell'interfaccia grafica fatta di icone, palette, menu, ecc. Questo salto se da un lato ci costringe ad abbandonare le certezze di un'interfaccia che conosciamo, dall'altro ci consente di raggiungere un livello di interazione con l'applicazione molto più profondo. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Lo script arriva direttamente all'inconscio di un'applicazione; il che vuole essere solo un'analogia per inquadrare meglio la questione.................................................................................................... |
|
Codice |
Sebbene le differenze fra codice e linguaggio ad un certo livello siano sfumate, per i nostri scopi è sufficiente considerare il codice quale corrispondenza fra simboli; il codice Morse ne è un esempio. Possiamo anche parlare in generale di codici che si differenziano a seconda dei linguaggi in cui sono scritti, tuttavia ci riferiamo principalmente al linguaggio per la sua intrinseca capacità di costituire delle strutture ricche di significato e complesse nelle quali infine non possiamo fare delle considerazioni sugli insiemi di simboli, trascendendo l'esistenza di una sintassi (regole di composizione) e di una grammatica (morfologia, fonologia, ecc.); | |
Linguaggio
|
Ci riferiamo al linguaggio, data la sua sostanziale propensione comunicativa; Ovviamente il linguaggio a cui fa riferimento lo script, non sarebbe neanche lontanamente paragonabile alla ricchezza del linguaggio umano. Tuttavia riteniamo che la capacità del linguaggio di formulare un pensiero o di esprimere un'emozione, sia preferibile come cornice concettuale finalizzata al progetto di architettura, al concetto più neutro di codice. Altra segnalazione è relativa agli studi di tipo filosofico e cognitivo che hanno avuto e hanno al centro della propria elaborazione il linguaggio stesso. Si tratta della linguistica, che a sua volta ha come oggetto di studio il linguaggio quale sistema comunicativo umano per mezzo di apparati simbolici, e la lingua... L'impostazione cognitiva classica, vede il linguaggio costruito su delle strutture innate. La questione è complessa e di grande interesse, tuttavia esula i limiti di questo modulo. Ne parlo, poichè come molte delle tematiche delle scienze cognitive, finisce per toccare questioni molto vicine all'architettura quale attività che formula in qualche modo un linguaggio strutturandolo sullo spazio |_|*** |
|
Interfacce e non interfaccia |
Usiamo il termine interfacce, per mettere in evidenza l'esistenza di più livelli nei quali due enti diversi stabiliscono in qualche modo un contatto>>>>>><<<<<<<<< Notate che a mio modo di vedere, il problema principale è stabilire sempre un contatto con il mondo, e come questo avviene.................................................................................................................................................._____________________________ Nel nostro caso, pur saltando l'interfaccia classica del programma, alla fine scopriremo di trovarci ancora in un'altra. Questa è senza icone indubbiamente, ma con l'esclusiva strumentazione costituita da un sistema di scrittura basato su un linguaggio costituito da:: simboli e numeri, funzioni, ovvero strutture di calcolo e parole, istruzioni, ovvero come ci si comporta, comunicazioni più o meno dirette fra utente e applicazione, ..................................................................................................................................................................ecc. E' in questa 'condizione strumentale' così ricca, che stiamo entrando... |
|
|
Riassumendo velocemente quanto detto fin qui:
In generale l’utilizzo dello script permette un livello di interazione fra user ed applicazione molto più profondo, sia in termini di possibilità che lo script permette, che in termini cognitivi. Lo script dunque >>>>>>>>>>>> si regge su una sintassi; Lo script dunque >>>>>>>>>>>> è un fatto la cui natura è prima di tutto linguistica... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Altrimenti come farei a dare delle istruzioni?>>>>>>>>>>>>>;-)
|
||
Ambiti dell’uso dello script nel progetto di architettura; La forma di dialogo fra utente-progettista e macchina è come dire più profonda. Come a dire forzando un'analogia: un dialogo fra 'inconscio dell'applicazione' progetto e luogo del setting.>>>>
Alcuni livelli: |
||
Fenomenologia principale >>>>>Genesi formale attraverso lo script>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Forma Sotto argomenti:
Lo script in fondo possiamo vederlo come la scrittura di una 'condizione' spaziale! ovvero una circostanza necessaria affinchè avvenga qualcosa.... Parliamo dunque di qualcosa di incerto, ancora imprevisto e condizionato.... Un progetto appunto....................... |
un momento di attenzione:
|
||
Quando infatti chiediamo il valore di una certa funzione y=f(x) come ad esempio y = sin (x) con x = 30°, il computer sta facendo qualcosa che potremo considerare come un’implementazione digitale della famosa formula di Taylor:
|
||
Formula che più che spaventarci, deve al contrario ricordarci che il computer sta approssimando mediante un polinomio di grado n, la funzione proposta. Niente di più e niente di meno. ci avvaliamo cioè di simboli in grado di esprimere delle quantità variabili e dei percorsi operazionali, e di calcolo in quanto tale… Questo qui sotto è quello che succede con l'interfaccia classica.... Immaginiamolo di scriverlo, e scrivendolo apriamo delle sfumature, molto più articolate di quelle che vediamo in superficie..... |
||
|
Ora parliamo di architettura: Ci riferiamo alle analisi su un progetto di Eisenman che Saggio fa in questo libro: qui |
||||
e anche: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Digital Scape | ||||
ancora:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Evan Douglis | ||||
infine:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Kokkugia | ||||
per ora osserviamo in maniera critica, questi architetti dai link che vi propongo.... Ci torneremo............................................................................................ | ||||
poichè stiamo entrando in un mondo di condizioni, cioè di: ;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;possibilità ________________||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||simulazioni emersioni di dimensioni formali dove la scrittura della forma è ad un livello molto fine e profondo.....
Dico scrittura perchè la storia ovvero la genesi si è svolta come afferma lo stesso Watanabe fra 2 estremi, che a ben vedere sono sempre presenti nella storia di un progetto: Random :...::......_._:__...._____:::::...._____e.....____________________:::::::::::::::::Ordine! che costituiscono ancora due modi di vedere il mondo 'in-formazione' di cui ci parla il Prof. Saggio....
|
|
Qui un classico di quello che diciamo: | |
Makoto Sei Watanabe | Stazione di Idabashi, Web Frame |
http://b.durandin.free.fr/iveheardabout/iha.htm
E qui ancora un altro classico, dove scrivere queste condizioni implica porsi il problema della progettazione della crescita e dell'autogenerazione della forma ................ oltre a delle dimensioni più squisitamente 'politiche' e visionarie (nel senso virtuoso, intelligente e provocatorio del termine)! |
||
conclusioni: ovvero come riaprire una storia per lavorarci ancora:
Al lavoro per una demistificazione della forma: Leggiamo prima questa definizione, a cui personalmente tengo tantissimo: ‘Architectural theory cannot deliver the truth about architecture. Even in philosophy, the status of truth as the absolute value and goal of the investigation has been questioned since Nietzsche. Instead of a search for truth, philosophy was for him a practice of demystification,unmasking and genealogy,ultimately aiming at emancipation’. (Kary Jormakka`*) Kary Jormakka è un Teorico dell'Architettura che vive e lavora a Vienna alla Technische Universität.
demistificare Evidenziazione dell'aspetto reale di un comportamento, di un'ideologia ecc., che viene così sfrondato dei suoi tratti esteriori, spesso ingannevoli.... |
||||||
http://www.youtube.com/user/mpan3 |
||||||
http://www.youtube.com/user/pytagus | ||||||
http://www.youtube.com/user/SithBerserker1488 | ||||||
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>la forma è intrinsecamente dinamica; non è un fine ma un processo; anche quando sembra immobile!
|
||||||
possiamo immaginare una forma processuale fuzzy e sfumata naturalmente...................
Diller&Scofidio per l'appunto; Progettare un'architettura è dunque manipolare un processo sia durante la fase di progettazione che durante la fase effettiva di vita di un edificio. In quest'ultimo senso la progettazione di un edificio è progetto di cicli vitali... Lo script in questo senso? ...Tratteremo questi nei prossimi moduli che avranno anzitutto carattere applicativo..............
|
Nota: quando non diversamente specificato si intende che gli Script qui presentati, sono tratti dalla guida Ufficiale di RhinoScript, e sono a cura di: David Rutten alcuni di questi script visto il loro carattere esplicitamente didattico sono qui riportati integralmente. Questa scelta deriva dal fatto che si è ritenuto più utile abituare gli studenti ad un percorso didattico proposto in maniera ufficiale dalla stessa compagnia che produce Rhino e che potranno proseguire o meno in totale autonomia, dopo aver concluso i primi moduli. Altri script sono invece modificati in parte o in maniera più radicale; i fini di queste operazioni sono naturalmente ancora esclusivamente didattici.
|
1) Apriamo Monkey Editor, |
o in alternativa se non disponibile, l’Editor Script di Rhino, dal menù strumenti: |
1) Cominceremo oggi, con una distinzione fondamentale: Rhino come molti altri programmi può essere controllato attraverso una command-line; Anche qui, - come altrove - attraverso l’uso della tastiera possiamo scrivere qualcosa del tipo: _Line 0,0,0 10,0,0 (o in italiano digitate semplicemente linea)... è una macro semplicissima; diciamo al programma di disegnare una linea attraverso le coordinate di 2 estremi e…. Basta! |
Osservazioni: è già evidente l’uso di un sistema di coordinate cartesiane tridimensionale; valgono quindi tutte le definizioni ed osservazioni fatte nei corsi di Matematica. Avremo un’origine degli assi coordinati, delle relazioni di perpendicolarità e possiamo usare alternativamente le coordinate cartesiane o quelle polari… (Vi ricordate?) Del resto se usate Rhino, avrete già familiarità con questi concetti. Tutto questo può essere detto in modo molto più raffinato, utilizzando un concetto matematico ancora più potente e utile dentro Rhino, ovvero quello di: -------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>> Vettore! ((((((Digressione: Domanda - cos'è un vettore? - )))))))))))))))))
Il vettore è dunque, prevalentemente Informazione; certo, è vero che rappresenta un punto nello spazio, ma non lo rappresenta in modo assoluto, bensì relativo. Il vettore in sostanza esprime una distanza da un'origine e una direzione nello spazio. (Chi si ricorda?) |
2) Lo script supera le limitazioni delle macro ed avviene secondo uno spazio intermedio fra MACRO e PLUGIN. Ma quali sono le differenze con le MACRO? Teniamole bene a mente perché ci aiuteranno a scrivere meglio i nostri script: |
a) Lo script non è una semplice LISTA di comandi del tipo: disegna questo, fai quest’altro ecc. ecc.
(((((((Questo è un concetto fondamentale della programmazione script))))) Si tratta del concetto di ------------------------------------>>>>>>> FLOW CONTROL c) All’interno dello script possiamo eseguire calcoli matematici, e poi valutare i risultati.... ------>da questi produrne altri sulle basi dei risultati precedentemente ottenuti; d) L’interazione fra l’applicazione e l’utente come si è già detto l’altra volta ad un livello di comunicazione più profondo... In sintesi: Flow control-----------------------------Variable Data ------------------------------Communication |
Variabili
Variabile.... Cosa significa che una cosa è variabile? Tanto per accostarci intuitivamente a questo aspetto significa che qualcosa è intrinsecamente dinamico!!! Possiamo immaginare le variabili come dei magazzini nei quali mettere delle quantità intrinsecamente dinamiche... Cosa faccio praticamente? A)------------------------------------->>>>>>>>>>>>>>>>Assegno quindi una variabile per immagazzinare un certo valore B)---------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>Richiamo quel valore quando voglio e lo valuto C)---------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>Immagazziniamo dei numeri allora!!!!!!!!!!!! |
Diciamo che se volessimo visualizzare questo processo, avremmo qualcosa del genere: |
Immaginare le variabili come delle box, insomma, potrà aiutarci parecchio; |
Altro esempio: se da qualche parte, scrivo (vedremo poi come): e poi ancora scrivo un'altra riga del tipo: Curva = Rhino.Addline (Array (0,0,0), Array (X,0,0)) Cosa ho scritto? (Facciamo delle osservazioni...) |
Come vedete tutto quanto detto non è niente di nuovo rispetto a quanto studiato in analisi matematica - per esempio -sul concetto di funzione, dove tiriamo in ballo continuamente delle variabili (dipendenti o indipendenti)! Però bisogna sapere Rhino come lavora con delle variabili, quindi qui annoiamoci un po’…. Come altri linguaggi script (maxscript, e processing per esempio) Rhino dialoga con questi tipi di variabili: |
1) INTEGERS
E facciamo una digressione su queste tipologie poiché vi accorgerete che è importante sapere quando e come usarle....
|
1) Integers
Ciò che conta è che possiamo guardare questo insieme di variabili come appunto uno degli insiemi di numeri affrontati nella Aritmetica Elementare; |
|
2) Doubles E procedendo secondo una logica nota di ampliamento degli insiemi numerici, proprio come in matematica viene quasi spontaneo aggiungere - ampliando quest'altro insieme. Questi sono i numeri decimali. Cos’è un numero decimale? Il range anche qui è abbastanza esteso, quindi nulla da aggiungere se non il fatto che usiamo questi numeri prevakentemente per calcolare. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Facciamolo subito: X = 12+34.78905 Y = sin (x) Z= Sqr (2) K = sin (X+Y+Z)*Sqr (X*Y*Z)
|
Notiamo che oltre al semplice calcoletto abbiamo già definito con le nostre variabili, delle relazioni… Quindi un livello leggermente più complesso di quello precedente… Analizziamo quanto scritto... (((Digressione)))))))))))) E' già chiaro che valgono tutte le convenzioni usate normalmente nei corsi di matematica; i calcoli quindi saranno fatti in modo tale da rispettare in un'espressione la precedenza di moltiplicazioni e divisioni, ecc. ecc. E se, dovessi trovarmi a scrivere un calcolo come una funzione di questo tipo???? (La funzione è proposta nella guida allo script di Rhino, ma potrei scriverne un'altra ancora più difficile):
Come faccio a scrivere il mio calcolo? Niente paura:----------------------------->>>>>ovviamente la spezzetto in pezzettini più semplici! come? ovviamente essendo il più possibile sintetici, com'è nella modalità della scrittura matematica: (infatti:)
|
3) Booleans
Si tratta delle variabili che fanno riferimento all’algebra Booleana (piccola digressione)… Perché usarle? Riempi il parallelepipedo con gli oggetti che ho disegnato, e fai in modo che gli oggetti non abbiano mai ad intersecarsi, quando lo spazio disponibile è più piccolo dei più piccoli fra gli oggetti a disposizione, smetti di eseguire questo compito..................................!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Detto forse in modo poco elegante, certamente, ma efficace per capire che stiamo non solo chiedendo a Rhino di eseguire dei compiti abbastanza precisi, ma come leggete bene Rhino è costretto per passare al compito successivo a verificare continuamente delle cose; ad esempio dovrà ad un certo punto verificare che lo spazio disponibile non sia più utilizzabile. ---------------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ho quindi una frase nella quale è implicita una condizione Come fa a verificarlo? .........Utilizzando ad esempio varibili booleane; Rhino cioè valuterà se una determinata condizione è: TRUE (vera) Questo è il linguaggio che usa Rhino, non 0, non 1, e neanche On oppure Off… |
4) Stringhe Per capire bene il senso della cosa facciamo così: a=1234 Chiediamo a Rhino di stamparle a schermo: Rhino.Print(a+a) Che succede? Commentiamo i risultati Facciamo altri giochetti: A=“pasta” aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Insomma, la stringa è immagazzinata come serie di caratteri. ------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>Ogni carattere è preso dalla tavola UNICODE.....
Nota bene: Non sottovalutate le stringhe. Rhino infatti per immagazzinare l’ID Object usa proprio delle stringhe. Cos’è l’ID Object? E’ come dire, la carta di identità di ogni oggetto che popola Rhino. E’ quindi qualcosa di unico, inconfondibile, e necessario per operare con gli oggetti. |
4) La Variabile Nulla
aaaaaa Discutiamone.
|
Tutto ciò premesso come usiamo queste variabili?
|
>>>>>>>>>>>>>>>ANZITUTTO LE VARIABILI VANNO DICHIARATE! Attenzione c’è una parola chiave per farlo che è: ------------------------------------------------>>>>>>>>>>>>>>>>Dim E' chiaro che questo è il significato di questa parola che abbiamo già visto in questa lezione. |
Notiamo infine un'altra parola chiave che abbiamo nello script:
|
Option Explicit.... Cosa significa?
|
E' importante aprire lo script con questo termine, poichè stiamo dicendo a Rhino che dichiareremo esplicitamente tutte le variabili; se non lo facciamo, accade che ci pensa lui, ma questo non ci conviene per niente... Poi capiremo perchè; Sotto questa riga troviamo un'area grigio chiaro, dove le frasi cominciano con la virgoletta; in questo modo possiamo scrivere quello che vogliamo, (ad esempio commenti sulle righe; annotazioni, ecc.); Rhino salterà questa riga 'sapendo' che sono parole dette solamente per noi... |
per concludere infine facciamo cenno a tutti i segni che utilizziamo per elaborare delle operazioni matematiche: sono appunto gli 'operatori': > < = + - ecc. E anche ovvio l'uso e il significato di questi simboli... No? |
Funzioni
Il concetto di funzione, importantissimo nella programmazione script, non dovrebbe affatto essere nuovo per noi: Ad esempio la scrittura: y = f (x) cosa significa? ((digressione sul concetto di funzione)))))))) |
Terminologia in uso: function subroutine methods ci torneremo meglio, ma quello che ora è importante sapere è in Rhino a cosa servono le funzioni: |
La cosa da dire assolutamente è, che da un punto di vista generale, una funzione serve ad incorporare qualcosa, e questo 'incorporamento' prevede un valore in entrata ed uno in uscita. Questo da un punto di vista generale, perchè abbiamo anche casi di funzioni dove non c'è alcun valore in ingresso e in uscita.... Sono naturalmente funzioni: cos(x) log (x) o anche 2sin(x)+logz o più tipiche di Rhino: Rhino.AddPoint(...................) Rhino.AddLayer(..................) |
A che servono le parentesi? Ospitano quello che si chiama l'argomento o gli argomenti della funzione! |
Una funzione cioè ha degli argomenti (in genere più di uno, alcuni dei quali vanno dichiarati obbligatoriamente, altri sono opzionali) Se non dichiariamo valori, dobbiamo usare la parola call |
Commentiamo questo piccolo script: 1) Abbiamo una semplice funzione RenameObject; 2) Poi c'è la parola Sub, che sta per Subroutine, che viene ' inaugurata' alla linea 7; è naturalmente la subroutine relativa alla funzione RenameObject; 3)Notiamo che subito dopo attraverso la parola Dim (che ormai conosciamo bene) stiamo dichiarando una variabile la quale dal nome, che le abbiamo dato, dovrebbe immagazzinare l'ID dell'oggetto in Rhino; ma ora non sappiamo se sarà una stringa, un numero o qualcos'altro... 4) Subito dopo diciamo che questa variabile è uguale ad un 'metodo',ovvero il Rhino.GetObject (che generalmente serve a prendere-selezionandolo un oggetto nell'ambiente); come lo prendo questo oggetto? A ciò servono gli argomenti fra parentesi: il primo è una stringa (ricordate l'uso delle virgolette?); gli altri non sono dichiarati, tranne l'ultimo che è un booleiano (in questo caso True = vero); ricordate che abbiamo detto che spesso gli argomenti non sono tutti obbligatori? 5)Ora, se notate per evitare che la funzione provochi qualcosa di strano, ci tuteliamo con la variabile Nulla, la cui utilità,è stata già considerata a lezione; difatto dico che se è nulla, usciamo dalla Subroutine, per piacere, senza fare storie (diciamo proprio così); 6)Mentre se l'operazione va a buon fine, e Rhino si ritrova con un oggetto selezionato, abbiamo bisogno di una variabile che immagazzini il nuovo nome, che ci dica come lo vogliamo, com'è fatto; a questo provvede la linea nella quale dichiaro una nuova variabile; ho cambiato il nome in Italiano apposta per farvi capire che Str sta per stringa e che il nome lo decidiamo noi; 7)Una volta dichiarata dico che c'è dentro: troviamo una stringa (quindi Rhino da qualche parte ci stamperà la dizione Date Tag, e qualche altra cosa. Avete visto il carattere '&'? Chi si ricorda a cosa serve? L'altra cosa che ci stampa è: CStr(Now()); attenzione partiamo da quello che c'è in parentesi: Now mi prende la data e l'ora del sistema, dopodichè per farmelo concatenare alla stringa 'Date Tag' ho bisogno di convertirlo in stringa ed a questo compito ci pensa proprio la funzione CStr! (Perchè lo devo convertire in stringa?) - E' chiaro che la data e l'ora presa da un sistema, costituisce un genere di dati diverso dalla semplice stringa! 8) A questo punto diciamo a Rhino di chiamare la funzione Rhino.ObjectName per finire il nostro compito. Notiamo che gli argomenti della funzione saranno le due varibili che abbiamo completamente determinato, ovvero StrobjectID e StrNuovoNome; a questo punto possiamo dirgli di finire tutto; |
Alcune considerazioni sulle funzioni; |
Abbiamo visto come le funzioni, assumano una loro vitalità ed un loro senso attraverso l'uso degli argomenti; abbiamo anche visto come essi siano per lo più delle quantità variabili e la loro definizione precisa, ci aiuta a far lavorare bene la funzione; dobbiamo però fare ora alcune considerazioni su come i valori agiscano nel corpo della funzione e su come i valori ad essi connessi siano utilizzati dalla funzione stessa; |
Esistono infatti modi diversi per dichiarare gli argomenti in una funzione; questo può avvenire attraverso: by value o by reference |
cerchiamo di capire cosa succede; |
by value: |
cosa è accaduto? |
Quando chiamo la funzione AnotherBogusFunction, siccome intA e intB (che ovviamente sono 2 numeri interi) sono 'passati' by value, la funzione non sa nulla di loro; non sa da dove vengono e quando li incrementa li prende col loro valore originale, ovvero: 4 e 7, che sono incrementati rispettivamente di 1 e 2, ottenendo 4+1=5 e 7+2=9, da cui 5*9=45!!! |
by reference: |
Qui, invece cosa è successo? |
Quando invece 'passo' gli argomenti by reference, diciamo che andando a cambiare il loro valore, cambiamo anche quello originale, ovvero intA e intB, per questo quando Rhino li stampa otteniamo A = 5 e B= 9, mentre nel caso precendente il valore originale era rimasto intatto. |
L'importanza di questi 2 metodi diversi risiede non solo nel fatto di aver capito come avviene il processo, ma anche nell'uso diverso di memoria che le due modalità fanno. Ci ritorneremo, per ora lasciamo la cosa in sospeso. |
Lezione 3)
In questa lezione entriamo nel vivo di alcune procedure che caratterizzano in generale lo script, e che per certi versi ne giustificano alcune modalità di utilizzo; Si tratta delle >>>>>>>>>>>>>procedure iterative; e dei >>>>>>>>>>>>>>>>> cicli condizionali, ovvero come far eseguire a Rhino certi compiti noiosi, e che prevedano il verificarsi ci certe condizioni; |
vediamo subito alcuni esempi proposti dalla guida: 1) Se l'oggetto è una curva, cancellalo; 2)Se l'oggetto è una curva breve, cancellalo; 3)Se l'oggetto è una curva breve, cancellalo, altrimenti spostalo sul layer 'curve'; |
come potrei, dire tutte queste cose a Rhino, e fargliele fare? |
situazione 1) |
situazione 2) |
situazione 3) |
|
Facciamo delle osservazioni: Troverete non solo su RhinoScript, ma anche su altri linguaggi che l'If Then Statement, è quello più comune; la sua struttura logica come si vede dagli esempi sopra, è del tipo: If (se) qualcosa o qualcos'altro è in un certo modo Then (allora) fai qualcosa else (altrimenti) qualcos'altro End If (Poi smettila;-)) |
ora è importante notare che quello situato fra l'If e il Then, Statement, è ciò che viene immediatamente valutato in termini di True o False; |
Se questa condizione è verificata viene quindi eseguito il blocco in verde, quello alla prima riga, altrimenti alla seconda; |
Se anche questo non può accadere, (in altri termini è False), allora si esce dal blocco; |
Ora potrei fare questa struttura profonda quanto vorrei; osserviamo il seguente script: |
E si capisce subito che potrebbe dar luogo a confusione; per completezza però va aggiunto che posso anche usare l'ElseIf statement, e tutto sommato abbrevio le cose... |
Tuttavia possiamo utilizzare anche un modo più diretto e valutatico, come il prossimo che vedremo; |
Come abbiamo visto nel modulo precedente, si tratta di usare logicamente delle strutture linguistiche chiave; tuttavia quando abbiamo condizioni molteplici e diverse nel nostro lavoro formale, usare quella struttura diventa un po' complicato... Possiamo far ricorso ad un'altra 'struttura linguistica': Select case che chiamerei in gergo e solo per capirci, 'puta caso';-) |
Lo uso appunto, per semplificare situazioni come quella precedente, anche se vedremo che se è vero che da un lato semplifica, dall'altro funziona essenzialmente da operatore di uguaglianza (=)
|
Select case variabile_tale case 0 fai qualcosa |
ovvero prendo la variabile_tale, (come a dire metti il caso che la variabile_tale sia...) e vedo se è uguale (metti il caso che sia uguale a ...) ad un certo valore appunto; essenzialmente si tratta di un numero o una stringa; |
Se questo è vero, Rhino deve fare qualcosa, (ad esempio chiamare una funzione, o qualcos'altro, non so...); Qui sotto la sintassi: |
Facciamo però subito un esempio, quindi scriviamo: |
Se creo alcuni oggetti diversi, ed eseguo lo script, volta per volta, scopro che Rhino mi ha assegnato l'oggetto selezionato su uno specifico layer, e che addirittura lo ha creato quando questo layer, non esisteva precedentemente... |
Ma come funziona lo script? |
Innanzitutto ci chiede attraverso il Rhino.getObject, di selezionare un oggetto sulla scena, e se questo non accade, come abbiamo visto l'altra volta ci tuteliamo attraverso la variabile isNull. Dell'oggetto selezionato viene archiviata una variabile che già conosciamo bene; ovvero la StrObjectID, che se vi ricordate è una stringa; |
Dopo dichiaro (DIM) un'altra variabile che mi serve a prendere un numero intero dalla stringa StrObjectID. Vi dico già che attraverso questo numero intero, sono in grado di esaminare i casi che mi servono... |
Infatti la funzione Rhino.ObjectType, cosa fa? Guardiamo la guida di RhinoScript, che è utilissima ogni volta che incontriamo una nuova funzione, possiamo dire forzando, un nuovo vocabolo del linguaggio, che dobbiamo imparare: |
Ecco perchè per ogni case, ho quei numeri, e il metodo select case non fa altro che verificare se i numeri dell'oggetto corrispondono ad uno di essi;
|
......................................................................................................................questo infatti viene detto alla riga 14, con IntObjectType;
|
...................................................................................Per questo vi dicevo che funziona un po' come un operatore di eguaglianza;
|
Una volta verificato lui fa qualcosa; in questo caso trasferisce gli oggetti sul layer di pertinenza in relazione ai dati ottenuti;
|
...................................................................................................Notiamo infine le istruzioni che creano il layer qualora non ci fosse;
|
Stiamo entrando sempre di più nel vivo dello script. |
Abbiamo sempre detto che lo script ci può essere utile ad eseguire una serie di compiti anche noiosi. Ad esempio: |
1) Ridimensiona lo spessore di tutti gli oggetti curvi, fino a quando è uguale ad una certo valore; |
2) Aggiungi lungo una direzione, su una certa superficie. quindici oggetti distribuendoli con una certa distanza fra i loro estremi; |
Queste azioni che si capisce per noi architetti possono essere cruciali richiedono entrambe di eseguire dei compiti ripetutamente! |
............................................................Ovvero dobbiamo fare un Loop! |
Nel caso 1) fino a quando non si sia raggiunta una certa condizione |
per questo motivo diciamo che il caso 1) è un loop condizionale |
Nel caso 2) fino a quando non abbiamo eseguito un certo compito un numero prestabilito di volte |
per questo motivo diciamo che il caso 2) è un loop incrementale |
Come possiamo usarli? |
Diciamo subito che un loop può girare un numero infinito di volte; al che possiamo inserire una valutazione condizionale per fermarlo; |
Ora però, passiamo immediatamente ad un tipo molto preciso di loop; dati i limiti dei nostri moduli; |
For -------------------------------------------------------------------------Next | ||||
ovvero------------------------------------------------------------------->>>>>>>>>>>>>>>>>>>> Loop incrementali | ||||
Scriviamo il seguente script |
||||
Vediamo di capire cosa succede riga per riga: | ||||
Chiamo una funzione specifica: DrawSineWave, se non ricordate Call, rivedete la lezione sulle funzioni; | ||||
Dichiaro alcune variabili chiave, che mi serviranno ad immagazzinare i dati necessari per far funzionare il processo; si tratta di 5 variabili (2 alla prima riga Dim, e altre 3 alla seconda); il significato è piuttosto ovvio, tuttavia: |
||||
Dim x, y = assegna dei valori che saranno (il che è ovvio) le coordinate di un sistema cartesiano piano; | ||||
dbLA, dblB, e dbLStep, (possiamo chiamarle come vogliamo essendo variabili, non dimenticatelo); sono i parametri necessari a disegnare una 'stupida' sinusoide, infatti: | ||||
se saltiamo alla riga dove assegno alla y la funzione, troviamo: y = 2*sin (x); proviamo a disegnare questa funzione sulla lavagna; è nient'altro che sin(x) che come sappiamo oscilla fra -1 e 1, raddoppiato (ovvero moltiplicato per 2); | ||||
Tutto questo però, va per così dire inquadrato in un range fra -8.0 e + 8.0; (questa la ragione delle due variabili dblA e dblB)! Questo range sostanzialmente mi dice quanto la curva si estenda in larghezza; | ||||
Infatti cambiando questi valori si ottengono le seguenti situazioni: | ||||
dbl fra -1 e 1 | dbl fra -5 e 5 |
dbl fra -10 e 3 |
dbl fra -20 e 20 |
|
non solo; l'altra variabile si chiama STEP (in Italiano possiamo chiamarla 'passo'); che significa? |
||||
Osserviamo il ciclo che abbiamo scriptato: | ||||
Come si è visto, stiamo letteralmente dicendo a Rhino che per (For) x che varia da -8.0 (dblA) fino a 8.0 (dbLB) FACENDO uno STEP, (un passo) uguale a 0.25 (dnlStep); | ||||
usa la relazione (ovvero la funzione 2*sin (x)) fra le varianili x e y; | ||||
ma, mentre fai questo usa (Call) la funzione Rhino.AddPoint | ||||
passa al prossimo (Next) | ||||
e poi finisci; | ||||
* Osserviamo l'uso della funzione Rhino.AddPoint che ci richiede come argomento una serie di 3 punti (ovviamente le coordinate cartesiane) notiamo che uno di questi 3 punti è sempre cost.te (nullo )--------------------------->>> per questo motivo la curva che otteniamo è piatta (giace interamente su uno dei piano coordinati) | ||||
Per capire ancora meglio questo script, facciamo un lavoro divertente... | ||||
Cosa? Cambiamone i parametri, le funzioni, ecc. |
||||
Una prima cosa che vi propongo è quella di cambiare la funzione Rhino.AddPoint, con Rhino.Addsphere attenzione per un corretto uso della sintassi relativa a questa funzione, necessitiamo dei seguenti argomenti: Rhino.AddSphere (arrCenter, dblRadius) |
||||
ovvero del centro (espresso in coordinate cartesiane) e del raggio... | ||||
Secondo voi, come posso scrivere correttamente questa nuova funzione con i suoi argomenti? | ||||
() | ||||
() | ||||
Facciamo delle osservazioni su cosa è cambiato rispetto a quello precedente; | ||||
1) Visto che uso la variabile z, l'ho dichiarata; | ||||
2) Ho cambiato la funzione Rhino.AddPoint, con Rhino.AddSSphere, ed ho anche aggiunto gli argomenti; di questi x e y, seguono la relazione sinusoidale, z è sempre cost.te, (è sempre 0) mentre anche cost.te ma uguale a 0.8 è il raggio delle sfere; Ecco il risultato: | ||||
Ora voglio però cambiare ancora altri parametri; per esempio DETESTO il fatto che la z sia sempre nulla e che questo blob sinusoidale sia piatto; | ||||
provo a fare così (fate un salva con nome per avere gli script in progress, in modo che possiate studiarli) | ||||
cosa ho fatto? Ho semplicemente stabilito una relazione per la z; come mai l'ho messa nel ciclo For - Next? Perchè ovviamente questo lavoro di computazione, deve farmelo nel ciclo man mano che aggiunge le sfere; le sfere quindi vengono disposte sul piano x,y, in maniera sinusoidale e sull'asse z in maniera cosinusoidale; ecco quello che ottengo: | ||||
Però che brutto, le sfere sono tutte uguali; voglio che cambino variando nel ciclo... Come faccio? | ||||
() | ||||
() | ||||
E' chiaro che devo cambiare l'argomento relativo al raggio!!! Quindi vado nell'Array, e lo cambio, ad esempio dico che è variabile, e che è uguale alla x!!!!! | ||||
Ora, si continua con un altro esempio, per mostrare come una struttura di Loop, basata sui cicli For ----------- Next, sia utile per calcolare (anzi si direbbe computare) una distribuzione spaziale: |
Scriviamo il nostro script, e come al solito lanciamolo; qui il risultato |
........ |
Cominciamo con l'osservare che lo script, ci distribuisce una serie di oggetti (in questo caso delle sfere), lungo una superficie cilindrica; |
è interessante notare però come ' funziona' questo processo; si potrebbe pensare che lo script crei un cilindro e poi distribuisca; in realtà questo non avviene poichè attraverso due cicli for-----------next, la costruzione del cilindro avviene contestualmente a quella della distribuzione delle sfere: |
distribuendo le sfere si costruisce il cilindro. |
Esaminiamo lo script allora: |
Nulla da dire in queste prime righe, se non che dichiariamo ben 4 variabili, a due a due; diciamo poi che una di queste è uguale alla funzione Rhino.Pi () e per l'altra (ovvero dblTwistAngle, - che è chiaro che un numero decimale) fissiamo un valore iniziale uguale a 0; |
Per la funzione Rhino. Pi, ci si chiede subito cosa sia. Anche se è intuitivo che si sta parlando di pigreco, come già detto un buon modo per imparare nuove funzioni e metodi è quello di consultare la guida di Rhino Script, e studiare la funzione. Infatti facendolo, otteniamo questo: |
Com'era ovvio si sta parlando del rapporto della circonferenza con il suo diametro, che è appunto 3.14..... |
Vediamo ora, le altre righe, quelle che più ci interessano in queste osservazioni: |
Questo è il primo ciclo For, nel quale si dice che la variabile z, dovrà essere incrementata da 0 a 5, con un passo di 0.5; questa variabile mi controlla il centro delle sfere; Attenzione perchè all'interno del ciclo succede anche qualcosa per la variabile dblTwistAngle, che viene progressivamente incrementata; |
Vediamo cosa succede nell'altro ciclo For: |
Qui il ciclo si occupa di far variare la a da 0 a 2pigreco; faccio girare la a per un angolo giro, appunto! (Si scusi la ripetizione), e con uno step di pi/15 (come mai usiamo questa scrittura in forma di frazioni per gli step?) |
Detto questo, dichiaro all'interno del ciclo, quindi localmente (la cosa vale in questo blocco) le due variabili x, e y; Faccio muovere queste varibili attraverso una legge che dovremmo conoscere, ovvero un'equazione parametrica di una circonferenza. Quest'equazione è fondamentale poichè mi permette di chiamare (Call) la funzione già vista Rhino.AddSphere, e procedere con la loro collocazione nello stage. |
Una nota: la funzione Rhino. EnableRedraw () che vediamo è vera o falsa, serve ad evitare (quando è imposta come false), che Rhino ridisegni lo schermo ogni volta che aggiunge un oggetto. In sostanza gli diciamo semplicemente di fare il suo task, e poi di riprendere a ridisegnare lo schermo una volta che lo ha portato atermine. |
Infatti guiardiamo cosa succede se smembriamo lo script: |
Cosa abbiamo fatto? E, quale sarà il risultato? |
Facciamo ancora un altro 'smembramento', ricordandoci però di far assumere alla variabile z, un valore costante, altrimenti non possiamo usare la funzione Rhino.AddSphere: |
Abbiamo questa volta ottenuto un anello di sfere. Lascio a voi osservare e commentare cosa è successo. |