Guida a Ruby per Sketchup: variabili e array

Nel terzo appuntamento della guida a Ruby per Sketchup, dopo aver visto numeri e stringhe, parliamo di variabili, costanti e array. Si tratta di concetti e definizioni basilari nello studio dei linguaggi di programmazione. Importanti anche per imparare le basi dello scripting in Sketchup.

Ricordo, per correttezza che i testi sini tratti dal libro di Mattew Scarpino – Automatic SketchUp – Creating 3-D Models in Ruby. Può darsi che mi sia scappato qualche errore dunque, se noti qualche incongruenza, o punto poco chiaro, ti sarei grato se me lo fai sapere scrivendolo nei commenti.

Visto che siamo al terzo post dedicato alla guida a Ruby per Sketchup, oltre a quello introduttivo, direi che è opportuno riportare il link ai post già visti. In questo modo, se capiti qui dalla ricerca web, potrai trovare i post passati.

Inoltre, per approfondire è utile ricordare la guida a Ruby sul sito html.it

Variabili e costanti

Nella guida a Ruby per Sketchup, finora abbiamo trattato numeri e stringhe nudi e crudi, ma nel in genere assegniamo nomi ai dati e operiamo sui nomi anziché sui dati grezzi. In Ruby, i dati nominati si dividono in due categorie: variabili e costanti. Questa lezione spiega come vengono utilizzati e le differenze tra loro.

Variabili

Negli script di SketchUp è più conveniente lavorare con nomi anziché numeri. Ad esempio, se si desidera modificare l’altezza di una porta da 210 a 220 cm, non si vuole certo modificare ciascuna occorrenza.

E’ più facile usare un nome topo door_height. Così puoi modificare facilmente tutti i valori di altezza: basta impostare door_height a 220 in una riga e questo valore sarà valido per tutte le occorrenze utilizzate.

Nella Console, assegna 2 alla variabile x con il seguente semplice comando:

x = 2

SketchUp riserva una parte della memoria per la variabile x; nella memoria allocata, ci mette dentro il 2. Ora puoi operare su questa variabile come se fosse un numero normale. Per esempio

  • x + 5 restituisce 7
  • x * 2 restituisce 4
  • x ** 3 restituisce 8

In queste operazioni, x mantiene il suo valore dopo ogni comando. Per modificare il valore di una variabile, si devono eseguire le operazioni come le seguenti:

  • x = x + 1
  • x = x – 3
  • x = x * 7
  • x = x / 9

Puoi ottenere gli stessi risultati con le abbreviazioni di Ruby:

  • x + = 1
  • x – = 3
  • x * = 7
  • x / = 9

Le operazioni viste sono basate su numeri interi, ma se vuoi, è possibile impostare x uguale a un valore a virgola mobile o a una stringa. Ad esempio, i seguenti comandi creano una variabile contenente “Hello” e utilizzano l’operatore di aggiunta String, +, per aggiungere un’altra Stringa:

str = "Ciao"

Ciao

str + = ", mondo!"

Ciao, mondo!

I nomi delle variabili x e door_height condividono una caratteristica importante: entrambi iniziano con una lettera minuscola.

In Ruby, una variabile può iniziare con il carattere di sottolineatura o qualsiasi lettera minuscola, ma non con una lettera maiuscola. Se i dati sono assegnati a un nome con una lettera maiuscola, Ruby lo interpreta come una costante, che verrà spiegata in seguito.

Costanti

Ci sono casi in cui i valori non devono essere modificati. Ad esempio, p (pi-greco) sarà sempre uguale a circa 3,14159 e ci saranno sempre 2,54 centimetri in un pollice. In questi casi, l’utilizzo di una variabile non è una buona idea perché il suo valore potrebbe essere modificato durante l’esecuzione di uno script.

Per questo motivo, Ruby fornisce costanti che funzionano come variabili e possono essere assegnate agli stessi tipi di valori. Ma se il valore di una costante viene riassegnato, Ruby ti avverte che il valore è stato modificato.

Per verificare come funziona, prova ad inserire i due comandi nella finestra della console:

X = 8
X + = 2

Dopo l’esecuzione di queste due righe, Sketchup mostra il messaggio risultante nella console di Ruby: “X già inizializzata”.

La console di Ruby per mostrare l'avvertimento nel tentativo di modificare una variabile
La console di Ruby per mostrare l’avvertimento nel tentativo di modificare una variabile

Nonostante l’avvertimento, il secondo comando modifica il valore di X da 8 a 10.

Se si ripetono questi comandi con x (minuscola) anziché X, non verrà visualizzato alcun avviso. Questo perché Ruby utilizza la prima lettera della struttura dei dati per distinguere le costanti dalle variabili. Se la prima lettera è maiuscola, Ruby la considera come una costante. Se è in minuscolo, Ruby lo considera una variabile.

Gli Array

Ogni punto, linea e forma in un disegno di SketchUp ha come base tre valori per le coordinate x, y e z. Piuttosto che gestire le coordinate come singoli numeri, è più facile inserirle in raccolte chiamate array.

Un array è una struttura di dati che contiene una sequenza ordinata di valori chiamati elementi. Gli array sono simili alle stringhe che abbiamo visto in precedenza, ma mentre una stringa è composta da caratteri, un array può contenere qualsiasi cosa, inclusi numeri, stringhe, variabili, costanti e persino altri array.

Proprio come le stringhe sono racchiuse tra virgolette singole o doppie, gli array sono racchiusi tra parentesi quadre. Per esempio, il comando seguente crea un array di sette elementi:

arr = [1, 2, "ab", 4.0, 'Hello', 6.0, [1, 2, 3]]

Viene creato un array chiamato arr i cui elementi sono 1, 2, “ab”, 4.0, ‘Hello’ e [1, 2, 3].

Accesso agli elementi dell’array

Si accede a ciascun elemento dell’array in base alla sua posizione: si parte dalla posizione 0. La posizione di un elemento viene definita indice. Il comando seguente accede all’elemento arr il cui indice è uguale a 2:

x = arr [2]

Il seguente comando invece, imposta il valore del quarto elemento, il cui indice è uguale a 3:

arr [3] = 12

Gli indici degli elementi dell’array seguono le stesse regole viste per le stringhe. L’indice 0 rappresenta il primo elemento, l’indice 1 rappresenta il secondo elemento e l’indice 2 rappresenta il terzo elemento.

Gli indici negativi accedono agli elementi dalla fine dell’array. Ossia, un indice di -1 restituisce l’ultimo elemento dell’array, -2 restituisce l’ultimo penultimo elemento dell’array e così via.

Come per le stringhe, è possibile accedere a più elementi dell’array definendo un intervallo (range) di indici. Questo può essere fatto posizionando due o tre punti tra i valori iniziale e finale.

Gli esempi mostrano l’accesso agli elementi nell’array arr definito prima:

arr [2..5]

restituisce “ab”, 4.0, “Hello”, 6.0]

arr [0 … 3]

restituisce [1, 2, “ab”]

arr [-6 ..- 4]

restituisce [2, “ab”, 4.0]

In alternativa, è possibile impostare un indice iniziale e identificare quanti ulteriori elementi dovrebbero essere presenti nel sub-array. Il comando seguente forma un sub-array con quattro elementi che iniziano con l’elemento nell’indice 2:

x = arr [2, 4]

restituisce [“ab”, 4.0, “Hello”, 6.0]

Questo comando imposta x uguale a un array contenente elementi “ab”, 4.0, “Hello” e 6.0. Notare la differenza tra scrivere [2..4] e [2, 4]. Tienilo bene a mente se riscontri errori relativi all’intervallo.

Operazioni di base sugli array

Ruby offre diversi modi per manipolare gli array e molte di esse sono esattamente simili alle operazioni sulle stringhe discusse in precedenza. La tabella 1 elenca sei operatori con le descrizioni e gli esempi del loro utilizzo.

OperatoreDescrizioneEsempio
+Compone i due array in uno più grande[6, 7] + [“aa”, “bb”, “cc”] -> [6, 7, “aa”, “bb”, “cc”]
Remove the elements of the second array from the first[1, 2, 3, 4] – [1, 2] -> [3, 4]
*Duplica gli elementi di un array[a, b] * 3 -> [a, b, a, b, a, b]
<< “Appende” un elemento in coda all’array[x, y, 12] << 13 -> [x, y, 12, 13]
|Unisce due array senza duplicare[1, 2, 3] | [2, 3, 4] -> [1, 2, 3, 4]
&“Interseca” gli array: lascia solo gli elementi duplicati[1, 2, 3] & [2, 3, 4] -> [2, 3]
Tabella 1

Nella terza colonna, gli elementi dell’array includono nomi testuali contenuti tra virgolette (“aa” e “bb”) e lettere contenute senza virgolette (x e y). Come discusso in precedenza, i nomi senza virgolette vengono utilizzati per identificare variabili e costanti e devono essere inizializzati prima di essere inseriti in un array.

Il terzo operatore, *, è particolarmente utile quando si desidera inizializzare ogni elemento di un array con lo stesso valore. Ad esempio, il comando seguente riempie zero_array con dodici zeri:

zero_array = [0] * 12

L’operatore << aggiunge un elemento alla fine di un array. Se il secondo argomento è un altro array, quell’array diventerà un singolo elemento del primo array. Ad esempio, il comando

[1, 2, 3] << [4, 5, 6]

ritorna [1, 2, 3, [4, 5, 6]], non [1, 2, 3, 4, 5, 6]. Il secondo array viene “annidato” al quarto posto del primo array.

Se si desidera aggiungere gli elementi del secondo array, si deve utilizzare il metodo concat descritto di seguito.

Gli ultimi due operatori possono essere fonte di confusione, quindi attenzione.

L’operatore | concatena gli array di input e rimuove i duplicati dalla concatenazione. Cioè, se entrambi gli array di input contengono x e y, il risultato conterrà solo un’istanza di x e y.

L’operatore & invece, crea un array composto solo da elementi duplicati. Se x e y sono gli unici duplicati negli array di input, il risultato dell’operatore & conterrà solo x e y.

Metodi degli array

Gli array di Ruby hanno metodi che possono essere chiamati come i metodi String discussi in precedenza. La tabella 2 elenca dodici metodi importanti e ulteriori metodi saranno introdotti non appena necessari.

MetodoDescrizioneEsempio
newCreate a new arraynum_list = Array.new(30)
lengthReturn the number of elements in the array[1, 2, 3, 4].length -> 4
indexReturn the index of the given element value[1, 2, 3].index(1) -> 0
concatConcatenate two arrays[1, 2, 3].concat([4, 5]) -> [1, 2, 3, 4, 5]
delete_atRemove an element from the array by indexa = [1, 2, 3]
a.delete_at(1)
a -> [1, 3]
deleteRemove an element from the array by element valuea = [1, 2, 3]
a.delete(1)
a -> [2, 3]
clearRemove all elements from the array[“a”, “b”, “c”].clear -> []
uniqRemove duplicate elements from array[1, 1, 2, 2, 3].uniq -> [1, 2, 3]
fillReplace elements of the array with a value[1, 2, 3].fill(7) -> (7, 7, 7)
sortSort the array’s elements[“ab”, “yz”, “wx”, “ac”].sort -> [“ab”, “ac”, “wx”, “yz”]
firstReturn the first element of the array[1, 2, 3].first -> 1
lastReturn the last element of the array[1, 2, 3].last -> 3
Tabella 2

Il metodo new crea nuovi array. Può essere utilizzato in tre modi diversi, come mostrato nei seguenti esempi:

  1. num_list = Array.new 20 – crea un array con una determinata dimensione senza inizializzare i suoi elementi;
  2. num_list = Array.new 4, “xyz” – crea un nuovo array con quattro elementi, ciascuno impostato su “xyz”;
  3. num_list = Array.new old_list – crea un nuovo array con gli stessi elementi di quelli nell’array old_list;

Il metodo length identifica quanti elementi sono presenti nell’array. L’indice restituisce la posizione associata a un determinato valore di elemento. Questo è il contrario del normale utilizzo dell’array, che restituisce il valore dell’elemento associato a un indice.

Il metodo concat è simile all’operatore + nella tabella 1 e aggiunge elementi di un array alla fine del secondo array. La differenza è che + crea un terzo array per memorizzare il risultato concatenato e concat modifica il secondo array.

I seguenti comandi mostrano come viene utilizzato:

first_array = [5, 4, 3, 2, 1]
second_array = [8, 7, 6].concat (first_array)

la seconda riga di codice aggiunge gli elementi di first_array alla fine di second_array, che ora è uguale a [8, 7, 6, 5, 4, 3, 2, 1].

I metodi delete_at e delete rimuovono entrambi gli elementi dell’array, ma funzionano in modi diversi. Il metodo delete_at rimuove un elemento dall’array in un indice specifico, mentre il metodo delete rimuove tutti gli elementi con un valore specifico.

Gli esempi mostrano come vengono utilizzati questi due metodi:

test = [10, “x”, 9, “x”, 8, “y”, “x”]

test.delete_at 4

si ottiene test = [10, “x”, 9, “x”, “y”, “x”]

test.delete “x”

si ottiene test = [10, 9, “y”]

Il metodo delete_at rimuove il quinto elemento dell’array, il cui valore è 8. Il metodo delete rimuove gli elementi il cui valore è uguale a “x”.

Il metodo uniq rimuove gli elementi duplicati da un array e il metodo clear rimuove tutti gli elementi da un array, restituendo un array vuoto. Il metodo fill imposta elementi di un array uguale a un dato valore.

Questo metodo può essere utilizzato in quattro modi principali, come mostrato dai seguenti comandi:

fill_test = [1, 2, 3, 4, 5, 6]

fill_test.fill 9 imposta tutti gli elementi uguali a 9

fill_test.fill 10, 0..2 imposta il primo al terzo elemento uguale a 10

fill_test.fill 21, 4, 2 imposta due elementi uguali a 21, a partire dall’elemento 4

Il metodo sort posiziona gli elementi dell’array in ordine numerico o alfabetico, ma solo se tutti gli elementi sono numerici o tutti alfabetici.

Il metodo first restituisce il primo elemento dell’array mentre last restituisce l’ultimo. Questi metodi possono essere replicati accedendo rispettivamente agli indici di array 0 e -1.

Per approfondire: la classe Array sul sito ruby.sketchup.com

Guida a Ruby per Sketchup, tutto chiaro?

Lo so che vorresti subito passare a modellare tramite scripting ma il percorso è lungo e tortuoso. Niente che tu non possa fare, ma come si dice… per andare da Roma a Milano, si deve passare sa Firenze.

0 0 vote
Article Rating
Massimiliano Pratelli

Massimiliano Pratelli

Ciao! Sono Massimiliano Pratelli e sono un ingegnere civile specializzato in strutture, da sempre libero professionista. Mi piace scrivere e condividere conoscenza su software e metodologie di lavoro.

Read Previous

Sketchup scripting: Ruby e le stringhe

Read Next

In arrivo DECASteel per Sketchup

Subscribe
Notificami
guest
6 Commenti
più vecchi
più nuovi più votati
Inline Feedbacks
View all comments
Michele
5 mesi fa

Ciao Massimiliano, complimenti per l’iniziativa di affrontare Ruby per Sketchup. E’ da tempo che mi sono promesso di imparare a creare scripts per il modellatore che mi ha cambiato la vita. Sarà venuto il momento? Complimenti ancora, hai un nuovo follower che aspetta i toui prossimi posts !

Michele
5 mesi fa

Grazie Massimiliano per il messaggio di benvenuto. Sono un architetto un pò anomalo ed ho una formazione tecnologica-strutturale. Scrivo codice in HTML, Javascript, Php e MySQL per applicazioni web-based e mi sono da sempre occupato di interventi di rinforzo locale, miglioramento e adeguamento su edifici storici e/o preesistenti occupandomi congiuntamente degli aspetti architettonici e tecnici. Progetto strutture prevalentemente in acciaio con un modellatore general (Axis VM) e con Sketchup, un pò come fai tu (ma non in maniera dinamica), disegno le strutture in acciaio ed i relativi nodi che mi permettono con giusto dispendio di risorse di comunicare in maniera… Leggi il resto »

Michele
5 mesi fa

Hai ragione, di questi tempi non si può che essere flessibili e resilienti per poter sopravvivere. Io avevo iniziato a scrivere applicazioni desktop in ambiente Microsoft .Net con VB.Net, poi, dopo alcuni problemi di compatibilità dei nuovi framework ho deciso di passare alle applicazioni su web con linguaggi di programmazione open source. Per imparare Php, Javascript e MySQL ti consiglio lo splendido sito https://www.w3schools.com/ ed in ogni caso se hai problemi chiedi pure, sarò felice di aiutarti. Io non uso CMS come Joomla, WordPress ecc. ma scrivo tutto a mano con Notepad++ (vecchia scuola ;o)). Anch’io utilizzo 3Muri per gli… Leggi il resto »

6
0
Would love your thoughts, please comment.x
()
x