python:pygram:maison

Maison

  • Nous allons maintenant commencer à créer des petits objets « architecturaux ».
  • Commençons par une magnifique petite maison de style 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 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 :

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()

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 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 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.

  • Puis nous ajoutons le deuxième pan.

  • 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.
  • 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à :)