python:conception

Python pour l'architecture

  • En quoi Python peut-il nous servir dans le contexte de la conception architecturale ?
  • Voici, à titre d'exemple personnel, un des tout premiers scripts Python dans ma pratique d'architecte.

En 2006, je participais au concours de réhabilitation d'un ancien site olympique en salle de spectacle à Courbevoie pour l'agence Plan01. Afin d'unifier spatialement un ensemble somme toute assez hétéroclite de bâtiments neufs et anciens, il fut décidé d'envelopper l'ensemble de ces éléments d'une « peau » constituée d'éléments verticaux à claire-voie.

courbevoie.jpg

Il s'agissait de créer un dispositif cinétique sous la forme d'une paroi composée de lames verticales à sections variables. Chaque lame étant unique, il fallait donc pouvoir trouver une façon de « programmer » cette variation. En 2006, avant l'apparition de Grasshopper, les outils d'animation permettaient d'obtenir de tels résultats. On pouvait faire varier dans le temps une forme, ici le profil d'une lame verticale, puis venir « figer » dans un « temps unique » l'ensemble de ces variations temporelles afin d'obtenir l'effet cinétique recherché.

Blender disposait bien des fonctionnalités d'animation permettant de faire varier dans le temps la forme d'un objet, mais à l'époque de ce concours en 2006, le logiciel ne disposait pas d'une fonctionnalité permettant de « figer dans le temps » cette variation. N'ayant pas de solution technique pour produire la forme recherchée, j'ai donc fait appel à la « communauté Blender », et c'est grâce à « Gabio » et ce premier script Python que j'ai pu disposer de cette nouvelle fonctionnalité avec laquelle j'ai donc pu « modéliser » avec du « code » cette forme architecturale.

Voici le script :

#!BPY
 
#This file is better viewed with a tabspace of 2.
 
""" Registration info for Blender menus:
Name: 'True Dupliframe'
Blender: 241
Group: 'Object'
Tooltip: 'Apply dupliframe with all modif'
"""
__author__ = "Gabriel Beloin (Gabio)"
__url__ = ("blender", "elysiun")
__version__ = "alpha1"
__bpydoc__ = """\
"""
 
#History:
#
 
import Blender
from Blender import Draw,BGL,Object,Scene,NMesh
from Blender.Draw import *
from Blender.BGL import *
from Blender.NMesh import *
 
#-------------------------Init functions-------------------------
def init_dict():
   dict = {}
   dict["start"]   =   0
   dict["stop"]   =   100
   dict["skip"]   =   0
 
   return(dict)
 
#-------------------------Global var.-----------------------
#*******Variable
G = init_dict() #Master dict containing all data
 
#*******Event
NULL               = 0
QUIT               =   1
GO                  =   2
 
#*******UI button var
num_start = Create(G["start"])
num_stop    = Create(G["stop"])
num_skip    = Create(G["skip"])
 
#-------------------------UI-------------------------
 
def draw():
 
   global num_start, num_stop, num_skip
 
   glClear(GL_COLOR_BUFFER_BIT)
   glRasterPos2d(10,10)
   Text("Dupliframe")
 
   num_start   =   Number("start:",NULL,20,20,100,20,num_start.val,1,num_stop.val,"The starting frame")
   num_stop   =   Number("stop:",NULL,20,40,100,20,num_stop.val,num_start.val,30000,"The end frame")
   num_skip   =   Number("skip:",NULL,20,60,100,20,num_skip.val,0,100,"how many frame to skip between duplication")
   Button("Quit",QUIT,20,80,40,20,"Quit")
   Button("Do it",GO,70,80,40,20,"Quit")
 
 
#-------------------------Event-------------------------
 
def event(evt,val):
 
   if (evt == QKEY and not val):
      Exit()
 
def bevent(evt):
   global G
 
   if evt == QUIT:
      Exit()
   elif evt == NULL:
      G["start"] = num_start.val
      G["stop"] = num_stop.val
      G["skip"] = num_skip.val
   elif evt == GO:
      dupli()
 
#------------------------Action-------------------------
 
def dupli():
   obl = Object.GetSelected()
   if not obl[0].getType() == "Mesh":
      PupMenu("Select a Mesh")
   else:
      obj = obl[0]
      name =obl[0].name
      Blender.Set("curframe",G["start"])
      x = G["start"]
      while x <= G["stop"]:
         mesh = GetRawFromObject(name)
         obn = PutRaw(mesh)
         obn.setMatrix(obj.getMatrix())
         x = x+G["skip"]+1
         Blender.Set("curframe",x)
 
Register(draw,event,bevent)