{{backlinks>.}}
====== Maison ======
* Nous allons maintenant commencer à créer des petits objets «\ architecturaux\ ».
* Commençons par une magnifique petite maison de style [[wp>Monopoly_(game)|Monopoly]]\ !
* Créons un nouveau fichier texte ''architectures.py''
* 💡 En cas de blocage sur ce projet, essayer la [[#Maison alternative]]
===== Module =====
* Nous allons nous servir de notre fonction [[python:pygram:cube|Cube]] qui se trouve dans le fichier ''volumes.py''
* Pour cela, ajoutons une nouvelle ligne pour charger ce fichier en tant que ''Volumes''
import bpy
Pygram = bpy.data.texts["pygram.py"].as_module()
Volumes = bpy.data.texts["volumes.py"].as_module()
Pygram.cleanup()
===== Test =====
* Faisons un petit test\ :
{{:python:pygram:castel_1.png|}}
import bpy
Pygram = bpy.data.texts["pygram.py"].as_module()
Volumes = bpy.data.texts["volumes.py"].as_module()
Pygram.cleanup()
a = Pygram.Point(0,0,0)
b = Pygram.Point(10,0,0)
l = Pygram.Line(a,b)
v = Pygram.Vector(0,10,0)
j = Pygram.Vector(0,0,10)
f = Volumes.extrude(l,v)
c = Volumes.cube(f,j)
print(c)
* Parfait\ !
* Ah oui mais le ''%%print(c)%%'' «\ renvoie\ » ''None'' dans la console.
* Mais oui, notre fonction ''cube()'' dans ''volumes.py'' ne renvoie rien,
* … None\ !
* Corrigeons cela\ :
* **Ouvrir ''volumes.py'' et ajouter l'opérateur de renvoi ''return obj'' dans la fonction ''cube()''**
* Et maintenant\ :
📢 Object: cube
📢 Face: a 📢 Point:(0,0,0) b 📢 Point:(10,0,0) c 📢 Point:(10.0,10.0,0.0) d 📢 Point:(0.0,10.0,0.0)
📢 Face: a 📢 Point:(10.0,10.0,0.0) b 📢 Point:(0.0,10.0,0.0) c 📢 Point:(0.0,10.0,10.0) d 📢 Point:(10.0,10.0,10.0)
📢 Face: a 📢 Point:(10,0,0) b 📢 Point:(10.0,10.0,0.0) c 📢 Point:(10.0,10.0,10.0) d 📢 Point:(10.0,0.0,10.0)
📢 Face: a 📢 Point:(0,0,0) b 📢 Point:(0.0,10.0,0.0) c 📢 Point:(0.0,10.0,10.0) d 📢 Point:(0.0,0.0,10.0)
📢 Face: a 📢 Point:(0,0,0) b 📢 Point:(10,0,0) c 📢 Point:(10.0,0.0,10.0) d 📢 Point:(0.0,0.0,10.0)
===== Fonction =====
* Regroupons les variables qui permettent de générer un cube dans une nouvelle fonction que nous appelons ''house(x,y,z)'' qui prendra **3 arguments** nous permettant de positionner cette «\ maison\ » dans l'espace.
* Utiliser la fonction ''rename()'' pour renommer l'objet en ''house''
def house(x,y,z):
a = Pygram.Point(0,0,0)
b = Pygram.Point(10,0,0)
l = Pygram.Line(a,b)
v = Pygram.Vector(0,10,0)
j = Pygram.Vector(0,0,10)
f = Volumes.extrude(l,v)
c = Volumes.cube(f,j)
c.rename("house")
* Vérifions que nous obtenons toujours notre cube
house(0,0,0)
* À présent\ :
* **Changer** les valeurs des variables présentes dans la fonction ''house()'' pour produire un cube aux dimensions suivantes\ : 5m x 5m en plan et 2.5m de hauteur
* **Renommer** la variable ''j'' en ''h'' pour plus de lisibilité (h pour //height//)
* Évidemment, il faut aussi renommer ''j'' en ''h'' dans l'appel de la fonction ''cube()'' …
{{:python:pygram:house_1.png|}}
===== Toit =====
* Nous allons maintenant progressivement **modifier** la fonction ''cube()'' pour y ajouter un toit.
* Commençons par **copier/coller la fonction** ''cube()'' dans notre fichier ''architectures.py''
import bpy
Pygram = bpy.data.texts["pygram.py"].as_module()
Volumes = bpy.data.texts["volumes.py"].as_module()
Pygram.cleanup()
def cube(f,v):
...
def house(x,y,z):
a = Pygram.Point(0,0,0)
b = Pygram.Point(5,0,0)
l = Pygram.Line(a,b)
v = Pygram.Vector(0,5,0)
h = Pygram.Vector(0,0,2.5)
f = Volumes.extrude(l,v)
c = cube(f,h)
c.rename("house")
house(0,0,0)
* Maintenant, il s'agit de modifier la fonction ''cube()'' pour y ajouter les **4 nouvelles faces** du toit.
* Pour construire les deux pans inclinés et les deux [[wpfr>Pignon (architecture)|pignons]], il nous faut trouver le centre du segment (a1,b1) qui correspond à la ligne supérieure du cube, et nous aurons également besoin de (c1,d1).
* Pour ce faire, nous allons utiliser la fonction ''center()'' de l'objet ''Line''
* Dans notre fonction ''cube()'' nous avons commencer par créer les points ''a1'', ''b1'', ... en créant des copies par déplacement des point ''a'', ''b''. Voici la démarche pour créer les points de construction de la toiture à l'aide de ces points\ :
* Créer une ligne ''line_1'' à l'aide des points ''a1'' et ''b1''
* Puis trouver le point au milieu de la ligne avec la fonction ''center()''
* Enfin, créer le point de la ligne de [[wpfr>faîtage]] en utilisant la fonction ''move()'' de l'objet Point\ :
# Line 1
line_1 = Pygram.Line(a1,b1)
center_1 = line_1.center()
p1 = center_1.move(v) # move vertically
* Il y a de grandes chances que vous fassiez des erreurs…
* Il faut afficher certaines informations pour vérifier les coordonnées\ :
print("This is my Line #1")
print(line_1)
* Réaliser la même opération sur l'autre façade à partir des points (c1,d1) pour créer une ligne ''line_2'' et un point ''p2''
* Ensuite il s'agit de créer un premier pan incliné à partir des points que nous venons de créer avec la fonction ''face()'' de l'objet Pygram.
{{:python:pygram:house_2.png}}
* Puis nous ajoutons le deuxième pan.
{{:python:pygram:house_3.png}}
* Dernière étape\ : ajouter les pignons
* Ici, il s'agit d'ajouter des faces triangulaires
* Utiliser la fonction ''tri(a,b,c)'' de l'objet Pygram
{{:python:pygram:house_4.png}}
* Et voilà\ !
* Pour terminer, nous pouvons créer trois petites maisons en modifiant la fonction ''house(x,y,z)'':
* Ajouter une variable ''w'' pour la largeur de la maison qui correspond à la longeur de la Ligne ''l'', et modifier la création des points ''a'' et ''b'' pour qu'ils prennent en compte les coordonnées ''x,y,z'' de la fonction.
* Ajoutons maintenant les trois appels de fonction ''house()'' aux trois coordonnées ''(0,0,0)'', ''(5,0,0)'' et ''(10,0,0)''.
* Pour terminer, renommer la fonction ''cube()'' en ''house_volume()''
* 👏
====== Maison alternative ======
* Cet exercice comporte un certain nombre de difficultés.
* En cas de blocage, il est bon de prendre un chemin détourné.
* Il s'agit d'essayer de faire les mêmes choses, mais plus simplement.
* 1) **Ne pas utiliser les fonctions importées du fichier ''volumes.py''**
* Il peut devenir compliqué de travailler avec des données dispersées dans deux fichiers
* Alors, faire un copier/coller des données et/ou des fonctions du fichiers ''volumes.py'' vers le fichier ''architectures.py'', ou « recoder » les données et/ou les fonctions directement dans le fichier ''architectures.py'' (c'est encore mieux, car vous pouvez mieux corriger vos erreurs).
* 2) **Ne pas repartir de la fonction ''cube()''**
* Il est parfois (souvent) plus clair de repartir à zéro.
* Commencer par écrire une fonction ''roof()'' qui génère les deux pans inclinés du toit.
* Puis ajouter les deux pignons (avec la fonction ''tri()'' au lieu de ''face()'', voir plus haut)
* Enfin, terminer par le corps du volume, c'est la partie identique à celle de la fonction ''cube()''
* 3) Pour terminer, renommer ''roof()'' en ''house()''
* 4) Votre fonction est maintenant identique à la maison « non-alternative », telle qu'elle est décrite plus haut. Pour terminer, il faut donc générer 3 petites maisons comme l'exercice le demande. Relire l'énoncé depuis le début, si nécessaire.
* Et voilà :)