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Ă  :)