OpenSCAD/Primi passi: differenze tra le versioni

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Correggo tag deprecato
Riga 18: Riga 18:


{| width="100%"
{| width="100%"
|<source lang="javascript">
|<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%"
|<source lang="javascript">
|<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%"


|<source lang="javascript">
|<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%"


|<source lang="javascript">
|<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:
|
|
|-
|-
|<source lang="javascript">
|<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:


<source lang="javascript">
<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 }


<source lang="javascript">
<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

Indice del libro

Cheatsheet

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

OpenSCAD CheatSheet
OpenSCAD CheatSheet

Aprire un modello di esempio esistente

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

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);
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

// 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

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]);
*/
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.

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

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");
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'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);
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


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