Vai al contenuto

OpenSCAD/Primi passi

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Pagina riassuntiva con i comandi disponibili per la modellazione [link].

OpenSCAD CheatSheet
OpenSCAD CheatSheet

Aprire un modello di esempio esistente

[modifica | modifica sorgente]
OpenSCAD è partito regolarmente

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);
OpenSCAD Cubo cubo(3);
Un cuboide in OpenSCAD cube([2,3,4]);
OpenSCAD_Cubo centrato cube(3,true);
Sfera a diversa risoluzione sphere(3); sphere(3,$fn=20);
Cilindro e prisma a base poligonale cylinder (15,6,6); cyinder (15,6,6,$fn=5);
Piramidi tronche cylinder (15,6,2); 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
*/
OpenSCAD after pasting the example code and pressing F5 difference() { cube(30, center=true); sphere(20); } translate([0, 0, 30]) { cylinder(h=40, r=10); }
Union e Intersection

Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.

Sono possibile tre tipi di azione con il mouse:

  1. Trascinare con il tasto sinistro per ruotare la vista. Il valore della rotazione in basso cambia.
  2. Trascinare con il tasto destro per spostare la vista (pan). Il valore della traslazione in basso cambia.
  3. 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.

// 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]);
*/
Posizionare un oggetto in OpenSCAD cube([2,3,4]); translate([3,0,0]) { cube([2,3,4]) };
Parallelepipedo centrato con opzione TRUE cube([2,3,4],true);

Quindi premere F5 per ottenere la compilazione e la visualizzazione del modello.

// 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]);
}
Rotazione assonometria
Rotazione pianta

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");
Cambiare il colore di un oggetto in OpenSCAD

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.


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);
example 1 for() loop vector of vectors (rotation)
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);
}
example 2 for() loop vector of vectors (translation)
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);
}
example 3 for() loop vector of vectors
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]