{{backlinks>.}} ====== Cube ====== * Créer un [[icn>blender:texte#nouveau_fichier|nouveau fichier texte]] nommé ''volumes.py'' * Ajouter l'[[python:pygram:carre#le_module_d'importation|importation de module]] import bpy Pygram = bpy.data.texts["pygram.py"].as_module() et Pygram.cleanup() * Nous allons créer une fonction ''cube(w)'' pour générer des cubes de toutes dimensions. * Mais au lieu d'utiliser la fonction ''face()'' des Objets Pygram, * nous allons commencer par **créer une fonction d'extrusion** (comme celle de Blender). ===== Ligne ===== * Découvrir les objets [[icn>python:pygram:point|Point]] et les objets [[icn>python:pygram:ligne|Ligne]]. * **Dans les premières lignes de notre fichier,** * Commençons par créer deux points (a et b), une ligne (l) et un vecteur (v) et **4 variables** ''a,b,l,v'' : * Créer un [[icn>python:pygram:point|point]] ''a'' aux coordonnées ''(0,0,0)'' * Créer un point ''b'' aux coordonnées ''(10,0,0)'' * Créer une [[icn>python:pygram:ligne|ligne]] ''l'' avec ''a'' et ''b'' * Créer un [[icn>python:pygram:point#vecteur|Vecteur]] ''v'' : ''(0,10,0)'' de 10 unités en ''Y'' * Maintenant, vérifions que nous pouvons «\ extruder\ » un point à l'aide d'un vecteur\ : * Créer un point ''m'' à partir du point ''a'' de la ligne ''l'' en le [[icn>python:pygram:point#deplacer|déplaçant]] à l'aide du vecteur ''v''\ : m = l.a.move(v) * Noter que la fonction ''move()'' créer une copie du point déplacé. * Afficher les coordonnées du point ''m'' grace à la fonction ''print()'' de l'objet ''Point()'' : print(m) et vérifier ses coordonnées dans la console. * Nous voyons bien que nous pouvions créer l'équivalent du point ''b'' en déplaçant le point ''a'' avec le vecteur ''v'' ===== Extrusion ===== * Maintenant, nous allons **écrire une fonction** qui extrude une ligne et produit une face, comme le fait Blender. * Écrire une fonction **''extrude(l,v)''** prenant **2 arguments** : une ligne ''l'' et un vecteur ''v'' * Dans la fonction ''extrude()'' créons des variables pour stocker les points ''a'' et ''b'' de la ligne ''l'' a = l.a b = l.b * Puis créer **2 nouveaux points** ''c'' et ''d'' en déplaçant les points ''a'' et ''b'' de la ligne. * Le point ''a'' est déplacé en un point **''d''** * Le point ''b'' est déplacé en un point **''c''** * Créer un objet Pygram et utiliser les points ''a'' et ''b'' de la ligne ''l'' et les points ''c'' et ''d'' pour créer une face à l'aide de la fonction ''face()'' * :!: Attention, il faut bien respecter les relations des points (a=>d,b=>c) et l'ordre des points dans la fonction ''face(a,b,c,d)''. * Pour terminer, ajouter dans la fonction ''extrude()'' l'appel de construction ''obj.build()'' * Et «\ renvoyer\ » l'objet créé (''return obj'') * Ajouter une nouvelle variable ''f = extrude(l,v)'' pour tester la fonction {{:python:pygram:cube_1.png|}} * Maintenant, changer et tester les valeurs de ''v'' : ''(0,0,10)'' {{:python:pygram:cube_2.png|}} * Et avec ''v'' : ''(0,10,10)'' {{:python:pygram:cube_3.png|}} ===== Cube ===== * Créons maintenant la fonction ''cube(f,v)'' prenant **2 arguments** : ''f'' une face et ''v'' un vecteur * Il s'agit donc d'«\ extruder\ » un cube à partir d'une face comme le fait Blender. * Nous avons déjà la variable ''f'' que nous avons créée avec la fonction ''extrude()'' * Ajoutons une nouvelle variable pour l'extrusion du cube\ : j = Pygram.Vector(0,0,10) * Ensuite commençons à écrire notre fonction ''cube()'' * La première chose que nous allons faire, c'est de «\ récupérer\ » la face que nous avons créée dans l'Objet Pygram. Car la variable ''obj'' que nous avons retournée de notre fonction ''extrude()'', c'est un Objet. Ce n'est pas une Face ni un Point ni un Vecteur * Les Faces sont stockées dans les Objets Pygram dans une [[icn>python:liste|Liste]]. * Les éléments des listes sont numérotés [[icn>python:liste#acceder|à partir de zéro]] * Pour accéder aux Faces de notre Objet, nous avons une fonction ''get_face(n)'' * Donc ici, nous allons ajouter au début de notre fonction ''cube()'' cette ligne\ : def cube(f,v): face = f.get_face(0) * Vérifions dans la console que les données correspondent à ce que nous avons en tête\ : def cube(f,v): face = f.get_face(0) print(face) * Puis nous ajoutons un nouvel objet avec lequel nous allons «\ extruder\ » notre face obj = Pygram.Object() * À présent, nous allons créer les faces du cube en déplaçant avec ''move()'' les 4 points de la face. * Nous pouvons commencer par déplacer, à la verticale, le point ''a1'' ainsi\ : a1 = face.a.move(j) * Rappelons-nous que ''v'' sera égale à ''j'' quand nous aurons fini d'écrire la fonction et que nous l'appellerons avec les variables précédemment créées (l'Objet ''f'' et le Vecteur ''j'') * Continuons par créer les 3 autres points à la verticale de ''b'',''c'' et ''d'' que nous nommons ''b1'',''c1'' et ''d1''. * Ensuite ajoutons une première face avec la fonction ''face()'' de notre Objet ''obj'' et pour commencer, avec les point ''c'',''d'',''d1'' et ''c1'' * Ajoutons ensuite la fonction ''obj.build()'' * Puis sur une nouvelle ligne, testons notre fonction cube(f,j) {{:python:pygram:cube_4.png}} * Notez bien la manière de fabriquer les faces\ : **dans le sens inverse des aiguilles d'une montre** : {{:python:pygram:face.png}} * Si, par exemple vous inversez\ : * ''obj.face(c,d,c1,d1)'' * au lieu de * ''obj.face(c,d,d1,c1)'' * Voici le résultat\ : {{:python:pygram:cube_5.png}} * Pour terminer, ajoutez, une par une, les autres faces et testez votre fonction à chaque étape {{:python:pygram:cube_6.png}} * Ajoutons uniquement **5 faces** au cube car nous n'aurons pas besoin de la face au sol * Pour terminer ajoutons, avant la fonction ''build()'' le nom de l'objet\ : obj.name = "cube" {{:python:pygram:cube_7.png|}} 😅