Outils pour utilisateurs

Outils du site


logiciel:openscad

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
logiciel:openscad [2017/11/15 10:55] ahuetlogiciel:openscad [2022/09/04 21:46] (Version actuelle) – modification externe 127.0.0.1
Ligne 3: Ligne 3:
 OpenSCAD est un logiciel de modélisation 3D. Son originalité réside dans les faits que les volumes y sont décrit avec du code, ce qui est fort plaisant pour qui aime en écrire. OpenSCAD est un logiciel de modélisation 3D. Son originalité réside dans les faits que les volumes y sont décrit avec du code, ce qui est fort plaisant pour qui aime en écrire.
  
 +Une archive contenant les exemples ci-dessous est disponible : {{logiciel:tuto_openscad.tar.gz}}.
 ===== Liens utiles ===== ===== Liens utiles =====
-[[http://www.openscad.org/|Site du projet]] 
  
-[[http://www.openscad.org/cheatsheet/|La CheatSheet à garder sous le coude]]+  *[[http://www.openscad.org/|Site du projet]] 
 +  *[[http://www.openscad.org/cheatsheet/|La CheatSheet à garder sous le coude]] 
 +  *[[https://www.thingiverse.com/search/page:1?q=openscad&sa=&dwh=315a048679b21bf|Thingiverse regorge d'exemples et de ressources]] 
 +    *[[https://www.thingiverse.com/thing:25036|Importer automagiquement les modèles Inkscape]] 
 +    *[[https://www.thingiverse.com/thing:16193|Bibliothèque pour écrire sur des volumes]] 
 +    *[[https://www.thingiverse.com/thing:35834|Bibliothèque pour découper une pièce en puzzle]] 
  
-[[https://www.thingiverse.com/search/page:1?q=openscad&sa=&dwh=315a048679b21bf|Thingiverse regorge d'exemples]]+===== Concepts de bases =====
  
-[[https://www.thingiverse.com/thing:25036|Importer automagiquement les modèles Inkscape]]+  * Les volumes créés doivent être Manifold : il faut donc faire attention à ne pas laisser exister de surface infiniment fines entres les volumes. 
 +  * Les volumes créés doivent être Watertigh aka étanches : cela ne posent pas de problèmes avec les primitives de bases, mais il faut bien y veiller lorsque l'on définit des ensemble de vecteurs par leurs coordonnées. 
 +  * Bien que le pseudo-langage soit [[https://fr.wikipedia.org/wiki/Turing-complet|Turing-complet]], il n'est n'est pas moins limité. Dans certains cas avancé, on peut envisager de générer le fichier .scad en utilisant un langage de haut-niveau. 
 +  * Lorsque l'on travaille sur on modèle, on utilise le mode de prévisualisation, plus rapide, à l'aide de ''F5''. Néanmoins, celui-ci peut parfois présenter des lacunes lorsque l'on travaille sur des modèles complexes, et alors, seul le le mode rendu (''F6''), parfois <sub>très</sub> long à répondre, garanti le résultat final. 
 +  * Certains caractères sont des modificateurs, on n'hésitera pas à en abuser pour comprendre ce que l'on fait : 
 +    * ''*'' désactive la commande de la ligne courante 
 +    * ''!'' active le rendu uniquement pour la ligne courante 
 +    * ''#'' surligne le rendu de la ligne courante, très pratique pour débugger 
 +    * ''%'' rend transparent le rendu de la ligne courante 
 +  * Les instructions finissent par des points virgules. Un point virgule de trop peut provoquer des bugs peut aisés à diagnostiquer pour le débutant. Lorsque l'on oublie un point virgule, le compilateur souligne la ligne suivante.
  
 ===== Installation ===== ===== Installation =====
Ligne 21: Ligne 35:
 ===== Créer des volumes ====== ===== Créer des volumes ======
  
-Comme expliqué dans le [[http://www.openscad.org/cheatsheet/|cheat sheet]], une certain nombre de primitve 3D sont disponibles.+Comme expliqué dans le [[http://www.openscad.org/cheatsheet/|cheat sheet]], une certain nombres de primitive 3D sont disponibles.
  
 Bien que cela ne soit pas obligatoire, il est recommandé de toujours nommer les paramètres des fonctions explicitement afin de s'économiser du temps à la relecture. Bien que cela ne soit pas obligatoire, il est recommandé de toujours nommer les paramètres des fonctions explicitement afin de s'économiser du temps à la relecture.
Ligne 54: Ligne 68:
 ===== Primitives 2D ===== ===== Primitives 2D =====
  
 +Les principales primitives 2D sont les suivantes :
  
 +<code c>circle(radius | d=diameter)</code> permet de dessiner des cercles.
 +<code c>square([width,height],center)</code> permet de dessiner non seulement des carrés, mais plus généralement des rectangles.
 +<code c>text(text, size, font,
 +     halign, valign, spacing,
 +     direction, language, script)</code>Permet d'écrire facilement du texte avec n'importe-quelle police installée sur le système hôte.
 +     
 +Ces primitives sont couramment utilisés en association avec les fonctions d'extrusions :
  
-===== Transformation =====+<code c> 
 +linear_extrude(height,center,convexity,twist,slices,scale) 
 +rotate_extrude(angle,convexity) 
 +</code>
  
 +Voici un exemple à copier-coller pour avoir un aperçu de ce qu'il est possible d'en faire :
 +<code c>
 +// On extrude linéairement sur 25mm
 +linear_extrude(height = 25) {
 +// On définit un carré régulier de coté trente
 +    translate([200, 100]) square(30);
 +// On définit un carré avec des dimensions differentes suivant les axes, centrée sur l'origine
 +    translate([300, 100]) square([10, 20], center = true);
 +}
 +
 +// L'extrusion rotative permet de définir facilement des formes toriques
 +// Attention, le paramètres 'angle' n'est disponible qu'à partir de la version 2016.XX
 +rotate_extrude(angle = 142) {
 +    // On définit un cercle par son rayon
 +    translate([150, 0]) circle(r = 42);
 +    // On définit un cercle par son diamètre
 +    translate([150, 100]) circle(d = 42);
 +}
 +
 +
 +translate([0,300])
 +linear_extrude(25) {
 +    // Il est très facile d'écrire
 +    text("Beautiful is better than ugly");
 +    // Toutes les polices du systèmes sont disponibles
 +    translate([0, -40])
 +    text("Explicit is better than implicit.",
 +        size = 12,
 +        font = "Courier:style=Bold Italic");
 +}
 +</code>
 + ===== Transformations =====
 +
 +==== Transformations de base ====
 + 
 +Les transformations les plus couramment utilisées sont les suivantes :
 +
 +<code c>translate([x,y,z])</code> pour effectuer une translation.
 +<code c>rotate([x,y,z])</code> pour effectuer une rotation.
 +<code c>scale([x,y,z])</code> pour effectuer une mise à l'échelle.
 +
 +Il existe également une directive ''color("colorname",alpha)'' qui permet de changer la couleur d'affichage. Attention : cela ne sera valable qu'en mode prévisualisation, ce qui peut être pratique, en revanche, les format d'export ne conservent pas cette information.
 +
 +Voici un exemple à copier-coller pour avoir un aperçu rapide des possibilités : 
 +
 +<code c>
 +// Le volume de base sans transformation
 +cube(42);
 +
 +// On effectue une translation de 100mm sur l'axe des X
 +color("red") translate([100, 0, 0]) cube(42);
 +
 +// On effectue une translation puis une rotation
 +color("green") rotate([42, 42, 42]) translate([100, 100, 0]) cube(42);
 +
 +// On remarque que le résultat d'une rotation suivie d'une translation est différent
 +color("blue") translate([100, 100, 0]) rotate([42, 42, 42]) cube(42);
 +
 +// De même, lorsque l'on redimensionne, l'ordre des opérations à son importance
 +color("pink") rotate([-42, 42, 42]) translate([100, 100, 0]) scale([1, 2, 3]) cube(42);
 +color("purple") scale([1, 2, 3]) rotate([-42, 42, 42]) translate([100, 100, 0]) cube(42);
 +</code>
 +
 +==== Transformations avancées ====
 +
 +=== La fonction Hull ===
 +
 +La fonction ''hull()'' permet de générer un bouclier qui englobe tous les volumes à laquelle elle s'applique. Pour la tester, appliquons aux même volumes que ceux décrit dans [[logiciel:openscad#creer_des_volumes|la première section]] :
 +
 +<code c>
 +// On crée un bouclier englobant toutes les formes utilisés dans le premier exemple
 +hull() {
 +    sphere(r = 42);
 +    translate([100, 0, 0]) sphere(d = 42);
 +    translate([0, 100, 0]) cube(30);
 +    translate([100, 100, 0]) cube([10, 20, 30], center = true);
 +    translate([0, 200, 0]) cylinder(h = 42, r = 12);
 +    translate([100, 200, 0]) cylinder(h = 42, r1 = 12, d2 = 42, center = true);
 +}
 +</code>
 +
 +Cette fonction est très pratique pour concevoir rapidement des objets de type boîtier.
 +
 +=== La fonction Minkowski ===
 +
 +Cette fonction applique une [[http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Minkowski_sum_3/Chapter_main.html|somme de Minkowski]]. Pour anticiper son effet, il faut imaginer que le second volume décrit est "baladé" sur toute la surface du premier.
 +C'est très pratique pour créer des chanfreins et des angles arrondis, il faut bien penser à prendre en compte son effet sur les dimensions des volumes créés. Ainsi, la cube à bord arrondis décrit ci-après aura bien une dimension de 50mm (42 + 2*4).
 +
 +<code c>
 +// $fn définit le nombre de facette qui compose une sphère
 +$fn=50;
 +
 +//Un cube de 50mm aux bord arrondis sur 4mm.
 +minkowski() {
 +    cube(42);
 +    // coins arrondis
 +    sphere(4);
 +}
 +</code>
 +
 +''minkowski()'' donne facilement de beaux résultats, mais plus les volumes décrit sont complexes, et plus ''$fn'' est réglé haut, plus le temps de calcul du modèle s'allonge <sub>parfois démesurément</sub>. Pendant les phases d'écriture, on peut abaisser ''$fn'' pour travailler, et le remonter au moment de générer le modèle final.
 ===== Opération booléennes ===== ===== Opération booléennes =====
 +
 +''OpenSCAD'' dispose des trois [[wp>G%C3%A9om%C3%A9trie_de_construction_de_solides|opérations géométriques booléennes]] :
 +
 +<code c>
 +union()
 +difference()
 +intersection()
 +</code>
 +
 +Elle peuvent être combinées pour créer facilement des volumes complexes. On notera ici que ''$fn'' est volontairement réduit à 6 afin de créer une tête hexagonale, ainsi que l'utilisation du modificateur ''#'' afin de surligner un volume soustractif.
 +
 +<code c>
 +// Intersection avec un cylindre à 6 facette, pour créer une tête hexagonale.
 +intersection() {
 +    // Union entre la tête et le corps
 +    union() {
 +        translate([0, 0, 5]) cube([50, 50, 10], center = true);
 +        // Difference pour le trou dans le corps
 +        difference() {
 +            $fn = 50;
 +            cylinder(d = 25, h = 100);
 +            translate([0, 0, 80]) rotate([90, 0, 0]) cylinder(d = 10, h = 50, center = true);
 +        }
 +    }
 +    $fn = 6;
 +    #cylinder(d = 45, h = 110);
 +}
 +</code> 
 ===== Boucles ===== ===== Boucles =====
-===== Concepts importants =====+ 
 +Il est possible de définir des boucles ''for'' afin de parcourir des espaces de valeurs. 
 + 
 +<code c> 
 +// 10 cubes rouges de tailles différentes 
 +color("red") for (cube_size [1:10]) translate([cube_size * 10, 0, 0]) cube(cube_size); 
 + 
 +// 4 sphères vertes différentes réunis par un bouclier 
 +color("green"
 +hull() { 
 +    for (ball_size [1:4]) { 
 +        if (ball_size % 2) 
 +            translate([ball_size, 10 *  ball_size, 0]) sphere(ball_size); 
 +        else 
 +            translate([-ball_size, 10 *  ball_size, 0]) sphere(ball_size);     
 +    }; 
 +
 + 
 +// 20 cylindre bleu en rotation 
 +color("blue"
 +for (angle [0:20]) { 
 +    translate([0, 0, 10 * angle]) rotate([9 * angle, 0, 0]) cylinder(15); 
 +
 +</code> 
 + 
 +Les boucles se prêtent bien aux jeux trigonométriques : 
 + 
 +<code c> 
 +$fn 3; 
 + 
 +// 12960 ensembles de cylindres qui changent de couleurs en parcourant une sphère  
 +for (i [0:1:360]) { 
 +    for (j [0:10:359]) { 
 +        color([sin(i), min(1, tan(abs(i-j))), cos(j)])  
 +        rotate([i, j, 0])  
 +        translate([100, 100, 0]) 
 +        union() { 
 +            cylinder(r 2, h 1); 
 +            cylinder(r 1, h 2); 
 +        } 
 +    } 
 +
 +</code> 
 + 
 +===== Export ===== 
 + 
 +L'export en STL est une fonction de base : une fois effectué le rendu à l'aide de ''F6'', il suffit de cliquer dans le menu ''Fichier>Exporter>Exporter comme STL''
 + 
 +Il est également possible d'exporter des fichiers au format DXF ou SVG, par exemple pour les découper au laser. Pour cela, l'objet rendu doit être en 2D. On peut, à cet effet, effectuer une ''projection'', qui rendra en 2D la coupe du volume suivant le plan Z = 0. 
 + 
 +<code c> 
 +projection() { 
 +    difference() { 
 +        cylinder(r = 4); 
 +        cylinder(r = 2); 
 +    } 
 +
 +</code>
logiciel/openscad.1510743351.txt.gz · Dernière modification : 2022/09/04 21:45 (modification externe)