Outils pour utilisateurs

Outils du site


logiciel:openscad

Ceci est une ancienne révision du document !


Initiation OpenScad

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.

Liens utiles

Concepts de bases

Installation

La version packagée dans les Debian Stable est tout à fait satisfaisante pour une utilisation normale :

apt-get install openscad

Il est toujours intéressant de faire un tour dans les préférences, entre autres pour choisir sa palette de couleur préférée et activer l'éditeur avancé.

Encore mieux : on peut activer l'option Recharger et Aperçu automatique dans le menu Conception, puis fermer l'éditeur intégré afin d'utiliser plutôt son éditeur de texte préféré.

Créer des volumes

Comme expliqué dans le cheat sheet, une certain nombre de primitve 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.

Les principales primitives sont les suivantes :

sphere(radius | d=diameter)

qui permet de dessiner des sphères.

cube([width,depth,height], center)

qui permet de dessiner non seulement des cubes, mais aussi des parallélépipèdes rectangles d'une façon générales.

cylinder(h,r1|d1,r2|d2,center)

qui permet de dessiner non seulement des cylindres, mais également des cônes ou tronc de cônes.

Voici un exemple à copier-coller pour avoir un aperçu rapide des possibilités :

/* On définit une sphère par son rayon */
sphere(r = 42);
/* On définit une sphère par son diamètre */
translate([100, 0, 0]) sphere(d = 42);
 
/* On définit un cube régulier de coté trente */
translate([0, 100, 0]) cube(30);
/* On définit une cube avec des dimensions differentes suivant les axes, centrée sur l´origine */
translate([100, 100, 0]) cube([10, 20, 30], center = true);
 
/* Les cylindre sont définit par leur hauteur et par leur largeur */
translate([0, 200, 0]) cylinder(h = 42, r = 12);
/* Le largeur peut être différente aux deux extrémités. La hauteur peut être centrée */
translate([100, 200, 0]) cylinder(h = 42, r1 = 12, d2 = 42, center = true);

Primitives 2D

Les principales primitives 2D sont les suivantes :

circle(radius | d=diameter)

permet de dessiner des cercles.

square([width,height],center)

permet de dessiner non seulement des carrés, mais plus généralement des rectangles.

text(text, size, font,
     halign, valign, spacing,
     direction, language, script)

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 :

linear_extrude(height,center,convexity,twist,slices,scale)
rotate_extrude(angle,convexity)

Voici un exemple à copier-coller pour avoir un aperçu de ce qu'il est possible d'en faire :

// 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");
}

Transformations

Transformations de base

Les transformations les plus couramment utilisées sont les suivantes :

translate([x,y,z])

pour effectuer une translation.

rotate([x,y,z])

pour effectuer une rotation.

scale([x,y,z])

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 :

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

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 la première section :

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

Cette fonction est très pratique pour concevoir rapidement des objets de type boîtier.

La fonction Minkowski

Cette fonction applique une 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).

// $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);
}

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 parfois démesurément. 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

OpenSCAD dispose des trois opérations géométriques booléennes :

union()
difference()
intersection()

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.

// Intersection avec un cylindre à 6 facette, pour créer une tête hexagonales.
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);
}

Boucles

Il est possible de définir des boucles for afin de parcourir des espaces de valeurs.

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

Les boucles se prêtent bien aux jeux trigonométriques :

$fn = 3;
 
// 12960 ensembles de cylindre 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);
        }
    }
}

Concepts importants

Manifold/watertigh

Visualisation/Rendering

Exports

logiciel/openscad.1510842065.txt.gz · Dernière modification : 2022/09/04 21:45 (modification externe)