« Presentation openscad : Etape 5 » : différence entre les versions

De Wiki du ThiLab
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 53 : Ligne 53 :
translate([-15,-15,-45]) tower_base();
translate([-15,-15,-45]) tower_base();
</source>
</source>
Un module peut egalement prendre des parametres. Il suffit des les lister lors de la definition du module et de les renseigner lors de son utilisation comme un objet de base. Par example le code suivant :
<source lang="c" enclose="div">
module  tower_base(l, L)
{
      polyhedron(points=[[0,0,20],[0,l,20],[l,l,20],[l,0,20], [L-50,L-50,0],[L-50,L,0],[L,L,0],[L,L-50,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}
translate([-15,-15,-15]) tower_base(10,40);
translate([-15,-15,-45]) tower_base(30,20);
</source>
donnera des polyedres differents car les parametres renseignes sont differents :
[[Fichier:Oscc etape5b.png|200x200px|vignette|centre]]
Les modules deviennent interessant lors d'un travail collaboratif. Chacun peut travailler sur son propre module et les modules seront ensuite rassembles en un unique objet. Si un changement est effectue dans un module, il est automatiquement transmis a chaque instance de ce module.<br />
Un module peut egalement servir dans plusieurs objets, comme par example, la definition d'une vis, d'un ecrou ou d'une roue dentee. C'est pourquoi openscad permet d'utiliser les modules d'un fichier dans un autre fichier par l'intermediaire du mot clef <code>use</code>.
Pour illustrer cette fonctionnalite, sauvez le code suivant :
<source lang="c" enclose="div">
module  tower_base()
{
      polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}
tower_base();
</source>
dans un fichier nomme <code>openscad_course_tower.scad</code>. Vous pouvez maintenant utiliser le module grace a ce code :
<source lang="c" enclose="div">
use <openscad_course_tower.scad>
translate([-15,-15,-45]) tower_base();
</source>
Openscad ira de lui meme chercher la definition du module dans le fichier <code>tower_base</code> dans le fichier <code>openscad_course_tower.scad</code>. Notez qu'il n'ira chercher que la definition du module et non l'objet. Si vous voulez egalement recuperer l'objet definit dans le fichier <code>openscad_course_tower.scad</code>, il faudra remplacer le mot clef <code>use</code> par le mot clef <code>include</code>. Ceci donnera cette previsualisation :
[[Fichier:Oscc etape5c.png|200x200px|vignette|centre]]
qui correspond aux 2 objets definis. Le premier objet en haut correspond a l'objet <code>tower_base()</code> du fichier <code>openscad_course_tower.scad</code>, alors que le deuxieme en dessous correspond a l'objet deplace : <code>translate([-15,-15,-45]) tower_base()</code>.


== Resultat de l'etape 5 ==
== Resultat de l'etape 5 ==

Version du 22 août 2014 à 21:52

Retour a la presentation

Etape 5 : les modules et les bibliotheques

Pour cette etape, nous allons garder les memes elements mais ameliorer la lisibilite du code.

Pour commencer, nous allons utiliser un module. Un module est un objet definit par l'utilisateur dont il pourra se resservir sans avoir a retaper le code complet.

Reprenons l'exemple du polyedre :

translate([-15,-15,-45]) polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);

Supposons que nous voulions construire un objet avec 2 de ces polyedres. En utilisant les informations apprises jusqu'a cette etape, nous devons taper le code suivant :

translate([-15,-15,-15]) polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
translate([-15,-15,-45]) polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);

Ce qui donnera les 2 polyedres comme attendu :

Nous voyons que beaucoup de code est repete de facon inutile. Creons donc un module pour cet objet. Le module permettra egalement de nomer l'objet afin de mieux le reutiliser plus tard. Pour creer un module, openscad possede le mot clef module dont il faut faire suivre le nom du module, puis entre accolades, l'objet composant ce module :

module  tower_base()
{
      polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}

Si nous essayons de compiler ce code, il ne donnera aucun objet. En effet le module sert a definir l'objet et non a l'utiliser. Pour l'utiliser, il faut le specifier dans le code, comme tout objet de base :

tower_base();

Le code pour les 2 polyedres s'ecrira donc :

module  tower_base()
{
      polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}

translate([-15,-15,-15]) tower_base();
translate([-15,-15,-45]) tower_base();

Un module peut egalement prendre des parametres. Il suffit des les lister lors de la definition du module et de les renseigner lors de son utilisation comme un objet de base. Par example le code suivant :

module  tower_base(l, L)
{
      polyhedron(points=[[0,0,20],[0,l,20],[l,l,20],[l,0,20], [L-50,L-50,0],[L-50,L,0],[L,L,0],[L,L-50,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}

translate([-15,-15,-15]) tower_base(10,40);
translate([-15,-15,-45]) tower_base(30,20);

donnera des polyedres differents car les parametres renseignes sont differents :

Les modules deviennent interessant lors d'un travail collaboratif. Chacun peut travailler sur son propre module et les modules seront ensuite rassembles en un unique objet. Si un changement est effectue dans un module, il est automatiquement transmis a chaque instance de ce module.

Un module peut egalement servir dans plusieurs objets, comme par example, la definition d'une vis, d'un ecrou ou d'une roue dentee. C'est pourquoi openscad permet d'utiliser les modules d'un fichier dans un autre fichier par l'intermediaire du mot clef use.

Pour illustrer cette fonctionnalite, sauvez le code suivant :

module  tower_base()
{
      polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}

tower_base();

dans un fichier nomme openscad_course_tower.scad. Vous pouvez maintenant utiliser le module grace a ce code :

use <openscad_course_tower.scad>

translate([-15,-15,-45]) tower_base();

Openscad ira de lui meme chercher la definition du module dans le fichier tower_base dans le fichier openscad_course_tower.scad. Notez qu'il n'ira chercher que la definition du module et non l'objet. Si vous voulez egalement recuperer l'objet definit dans le fichier openscad_course_tower.scad, il faudra remplacer le mot clef use par le mot clef include. Ceci donnera cette previsualisation :

qui correspond aux 2 objets definis. Le premier objet en haut correspond a l'objet tower_base() du fichier openscad_course_tower.scad, alors que le deuxieme en dessous correspond a l'objet deplace : translate([-15,-15,-45]) tower_base().

Resultat de l'etape 5

Le code apres l'etape 5 est donc le suivant :

use <openscad_course_tower.scad>

$fn=60;


union()
{
	intersection()
	{
		translate([-10,-10,-10]) cube([20,20,20]);
		sphere(r=12);
	}

	cylinder(r=7.5, h=20);

	minkowski()
	{
		translate([-10,-10,-25]) cube([20,20,20]);
		cylinder(r=2,h=1);
	}

	translate([-15,-15,-45]) tower_base();
}

Un nouveau fichier appele openscad_course_tower.scad contient le code suivant :

module tower_base()
{
	polyhedron(points=[[0,0,20],[0,30,20],[30,30,20],[30,0,20], [-10,-10,0],[-10,40,0],[40,40,0],[40,-10,0]], triangles=[[0,1,2],[2,3,0], [1,0,4], [4,5,1], [5,6,1],[1,6,2],[2,6,7],[2,7,3],[3,7,4], [4,0,3], [4,6,5],[6,4,7]]);
}

tower_base();

Ce qui nous donne cet objet :

Retour a la presentation