OpenSCAD/Primi passi
Cheatsheet
[modifica | modifica sorgente]Pagina riassuntiva con i comandi disponibili per la modellazione [link].
Aprire un modello di esempio esistente
[modifica | modifica sorgente]Aprire uno degli esempi della installazione OpenSCAD (File > Examples > example004.scad).
Oppure copia e incolla il codice seguente della finestra OpenSCAD.
Creare un modello
[modifica | modifica sorgente]Cube, sphere, cylinder
[modifica | modifica sorgente]Openscad ha tre funzioni per i solidi base: cube(), sphere(), cylinder() e una per solidi generici polyhedron().
In OpenSCAD, inserire le seguenti linee di programma:
// esempio 1
// cube(dimensione, TRUE/FALSE)
// cubo di lato 3
cube(3);
// parallelepipedo di lati 2,3,4
cube([2,3,4]);
// cubo con baricentro nell'origine degli assi
cube(3,true);
// sphere(raggio, risoluzione)
// sfera di raggio=3
sphere(3);
// sfera di raggio=3 e risoluzione maggiore (20 lati per ogni circonferenza)
sphere(3,$fn=20);
// cylinder(altezza, raggio_facciaINF, raggio_facciaSUP, risoluzione, TRUE/FALSE)
// cilindro con base coincidente all'origine degli assi
cylinder(15,6,6);
// prisma retto a base pentagonale
cylinder(15,6,6,$fn=5);
// tronco di cono
cylinder(15,6,2);
// tronco di piramide a base pentagonale
cylinder(15,6,2,$fn=5);
|
Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.
Difference, union, intersection
[modifica | modifica sorgente]// esempio 2
translate([0, 0, 30]){ //traslazione in verticale asse Z
cylinder(h=40, r=10); //cilindro alto 40 di raggio 10
}
difference(){ //differenza di volumi tra un cubo e una sfera
cube(30, center=true);
sphere(20);
}
union(){ //unione di due solidi (somma dei volumi)
cube (10,true);
sphere (7);
}
translate([20,0,0])
intersection(){ //intersezione (volume in comune) tra due solidi
cube (10,true);
sphere (7);
}
/*
utilizzare i seguenti modificatori utili in fase di debug
#sphere(20); MOSTRERÀ I SOLIDI NON VISIBILI
!sphere(20); MOSTRERÀ SOLO QUESTO SOLDIO
*/
|
Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.
Sono possibile tre tipi di azione con il mouse:
- Trascinare con il tasto sinistro per ruotare la vista. Il valore della rotazione in basso cambia.
- Trascinare con il tasto destro per spostare la vista (pan). Il valore della traslazione in basso cambia.
- Usare la rotella di scroll del mouse per lo zoom. Alternativamente si possono usare i tasti + e -, oppure trascinare con il tasto destro premendo il tasto SHIFT. Il valore dello zoom in basso cambia.
Posizionare un oggetto
[modifica | modifica sorgente]Questo esempio mostra come usare il comando translate per posizionare un cuboide a fianco di un cuboide esistente.
Si noti che non occorre un punto e virgola dopo il commando translate. Questo perché il commando si riferisce agli oggetti che seguono, racchiusi nelle parentesi graffe. Il punto e virgola, quindi, avrebbe l'effetto di interrompere il comando di translazione, e il secondo cuboide verrebbe posizionato nella stessa posizione del primo.
Traslazione
[modifica | modifica sorgente]// esempio 3 - posizionare un oggetto
cube([2,3,4]); // l'origine coincide con lo spigolo a meno di indicare
// l'opzione TRUE
translate([3,0,0]) { // in questo caso le parentesi non sono indispensabili
cube([2,3,4]); // poiché translate si riferisce ad un solido solo
}
cube([2,3,4],true); // l'opzione TRUE centra il baricentro
// nell'origine degli assi
/* le parentesi graffe non sono indispensabili se la traslazione riguarda un
unico solido questo comando funzionerebbe ugualmente
translate([3,0,0]) cube([2,3,4]);
*/
|
Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.
Rotazione
[modifica | modifica sorgente]// esempio 4 - ruotare un oggetto
// la rotazione avviene sempre rispetto all'origine assoluta degli assi
rotate([0,0,45]) // l'asse Z fa da perno ed il piano XY
color("red") // ruota intorno ad esso in senso antiorario di 45
cube([2,3,4]);
translate([6,0,0]) { // ATTENZIONE all'ordine dei comandi rotate e translate
rotate ([0,0,45]) // in questo esempio il solido
color("green") // PRIMA RUOTA intorno a Z ed POI TRASLA in direzione X
cube([2,3,4]);
}
rotate([0,0,45]) { // in questo esempio il solido
translate ([6,0,0]) // PRIMA TRASLA ed POI RUOTA intorno a Z
color("blue")
cube([2,3,4]);
}
|
Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.
Cambiare il colore di un oggetto
[modifica | modifica sorgente]Possiamo cambiare il colore di un oggetto mediante i valori RGB (RossoVerdeBlu). Ma, invece dei valori RGB da 0 a 255, vengono inseriti valori da 0.0 a 1.0.
// esempio 5 - cambiare il colore di un oggetto
color([1,0,0]) cube([2,3,4]); //equivalente a color("red");
translate([3,0,0])
color([0,1,0]) cube([2,3,4]); //equivalente a color("green");
translate([6,0,0])
color([0,0,1]) cube([2,3,4]); //equivalente a color("blue");
|
A partire dalla versione del 2011.12 si possono usare anche i nomi dei colori come specificato in Web colors. Ad esempio: color("red") cube();
Considerando un commando completo come una proposizione, allora color()
è un "aggettivo" che descrive l'"oggetto" della proposizione (cioè il "nome"). In questo caso, l'oggetto è il cuboide cube()
da creare. L'aggettivo deve essere prima del nome nella proposizione, come nel caso: color() cube();
. Allo stesso modo, translate()
può essere considerato un "verbo" che agisce sull'oggetto, ed è posizionato così: translate() color() cube();
. Il codice che segue produce lo stesso risultato:
// esempio 6 - cambiare il colore di un oggetto
translate([6,0,0])
{
color([0,0,1]) // SENZA punto e virgola perché non è un comando ma attributo del cubo
cube([2,3,4]); // punto e virgola alla fine dei comandi
}
translate([6,0,0]) // le parentesi graffe non servono se riguarda un solo solido
color([0,0,1]) cube([2,3,4]);
La modifica dei colori è attiva solo in Preview (F5). La modalità Render (F6) non la supporta ancora.
Moduli
[modifica | modifica sorgente]I moduli possono essere utilizzati per costruire procedure complesse da aggiungere alle istruzioni proprie del linguaggio. I moduli accettano anche parametri in ingresso. Non restituiscono valori in uscita, per questo serve utilizzare function().
Una volta definiti i moduli vengono temporaneamente aggiunti al linguaggio di OpenSCAD.
module name ( parameters ) { actions }
// esempio 7 - modulo per la creazione di cilindri ruotati
module rotcy(rot, r, h) {
rotate(rot)
cylinder(r = r, h = h, center = true);
}
rotcy([0,45,0],10,30);
Iterazione: ciclo for()
[modifica | modifica sorgente]Utilizza ogni valore dell'intervallo assegnato o del gruppo di valori (vettore) applicandolo all'azione che segue.
for(variable = [start : increment : end]) for(variable = [start : end]) for(variable = [vector])
Esempi
for (a =[3:5])echo(a); // 3 4 5 for (a =[3:0.5:5])echo(a); // 3 3.5 4 4.5 5 for (a =[0:2:5])echo(a); // 0 2 4 for (a =[3:-2:-1])echo(a); // 3 1 -1 for (a =[3,4,1,5])echo(a); // 3 4 1 5 il vettore si distingue per la presenza di la , (virgola) anziché : (due punti) for (a =[0.3,PI,1,99]){echo(a);} // 0.3 3.14159 1 99
x1=2; x2=8; x3=5.5; for (a =[x1,x2,x3]){ echo(a); } // 2 8 5.5
for (a =[[1,2],6,"s",[[3,4],[5,6]]])echo(a); // [1,2] 6 "s" [[3,4],[5,6]]
for (i=[0:3]) translate([i*10,0,0]) cube(i+1);
iterazione di rotazioni mediante vettore di valori for(i = [ [ 0, 0, 0], [ 10, 20, 300], [200, 40, 57], [ 20, 88, 57] ]) { rotate(i) cube([100, 20, 20], center = true); }
iterazione di traslazione mediante vettore di valori for(i = [ [ 0, 0, 0], [10, 12, 10], [20, 24, 20], [30, 36, 30], [20, 48, 40], [10, 60, 50] ]) { translate(i) cube([50, 15, 10], center = true); }
iterazione mediante uso di vettore di vettori for(i = [ [[ 0, 0, 0], 20], [[10, 12, 10], 50], [[20, 24, 20], 70], [[30, 36, 30], 10], [[20, 48, 40], 30], [[10, 60, 50], 40] ]) { translate([i[0][0], 2*i[0][1], 0]) cube([10, 15, i[1]]); }
If .... else
[modifica | modifica sorgente]Esegue un test per determinare se l'azione che segue il test debba essere eseguita.
if (test) scope1 if (test){scope1} if (test) scope1 else scope2 if (test){scope1} else {scope2}
if (b==a) cube(4); if (b<a) {cube(4); cylinder(6);} if (b&&a) {cube(4); cylinder(6);} if (b!=a) cube(4); else cylinder(3); if (b) {cube(4); cylinder(6);} else {cylinder(10,5,5);} if (!true){cube(4); cylinder(6);} else cylinder(10,5,5); if (x>y) cube(1, center=false); else {cube(size = 2, center = true);} if (a==4) {} else echo("a is not 4"); if ((b<5)&&(a>8)) {cube(4); else cylinder(3);} if (b<5&&a>8) cube(4); else cylinder(3);
I cicli possono essere nidificati.
if (test1) { scope1 if (test2) {scope2.1} else {scope2.2} } else { scope2 if (test3) {scope3.1} else {scope3.2} }
Visualizzazione del modello
[modifica | modifica sorgente]