Ruby: le tre strutture base di Sketchup
Iniziamo la lettura del terzo capitolo del libro di Mattew Scarpino a cui facciamo riferimento. Il testo è scaricabile dalla rete in formato PDF. Con la prossima serie di appunti inizieremo a scrivere un po’ di codice, ma prima dobbiamo capire cosa sono tre strutture importanti: il modulo Sketchup, la classe Model e la classe Entities.
Table of Contents
Mi preme ricordarti che il linguaggio Rugby a cui fa riferimento il libro che stiamo leggendo è un po' vecchiotto. Non importa perché a noi interessano le basi e i principi, ma è giusto che tu lo sappia.
Questo il riepilogo degli appunti precedenti:
- Ruby per Sketchup: Numeri e operatori numerici
- Sketchup scripting: le stringhe
- Guida a Ruby per Sketchup: variabili e array
- Oggetti, classi e metodi in Ruby
Il terzo capitolo
In questa serie di appunti, metteremo da parte la teoria della programmazione e arriveremo alle cose divertenti: creare forme di SketchUp via codice. Si inizia con le linee e si procede verso le superfici.
Nei prossimi post, inizierai a formare le tue figure tridimensionali usando gli stessi meccanismi “Push/Pull” e “Follow Me” disponibili in SketchUp.
Lungo la strada, questo capitolo spiegherà come creare file di script Ruby ed eseguirli in SketchUp. Finora, hai inserito comandi nella Console Ruby e hai studiato i risultati. Ma con gli script, puoi memorizzare i tuoi comandi in file invece di doverli reinserire ogni volta. Inoltre, come risulterà evidente nei prossimi post, puoi realizzare molto di più con gli script che con i singoli comandi.
Questo capitolo riguarda principalmente gli oggetti Edge e Face di SketchUp: una volta capito come funzionano, puoi costruire praticamente qualsiasi cosa. Ma prima di poter inserire questi oggetti in un progetto, è necessario acquisire familiarità con tre strutture di dati basilari: lo Sketchup module, la classe Model e la classe Entities.
Tre strutture dati base per lo scripting
Quasi tutti gli script di SketchUp iniziano con l’accesso a tre strutture di dati:
- Sketchup model
- Classe Model
- Classe Entities.
Una volta capito come queste funzionano e lavorano insieme, sarai pronto per costruire i tuoi script in SketchUp.
Lo Sketchup Module
A differenza delle classi e degli oggetti descritti nel capitolo precedente, la prima struttura di dati che incontriamo in Sketchup è un modulo. Più avanti vedremo cosa sono i moduli in modo dettagliato. Per ora tutto ciò che devi sapere è che un modulo è una raccolta di metodi.
La maggior parte degli script Ruby inizia chiamando uno dei metodi in questo modulo.
I metodi nello “Sketchup module” accedono alle proprietà relative all’applicazione SketchUp nel suo insieme.
Per vedere come funziona, apri la Ruby Console (Finestra > Ruby Console nel menu principale di SketchUp) ed esegui il seguente comando:
Sketchup.version
Questo comando mostra la versione dell’applicazione SketchUp in uso. Puoi anche inserire Sketchup.os_language per determinare la lingua corrente. Per vedere tutti i metodi forniti dal modulo Sketchup, inserisci Sketchup.methods nella Ruby Console.
Il metodo più importante nel modulo Sketchup è active_model. Esso restituisce l’oggetto Modello corrispondente al disegno di SketchUp attualmente aperto.
Il seguente comando mostra come funziona questo metodo:
mod = Sketchup.active_model
Questo recupera l’oggetto Model corrente e quindi imposta mod uguale all’oggetto Model. L’oggetto Model è cruciale in tutte le routine non banali di SketchUp e il paragrafo che segue spiega perché.
L’oggetto “Model”
Proprio come il modulo Sketchup rappresenta l’intera applicazione SketchUp, l’oggetto Model rappresenta un singolo file SketchUp (*.skp) o più precisamente, le informazioni di progettazione contenute nel file.
Quando apri un nuovo file in SketchUp, le proprietà del modulo Sketchup rimangono invariate, ma i dati nell’oggetto Model attivo diventano completamente diversi.
I metodi nella classe Model forniscono informazioni sul progetto corrente. Ad esempio, il metodo
modified?
identifica se il progetto corrente è stato modificato dall’ultima volta in cui è stato salvato.
I seguenti comandi mostrano come viene utilizzato:
mod = Sketchup.active_model
mod.modified?
Il metodo title restituisce il titolo del disegno corrente e il metodo description restituisce la sua descrizione testuale. Il metodo path restituisce il percorso al file utilizzato.
I metodi della classe Model che useremo di più sono quelli che accedono agli oggetti contenitore nel progetto corrente. Puoi pensare per esempio, ad un oggetto come una cassettiera: è un singolo oggetto contenente più scomparti e ogni compartimento può contenere più oggetti.
La tabella 1 mostra sei dei più importanti "cassetti" di oggetti contenuti nel modello a oggetti.
Modificando gli oggetti in questi sei contenitori, puoi configurare quasi tutti gli aspetti di un disegno SketchUp. Per accedervi, è necessario chiamare i metodi appropriati. Ovvero:
- entities: restituisce un oggetto entities che contiene le forme nel disegno corrente;
- levels: restituisce un oggetto levels che contiene i livelli di SketchUp nel progetto corrente;
- Definitions: restituisce un oggetto ComponentDefinitions che contiene tutte le definizioni dei componenti nel progetto corrente;
- Materials: restituisce un oggetto materials che gestisce i materiali utilizzati nella progettazione corrente ;
- Options: restituisce un OptionManager che fornisce l’accesso a più OptionsProviders;
- Pages: restituisce un oggetto pages che contiene le pagine del disegno corrente;
La maggior parte di questi metodi ha nomi plurali: entities, levels, definitions materials. Restituiscono oggetti le cui classi hanno nomi simili: Entities, Lilevels, definitions e materials. Ogni oggetto plurale funziona essenzialmente come un array.
Come si può immaginare, un elemento dell’array Entities è un Entity. Allo stesso modo, l’array Layers contiene diversi elementi Layer, l’array Materials conterrà molti Material e così via. Attenzione a non fare confusione.
Al momento, tutto ciò che vogliamo fare è disegnare le forme di base di SketchUp. Per iniziare, il primo passo è chiamare il metodo entity della classe Model e accedere all’oggetto Entities del disegno corrente.
Il codice seguente mostra come questo è attuabile:
mod = Sketchup.active_model
ents = mod.entities
È possibile ottenere lo stesso risultato concatenando i due metodi insieme. Così:
ents = Sketchup.active_model.entities
L’oggetto Entities
Ogni oggetto geometrico in un disegno di SketchUp è rappresentato da un’entità o da una sua sottoclasse, inclusi linee, facce, immagini, testo, gruppi e componenti. Per gestire o modificare gli oggetti Entity in un disegno, è necessario accedere al contenitore Entities primario del disegno. Questo contenitore serve per fare principalmente tre cose:
- Aggiunge nuovi oggetti Entity al progetto SketchUp corrente
- Sposta, ridimensiona, ruota e cancella gli oggetti Entity nel disegno
- Memorizza gli oggetti Entity in un array a cui è possibile accedere tramite indice.
Il primo punto è il più importante. La classe Entities contiene molti metodi che aggiungono nuovi oggetti Entity al disegno. I metodi di aggiunta più semplici (add_X) sono elencati come segue:
- add_line: crea un oggetto Edge da due punti
- add_edges: forma una matrice di oggetti Edge da una serie di punti
- add_circle: forma una matrice di oggetti Edge che si combinano per formare un cerchio
- add_ngon: forma una matrice di oggetti Edge che si combinano per formare un poligono
- add_face: crea un oggetto Face da bordi o punti
- add_text: aggiunge un’etichetta al disegno in un determinato punto.
Quando si tratta di forme, Edge e Face sono gli oggetti Entity più importanti. Ogni volta che ne aggiungi uno nel contenitore Entità, nella finestra di SketchUp viene visualizzata una forma corrispondente. Quindi, quando si salva il disegno, i bordi e le facce verranno memorizzate nell’oggetto Model. Per comprendere appieno le classi Edge e Face, devi conoscere le loro superclassi, Entity e Drawingelement.
Le classi Entity e Drawingelement
La classe Drawingelement è la superclasse di Edge, Face, Group, Image, Text, di ComponentDefinition e ComponentInstance.
Molti dei metodi in questa classe controllano come viene visualizzato l'elemento in SketchUp e impostano proprietà come ombreggiatura, materiale composizione e se l'elemento è nascosto o visibile. Queste sono le stesse proprietà definite dalla finestra di dialogo Informazioni sull'entità di SketchUp, mostrata nella Figura seguente:
La classe Drawingelement fornisce un metodo utile chiamato bounds che restituisce l’oggetto BoundingBox. Questo rappresenta il volume rettangolare (parallelepipedo rettangolare) più piccolo che può contenere mantenendo i lati allineati con gli assi x, y e z.
Il seguente comando crea un BoundingBox per una linea tracciata da [0, 0, 0] a [2, 2, 5]
new_line = Sketchup.active_model.entities.add_line [0,0,0], [2,2,5]
box = new_line.bounds
Una volta ottenuto BoundingBox, i suoi metodi forniscono informazioni sulle sue dimensioni, diagonale, angoli e punti massimo / minimo. I seguenti comandi visualizzano la posizione del centro di un BoundingBox e la lunghezza della sua diagonale
box.center
Vedrete comparire (2.54 cm, 2.54 cm, 6.35 cm)
box.diagonal
Vedrete comparire 14.6.
Gli oggetti BoundingBox sono utili quando è necessario determinare se l’utente ha fatto clic su una forma. Dopo aver acquisito BoundingBox di una forma, puoi confrontare le sue dimensioni con la posizione del clic del mouse dell’utente.
Approfondimenti
Riporto alcune risorse che potete leggere per approfondire, inclusa questa guida su webmasterpoint.org;
A questo link trovi la documentazione su Sketchup e Ruby.
Nei prossimi appunti cercheremo di capire la classe Edges. inizieremo poi a mettere le basi per capire come scrivere codice Ruby in Sketchup.
Scrivi nei commenti, fammi sapere se stai seguendo questa serie di appunti. Segnala anche se ho commesso qualche errore... non mi offendo, anzi, mi dai una mano a condividere.
Comments