OpenSCAD/Primi passi
Cheatsheet
modificaPagina riassuntiva con i comandi disponibili per la modellazione [link].
Aprire un modello di esempio esistente
modificaAprire uno degli esempi della installazione OpenSCAD (File > Examples > example004.scad).
Oppure copia e incolla il codice seguente della finestra OpenSCAD.
Creare un modello
modificaCube, sphere, cylinder
modificaOpenscad 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// 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
modificaQuesto 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// 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// 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
modificaPossiamo 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
modificaI 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()
modificaUtilizza 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
modificaEsegue 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