OpenSCAD/Primi passi: differenze tra le versioni
Nessun oggetto della modifica |
Correggo tag deprecato |
||
Riga 18: | Riga 18: | ||
{| width="100%" |
{| width="100%" |
||
|< |
|<syntaxhighlight lang="javascript"> |
||
// esempio 1 |
// esempio 1 |
||
Riga 50: | Riga 50: | ||
// tronco di piramide a base pentagonale |
// tronco di piramide a base pentagonale |
||
cylinder(15,6,2,$fn=5); |
cylinder(15,6,2,$fn=5); |
||
</syntaxhighlight> |
|||
</source> |
|||
| |
| |
||
[[File:OpenSCAD Cubo.png|miniatura|OpenSCAD Cubo |
[[File:OpenSCAD Cubo.png|miniatura|OpenSCAD Cubo |
||
Riga 82: | Riga 82: | ||
=== Difference, union, intersection === |
=== Difference, union, intersection === |
||
{| width="100%" |
{| width="100%" |
||
|< |
|<syntaxhighlight lang="javascript"> |
||
// esempio 2 |
// esempio 2 |
||
translate([0, 0, 30]){ //traslazione in verticale asse Z |
translate([0, 0, 30]){ //traslazione in verticale asse Z |
||
Riga 109: | Riga 109: | ||
!sphere(20); MOSTRERÀ SOLO QUESTO SOLDIO |
!sphere(20); MOSTRERÀ SOLO QUESTO SOLDIO |
||
*/ |
*/ |
||
</syntaxhighlight> |
|||
</source> |
|||
|[[File:openscad_first_steps.png|thumb|OpenSCAD after pasting the example code and pressing F5 |
|[[File:openscad_first_steps.png|thumb|OpenSCAD after pasting the example code and pressing F5 |
||
difference() { |
difference() { |
||
Riga 143: | Riga 143: | ||
{| width="100%" |
{| width="100%" |
||
|< |
|<syntaxhighlight lang="javascript"> |
||
// esempio 3 - posizionare un oggetto |
// esempio 3 - posizionare un oggetto |
||
cube([2,3,4]); // l'origine coincide con lo spigolo a meno di indicare |
cube([2,3,4]); // l'origine coincide con lo spigolo a meno di indicare |
||
Riga 159: | Riga 159: | ||
translate([3,0,0]) cube([2,3,4]); |
translate([3,0,0]) cube([2,3,4]); |
||
*/ |
*/ |
||
</syntaxhighlight> |
|||
</source> |
|||
| |
| |
||
[[File:OpenSCAD_Positioning_an_Object.png|thumb|Posizionare un oggetto in OpenSCAD |
[[File:OpenSCAD_Positioning_an_Object.png|thumb|Posizionare un oggetto in OpenSCAD |
||
Riga 175: | Riga 175: | ||
{| width="100%" |
{| width="100%" |
||
|< |
|<syntaxhighlight lang="javascript"> |
||
// esempio 4 - ruotare un oggetto |
// esempio 4 - ruotare un oggetto |
||
// la rotazione avviene sempre rispetto all'origine assoluta degli assi |
// la rotazione avviene sempre rispetto all'origine assoluta degli assi |
||
Riga 194: | Riga 194: | ||
cube([2,3,4]); |
cube([2,3,4]); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
| |
| |
||
[[File:Rotazione2 assonometria.png|miniatura|Rotazione assonometria]] |
[[File:Rotazione2 assonometria.png|miniatura|Rotazione assonometria]] |
||
Riga 208: | Riga 208: | ||
| |
| |
||
|- |
|- |
||
|< |
|<syntaxhighlight lang="javascript"> |
||
// esempio 5 - cambiare il colore di un oggetto |
// esempio 5 - cambiare il colore di un oggetto |
||
color([1,0,0]) cube([2,3,4]); //equivalente a color("red"); |
color([1,0,0]) cube([2,3,4]); //equivalente a color("red"); |
||
Riga 217: | Riga 217: | ||
translate([6,0,0]) |
translate([6,0,0]) |
||
color([0,0,1]) cube([2,3,4]); //equivalente a color("blue"); |
color([0,0,1]) cube([2,3,4]); //equivalente a color("blue"); |
||
</syntaxhighlight> |
|||
</source> |
|||
|[[File:OpenSCAD_Changing_Color.png|thumb|Cambiare il colore di un oggetto in OpenSCAD]] |
|[[File:OpenSCAD_Changing_Color.png|thumb|Cambiare il colore di un oggetto in OpenSCAD]] |
||
|} |
|} |
||
Riga 225: | Riga 225: | ||
Considerando un commando completo come una proposizione, allora <code>color()</code> è un "aggettivo" che descrive l'"oggetto" della proposizione (cioè il "nome"). In questo caso, l'oggetto è il cuboide <code>cube()</code> da creare. L'aggettivo deve essere prima del nome nella proposizione, come nel caso: <code>color() cube();</code>. Allo stesso modo, <code>translate()</code> può essere considerato un "verbo" che agisce sull'oggeto, ed è posizionato così: <code>translate() color() cube();</code>. Il codice che segue produce lo stesso risultato: |
Considerando un commando completo come una proposizione, allora <code>color()</code> è un "aggettivo" che descrive l'"oggetto" della proposizione (cioè il "nome"). In questo caso, l'oggetto è il cuboide <code>cube()</code> da creare. L'aggettivo deve essere prima del nome nella proposizione, come nel caso: <code>color() cube();</code>. Allo stesso modo, <code>translate()</code> può essere considerato un "verbo" che agisce sull'oggeto, ed è posizionato così: <code>translate() color() cube();</code>. Il codice che segue produce lo stesso risultato: |
||
< |
<syntaxhighlight lang="javascript"> |
||
// esempio 6 - cambiare il colore di un oggetto |
// esempio 6 - cambiare il colore di un oggetto |
||
translate([6,0,0]) |
translate([6,0,0]) |
||
Riga 235: | Riga 235: | ||
translate([6,0,0]) // le parentesi graffe non servono se riguarda un solo solido |
translate([6,0,0]) // le parentesi graffe non servono se riguarda un solo solido |
||
color([0,0,1]) cube([2,3,4]); |
color([0,0,1]) cube([2,3,4]); |
||
</syntaxhighlight> |
|||
</source> |
|||
La modifica dei colori è attiva solo in Preview (F5). La modalità Render (F6) non la supporta ancora. |
La modifica dei colori è attiva solo in Preview (F5). La modalità Render (F6) non la supporta ancora. |
||
Riga 245: | Riga 245: | ||
module name ( parameters ) { actions } |
module name ( parameters ) { actions } |
||
< |
<syntaxhighlight lang="javascript"> |
||
// esempio 7 - modulo per la creazione di cilindri ruotati |
// esempio 7 - modulo per la creazione di cilindri ruotati |
||
module rotcy(rot, r, h) { |
module rotcy(rot, r, h) { |
||
Riga 254: | Riga 254: | ||
rotcy([0,45,0],10,30); |
rotcy([0,45,0],10,30); |
||
</syntaxhighlight> |
|||
</source> |
|||
== Iterazione: ciclo for() == |
== Iterazione: ciclo for() == |
Versione delle 20:41, 4 giu 2020
Cheatsheet
Pagina riassuntiva con i comandi disponibili per la modellazione [link].
Aprire un modello di esempio esistente
Aprire uno degli esempi della installazione OpenSCAD (File > Examples > example004.scad).
Oppure copia e incolla il codice seguente della finestra OpenSCAD.
Creare un modello
Cube, sphere, cylinder
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
// 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
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
// 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
// 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
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'oggeto, 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
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()
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
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