{{backlinks>.}} ====== Python pour l'architecture ====== * En quoi Python peut-il nous servir dans le contexte de la conception architecturale ? * Voici, à titre d'exemple [[https://rvba.fr/my.html|personnel]], un des tout [[https://blenderartists.org/t/dupliframes-shape-keys-solved/352753|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 à [[wpfr>Courbevoie]] pour l'agence [[https://www.lemoniteur.fr/article/plan-01-paris.1919224|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. {{:python:courbevoie.jpg}} Il s'agissait de créer un [[wpfr>Art cinétique|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:start|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 » {{https://blenderartists.org/user_avatar/blenderartists.org/gabio/288/820_2.png?30}} et ce [[https://blenderartists.org/t/dupliframes-shape-keys-solved/352753|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)