Maison
Module
import bpy
Pygram = bpy.data.texts["pygram.py"].as_module()
Volumes = bpy.data.texts["volumes.py"].as_module()
Pygram.cleanup()
Test
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 !
📢 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")
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()
…
Toit
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
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 :
# Line 1
line_1 = Pygram.Line(a1,b1)
center_1 = line_1.center()
p1 = center_1.move(v) # move vertically
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.
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
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.
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à :)