OpenSCAD

Table of Contents

Ce fichier est disponible en ligne à http://sed.bordeaux.inria.fr/org/openscad.org

1 Installer OpenSCAD.

https://www.openscad.org/

Il est disponible en paquet dans Debian, etc.

2 4 parties dans la fenêtre

2.1 Les boutons

Nouveau fichier .scad Ouvrir un .scad Enregistrer un .scad

Annuler une modification Refaire une modification

Désindenter Indenter

Aperçu 3D (rapide mais parfois moche sur les modèles complexes) Rendu (beau mais un peu plus lent) Exporter un STL (pour l'ouvrir dans slic3r) Envoyer à l'imprimante (déconseillé?)

2.1.1 Le code

2.1.2 Le rendu 3D

2.1.3 La console

Erreurs, warnings, statistiques, etc.

3 Le code

https://www.openscad.org/documentation.html

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language

Langage de programmation assez simple, avec pas mal de primitives existantes.

On finit les lignes par un point virgule. Les commentaires sont comme en C (/ et /* *). L'indentation est libre.

Les fonctions prennent des paramètres, parfois optionnels, qu'on peut nommer ou pas.

On peut préfixer plein de commandes par des transformations (translation, rotation, scaling, etc), voir plus loin.

4 Formes de base

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Primitive_Solids

Créer une sphère de rayon 50mm :

sphere(r=50);

Par défaut, la sphère est moche. On va augmenter la résolution avec le paramètre optionnel $fn (en gros le nombre de faces sur un périmètre). Plus on augmente $fn, plus ce sera joli mais plus le rendu sera lourd. Inutile de mettre trop si on imprime avec du fil de 0.4mm. https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Special_variables_2

La sphère est centrée à l'origine, on peut aussi la déplacer :

translate([0,0,50])
  sphere(r=50, $fn=20);

On rajoute un cylindre qui sert de pied à la sphère. On veut que ce cylindre soit plus large à la base (20mm de rayon) qu'en haut (18mm) :

cylinder(h=5, r1=20, r2=18, center=false);

Il n'y a pas besoin de dire qu'on veut "ajouter" ces 2 objets, c'est le comportement par défaut (voir union() plus loin).

5 Soustraction (différence)

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#difference

On va faire un bol à partir de notre sphère.

Pour enlever la moitié supérieure, on crée un cube qui contient cette partie :.

translate([0,0,100])
  cube(size=110, center=true);

Puis on le soustrait à la sphère :

difference() {
  translate([0,0,50])
    sphere(r=50, $fn=20);
  translate([0,0,100])
    cube(size=110, center=true);
}

Pour enlever l'intérieur, on va créer une sphère centrée au même endroit mais plus petite :

translate([0,0,50])
  sphere(r=45, $fn=20);

On peut la soustraire au résultat de l'opération précédente:

difference() {
  difference() {
    translate([0,0,50])
      sphere(r=50, $fn=20);
    translate([0,0,100])
      cube(size=110, center=true);
  }
  translate([0,0,50])
   sphere(r=45, $fn=20);
}

ou directement soustraire les deux mais attention à la syntaxe des blocs :

difference() {
  translate([0,0,50])
    sphere(r=50, $fn=20);
  {
    translate([0,0,100])
      cube(size=110, center=true);
    translate([0,0,50])
      sphere(r=45, $fn=20);
  }
}

Attention, on ne peut pas soustraire 2 objets à 2 autres avec cette syntaxe : difference() {{A B}{C D}} est interpreté comme difference() {A {B C D}} Voir les modules plus loin pour éviter ça, ou utiliser un union explicite : difference() { union() {A B} union() {C D} }.

6 Modules

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Chapter_7_--_User-Defined_Functions_and_Modules

On peut créer des modules pour construire des objets, calculer des choses, ou un opérateur.

Il peuvent éventuellement prendre des paramètres :

module mafonction(x, ...) {
};

Les modules permettent notamment de grouper des objets pour factoriser le code. Exemple pour éviter les problèmes de syntaxe des blocs dans les différences :

module corps() {
  translate([0,0,50])
    sphere(r=50, $fn=20);
  cylinder(h=5, r1=20, r2=18, center=false);
};

module a_soustraire() {
  translate([0,0,100])
    cube(size=110, center=true);
  translate([0,0,50])
    sphere(r=45, $fn=20);
};

difference() {
  corps();
  a_soustraire();    
};

Quand on manipule les différences, on veut parfois afficher la partie soustraire pour la vérifier. Ici, il suffit de rappeler ce module à la fin du code pour l'ajouter au modèle :

a_soustraire();

Surtout les modules permettent de réutiliser des objets. Par exemple pour créer 2 bols à des endroits différents:

module bol(x,y) {
  translate([x,y,0])
    difference() {
      corps();
      a_soustraire();    
    };
};

bol(50,100);
bol(100,100);

7 Transformations

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Chapter_4_--_Transform

Ajouter des prefixes devant les objets permet de les transformer :

translate([50,50,0])
  rotate([10,0,115])
  scale([1.5,1,0.5])
  bol(0,0);

Oh une coupelle !!!

Les transformations sont appliquées de la droite vers la gauche, comme une composée de fonctions. Donc ici, d'abord on agrandit, puis on tourne, puis on déplace. C'est l'ordre le plus simple à utiliser en général.

Si on inverse, ça ne donne pas le même résultat, notamment parce que les rotations et scaling sont appliqués par rapport aux origines de l'espace:

scale([1.5,1,0.5])
  rotate([10,0,115])
  translate([50,50,0])
  bol(0,0);

On peut également créer des opérateurs pour de nouvelles transformations. Par exemple, à partir de l'opérateur mirror() pour appliquer une symétrie, on peut créer une duplication symétrique par rapport à l'axe Z:

module mirror_copy_z() {
    children();
    mirror([0,0,1]) children();
};

mirror_copy_z() bol(0,0);

Oh un diabolo !!!

8 Variables

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Variables

On peut définir des variables globales ou locales aux fonctions :

rayon = 50;
epaisseur = 5;

difference() {
  marge = 10; /* pour etre que la sphere est inclue dans le cube */
  translate([0,0,rayon])
    sphere(r=rayon, $fn=20);
  {
    translate([0,0,2*rayon])
      cube(size=2*rayon+marge, center=true);
    translate([0,0,rayon])
      sphere(r=rayon-epaisseur, $fn=20);
  }
}

9 Extrusion

L'extrusion consiste à définir un objet 2D comme base d'un objet 3D.

9.1 Extrusion linéaire

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Linear_Extrude

D'abord, on extrude verticalement un polygone définit sur le plan horizontal :

pts = [[0,10], [10,0], [10,10]];
linear_extrude(height=200) polygon(pts);

On peut rajouter scale=0.5 pour que le haut de l'extrusion soit 2 fois plus petit. Ou twist pour tourner selon l'axe z pendant l'extrusion.

Les extrusions sont toujours verticales (le long de l'axe Z) donc il faut les tourner ensuite avec l'opérateur rotate().

9.2 Extrusion en rotation

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Rotate_Extrude

Là on définit un polygone sur le plan XZ et on l'extrude en tournant autour de l'axe Z.

pts = [[10,20], [15,10], [20,15]];
rotate_extrude(angle=180) polygon(pts);

Idem, il faudra souvent déplacer et tourner avec les opérateurs translate() et rotate() ensuite.

10 Remarques pour l'impression

Eviter les angles trop saillants, ca peut être difficile à imprimer, notamment si la pièce repose dessus.

11 Divers

11.1 Du texte, via de l'extrusion :

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Text

linear_extrude(height=5) text("Bidouille", size=10, font="Arial:style=Italic", spacing=0.8, direction="ttb");
  • Import de dessins 2D depuis inkscape
linear_extrude(10)
  scale([0.2,0.2,0.2])
  translate([-60,-200,0])
  import("openscad.svg");

Certaines fonctionnalités du SVG sont ignorées. https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/SVG_Import

Par exemple, le texte, mais on peut le convertir en chemin (menu Chemin dans Inkscape) avant d'exporter en SVG pour qu'il soit accepté dans OpenSCAD.

  • Mettre des couleurs pour distinguer nos objets

On peut mettre des couleurs en préfixant par color([r,g,b]) (composantes RGB entre 0 et 1). Ces couleurs apparaissent uniquement dans l'aperçu F5, pas dans le rendu STL ni à l'impression.

color([.8,0,.2]) linear_extrude(10) import(center=true, "openscad.svg");

Date: 15 novembre 2019

Author: Brice Goglin

Created: 2019-11-15 or. 16:43

Validate