OpenSCAD : Différence entre versions

De Wiki Robotronik
(Page créée avec « Category:Logiciels Category:Impression 3D {{Warning | Cette page a été écrite pour une version d'OpenSCAD inférieure à 2015.03 et doit être mise à jour}}... »)
 
(Aucune différence)

Version actuelle datée du 11 avril 2019 à 18:42


Modèle:Warning

OpenSCAD est un logiciel libre de CAO à considérer comme un compilateur 3D, la conception de modèles passant par la rédaction d'un script. L'écriture de modèles 3D est très intuitive et sa syntaxe rappelle par certains aspects le C. La majeure partie des instructions du langage est résumée ici.

Formes Simples

OpenSCAD permet de dessiner rapidement quelques objets 3D basiques … :

cube([10,10,10]); //un cube de coté 10 (équivalent à cube(10);) cube([20,10,10]); //un pavé sphere(10); //une sphère de rayon 10 sphere(d=10); //une sphère de diamètre 10 cylinder(10, r=2); //un cylindre de rayon 2 et de hauteur 10 cylinder(10, d=2); //un cylindre de diametre 2 et de hauteur 10 cylinder(10, r1=4,r2=2); //un cône tronqué

… mais également des formes 2D :
(Oui ça paraît bizarre mais vous comprendrez quand vous lirez la suite)

circle(1); // un cercle de rayon 1 circle(d=2); // un cercle de diamètre 2 square(1); // un carré square([2,3]); // un rectangle

Placer ses objets

Bon tout ça c'est bien beau mais OpenSCAD place nos objets toujours au même endroit ! Et si j'ai envie de poser une sphère sur un cube ? Comment je fais ?
Doucement ! D'abord il faut remarquer que la sphere est centrée sur l'origine du repère, ce qui n'est pas le cas du cube. Comment remédier à celà ? C'est très simple, il suffit de lui demander :

cube(5,center=true);

Bon aller ! Hop, hop, hop ! maintenant il faut translater la sphere vers le haut :

translate([0,0,7.5]) sphere(5);

Intuitif n'est-ce pas ? Il est important de remarquer l'absence de point-virgule entre tranlate() et sphere() ; ceci permet de désigner l'objet à translater. Il est à noter que l'on peut utiliser des accolades pour translater plusieurs objets à la fois.

Et maintenant on rassemble tout ça :

cube(5,center=true); translate([0,0,7.5]) sphere(5);

Et voilà le travail ! Si maintenant on veut faire tourner un objet suivant un axe il suffit d'appeler la fonction rotate() qui prend en arguments des angles en degrés et qui fonctionne de la même manière que translate(). Un petit exemple pour la route :

rotate([0,20,0]) cube(5,center=true); //fait tourner un cube de vingt degrés suivant l'axe y dans le sens trigonométrique

Formes Complexes

Jouer avec des spheres et des cubes ça va un temps mais on aimerai pouvoir dessiner des choses un peu plus complexes. Et bien devinez quoi ce chapitre est là pour ça ! Les choses sont bien faites non ? On va y aller doucement : que dites vous de dessiner un carré en 2D ? (patience, on verra l'utilité des objets 2D dans le chapitre suivant). Pour ça on fait appel à la fonction polygon() en lui indiquant chacun des sommet, ici dans le sens trigonométrique (le sens horaire aurait également parfaitement convenu pourvu qu'on ne croise pas), ce qui donne :

polygon([[0,0],[10,0],[10,10],[0,10]]);

C'est joli mais la fonction cube() nous aurait donné un résutat similaire. Là où cette fonction prend tout son sens c'est quand on lui demande de suivre un chemin en particulier :

polygon(

       points=[[0,0],[10,0],[10,10],[0,10],[2,2],[8,2],[8,8],[2,8]], //les sommets de notre polygone
       paths=[[0,1,2,3],[4,5,6,7]] //les chemins à suivre pour former les arêtes de notre polygone.
                                   //0 désignant le premier sommet, 1 le deuxième, etc…

);

Et voilà un joli cadre !

Vous devez vous douter qu'il exite la même chose pour dessiner des forme complexes en 3D. La fonction s'appelle polyhedron() et fonctionne de la même manière :

polyhedron(

       points=[[10,0,0],[0,10,0],[-10,0,0],[0,-10,0],[0,0,10]], //les sommets
       faces=[[0,1,4],[1,2,4],[2,3,4],[3,0,4],[0,1,2,3]] //ici on ne réprésente plus les arêtes mais les faces de l'objet

);

Remarque : Si vous utilisez une version d'OpenSCAD antérieure à la 2014.03 il faudra remplacer «faces» par «triangles» ; la base carrée de notre pyramide devant de ce fait être divisée en deux triangles.

Extrudons !

Ça y est on va pouvoir comprendre à quoi servent les objets 2D ! Pour cela reprenons notre petit cadre et utilisons notre jolis cadre précédemment dessiné :

linear_extrude(height = 50,twist=150,scale=3) //oh la jolie fonction !

       translate([-5,-5,0]) //on centre notre objet
               polygon( //le cadre précédement déssiné
                       points=[[0,0],[10,0],[10,10],[0,10],[2,2],[8,2],[8,8],[2,8]],
                       paths=[[0,1,2,3],[4,5,6,7]]
               );


Cette fonction prend en argument la hauteur d'extrusion (height) plus certain autres arguments optionnels :

  • center : booléen pour centrer ou non l'objet suivant l'axe z (l'axe d'extrusion)
  • twist : angle de rotation de l'objet le long de l'axe d'extrusion.
  • slices : nombre de fois où l'objet sera répété pendant l'extrusion (utile lorsque l'on utilise «twist»)
  • convexity : Ce paramètre affecte seulement l'affichage de l'objet dans l'aperçu, il est mis le plus souvent à 10. Plus de détails ici.
  • scale : Redimensionne l'objet entre de départ et l’arrivée. Ex : «scale=3» affecte la taille de la même manière en x et en y tandis que «scale=[1,3]» affecte l'objet en y mais pas en x.

Et maintenant au tour de rotate_extrude(), un exemple vaut mieux qu'un long discours :

rotate_extrude(convexity=10) //extrude en effectuant une rotation autour de l'axe z

       translate([25,0,0]) rotate([0,-90,0]) //le rotate() ne sert ici à rien mais permet de mieux comprendre ce qu'il se passe
               circle(10);

La fonction est beaucoup plus simple que la précédente : elle ne prend que convexity en argument et encore ça reste optionnel… Attention à ne pas centrer votre objet à extruder sur un axe, lors de la rotation il y aurait alors chevauchement et OpenSCAD ne vous affichera rien !

Notre amis Boole

Nous allons découvrir ici un aspect très important à utiliser sans modération : nous savons déjà comment accoler (additionner) deux objets : il suffit de les dessiner au bon endroit et il s'accolent\se chevauchent naturellement. Maintenant on est donc en droit de se demander comment faire une difference. Par exemple on pourrait vouloir faire une cavité shérique dans un cube :

difference() {

       cube(20,center=true);
       translate([0,0,10]) sphere(10);

}

Plutôt simple non ? Le premier objet est celui qu'on évide par tout les suivants. Cependant on est en droit de se demander comment on fait si on veut que les deux premiers soit additionnés comme d'habitude puis ensuite évidé par le troisième. Dans ce cas il faudrat exprimer clairement nos intentions grâce à la fonction union(). Un petit exemple :

difference() {

       union()
       {
               cube(20,center=true);
               translate([0,0,10]) sphere(10);
       }
       translate([10,0,10]) cube(10,center=true);

}

Vous commencez à présentir toutes les possibilités ? Tenez vous bien car ce n'est pas fini ! Vous voudriez peut être n'obtenir que l'intersection de deux objets ? Même si c'est possible de faire ça en utilisant deux fois la fonction difference() il y a plus propre :

intersection() {

       cube(10);
       sphere(10);

}

Encore une fois union() peut devenir indispensable.

Des boucles et des variables

Comme vous pouvez vous en douter, en bon langage qui se respecte OpenSCAD permet de déclarer ses variables. La valeur de ces variables peut être de différente nature : un nombre (42), un vecteur ([0,1,2]) et donc également une matrice ([[1,2],[3,4]]), un booléen (true/false), une chaîne de caractères ("Robotronik") ou encore une valeur non définie (undef). La déclaration d'une variable se fait de manière fort simple et sans avoir à préciser son type :

Robotronik="awesome";

De la même façon OpenSCAD permet l'utilisation de boucles :

for (i = [début:pas:fin]) { … } //il n'est pas nécessaire de préciser le pas si il est de 1 for (i = […,…,…]) { … } //ici i prendra tour à tour les valeurs listées

Et il n'y a pas que des boucles "for" :

//Vous vous souvenez de la fonction intersection()? Ici l'intersection se fait entre tout les objets définis à chaque tour de boucle. intersection_for (i = [début:pas:fin]) { … } intersection_for (i = […,…,…]) { … }

Quoique …

Modules

Maintenant que l'on sait faire pas mal de choses, on peut commencer à dessiner de beaux objets et surtout à les réutiliser ! Il serai bête de dessiner une roue et de ne pouvoir l'utiliser qu'une seule fois … Pour cela il est nécessaire de paramétrer au maximum nos objets (diamètre, nombre de rayons, etc pour l'exemple de la roue) à l'aide de variables et sur tout en utilisant les modules (un peu l’équivalent des fonctions dans d'autres langages). En voici la syntaxe :

module boite(inter,exter) //on déclare notre module {

       //ici on s'amuse
       difference()
       {
               cube(exter,center=true);
               translate([0,0,(exter-inter)/2+0.01]) cube(inter,center=true);
       }

}

boite(5,4); //on appelle notre module

Et voilà le travail ! Ici l'exemple n'est pas d'une grande utilité mais si il vous faut dessiner une vis par exemple autant le faire en paramétrant le filetage, la longueur, la tête, etc pour pouvoir réutiliser votre travail à l'avenir … Il vous faudra pour cela sauvegarder votre code dans un fichier vis.scad et de l'utiliser en rajoutant include <chemin_vers_le_fichier/vis.scad> ou use <vis.scad> en en-tête du fichier ou vous en avez besoin. include se comporte comme si tout ce qui se trouve dans vis.scad est recopié tandis que use ne fait qu'importer les modules.

Variables spéciales

Vous vous êtes peut-être demandé pourquoi les sphères présentées en début de tutoriel étaient plus jolies que les vôtres qui ressemblent à des boules à facettes. Ceci nous permet d'introduire ce chapitre sur les variables spéciales : essayez de rajouter la ligne $fn=50; avant de dessiner une sphère et voyez la différence ! En fait $fn est une variable spéciale qui permet de définir en combien de "fragments" sera découpé un cercle (ce qui influe de ce fait sur la sphère également). Il est également possible de définir l'angle minimal entre les fragments à l'aide de $fa, par défaut celui-ci est à 12 (soit 30 segments pour représenter un cercle). De même on peut paramétrer la taille minimale des segments (par défaut à 2 et au minimum égal à 0.01) avec $fs.

$fn=50; //la variable agit de manière globale pour tout ce qui suit … sphere(10); sphere(20); sphere(30,$fn=10); //… sauf ici ou l'on a demandé autre chose

Il existe d'autres variable spéciales qui sont utiles quand on veux faire des animations (quoi vous étiez pas au courant ? View -> Animate) :

$t //variable incrémenté de "1/Step" pendant "Step" fois tout les "1/FPS" secondes $vpr //rotation de la caméra $vpt //translation de la caméra $vpd //distance de la caméra

Aller plus loin

Ce tuto est loin d'être exhaustif et même si il présente la majeure partie de ce dont vous aurez besoin il est possible que vous soyez amenés à utiliser des fonctions telles que scale(), resize(), hull(), minkowski(). Vous allez peut-être également vouloir générer du texte à l'aide de text() ou ajouter de la couleur. De la même manière, il existe des modificateurs de débug ("%", "*", "!" et "#") qui peuvent devenir très utiles… Il est donc conseillé que vous fassiez vos essais en allant chercher sur la doc officielle. Et si vous avez un doute sur une fonction aller voir sur la cheatsheet, c'est fait exprès ;).

Astuces

OpenSCAD permet d'utiliser son éditeur préféré. Pour cela aller dans "View" puis "Hide editor" ensuite faire "Design -> Automatic Reload and Compile".
Autour de OpenSCAD il existe quelques outils sympatiques qui permettent, par exemple, de convertir une image en un objet 3D à l'instar de polygon editor et de png23d.