Pythonlópes - El Python que yo sé

Parte V: Scripts que funcionan solos

El petróleo es como una vaca grande y gorda que todos la quieren ordeñar, y como no hay vaca para todos, el que coge una teta ya no la suelta, y lo que quiere es trincar la otra.que todos quieren ordeñar

Paco Martínez Soria
(genio)

Eventos dentro de blender
Hasta ahora hemos trabajado con programas que el usuario debe ejecutar poniendo el cursor sobre el listado y pulsando Alt+P. Existe la posibilidad de hacer scripts que se ejecuten siempre y sólo cuando, pase algo. Esto es, cuando sucedan eventos de Blender. En particular, estos eventos suceden (de momento, pues podrían ampliarse en un futuro) cuando:
  • Se abre el programa Blender (evento OnLoad)
  • Se redibuja el interface (evento Redraw)
  • Cambia el frame de la animación (evento FrameChanged)
Estos scripts irán asociados impepinablemente a una clase de objeto, que puede ser:
  • Una escena: es la única clase sobre la que actúa el evento OnLoad.
  • Un objeto3D: los scripts más usados. Actúan sobre un objeto (posición, orientación...), y a partir de ahí podemos acceder (si no es un empty) a su bloque de datos (malla, curva, cámara, metapelota...)
  • Un bloque de datos: accedemos directamente al bloque de datos del objeto activo (rosa claro). En el caso de objetos3d, accedemos a su material.
  • Un "world": accedemos directamente al bloque de datos world de la escena.
El usuario debe enganchar (bueeeno, "linkar") el objeto al script en esta ventana:
seleccionando qué evento debe suceder para que se ejecute, y escribiendo el nombre del script en el cuadro de texto. Por eso estos scripts suelen proporcionarse en un fichero .blend y una escena de ejemplo, o bien indicado en la cabecera del programa.
Hay que tener en cuenta un par de notas:
  • No tiene mucho sentido programar un script con interface gráfico (capítulo IV) para que se ejecute en cada frame (en otras palabras: NO FUNCIONARÁ).
  • Tampoco funcionan de momento los scripts gráficos enganchados con evento OnLoad. Hay que ejecutarlos a mano con Alt+P.
  • Los scripts que se ejecutan en eventos Redraw no deberían ser muy complicados, ya que se realizan en tiempo real cada vez que, por ejemplo, movemos algo.
  • Cuando queramos probar un cambio en un script, a veces es conveniente ejecutarlo primero con Alt+P. Aunque nos va a dar un error, es la forma habitual de hacer que Blender asuma el cambio.
  • ¡No usar nunca las órdenes Redraw() en un script linkado bajo el evento Redraw! ¿Quién adivina por qué? (risas)

2. Allá vamos

Para acceder desde un script al objeto linkado basta con llamarlo con el método link:
import Blender

o=Blender.link
print "El objeto enganchado se llama %s" % o.getName()

Veamos un ejemplo para obtener información en cada render de una animación. Hay que enganchar este script a la escena, bajo evento FrameChanged. Para ejecutarlo podemos cambiar de frame a mano, animar con Alt+A o renderizar la animación. Sólo hay que ponerse la consola y disfrutar...

import Blender

sc=Blender.link
sets=(sc.getName(),sc.currentFrame(),sc.endFrame())
print "Escena %s - Frame %i/%i" % sets


Para terminar, un interesante script que sitúa en todo momento a un objeto linkado a él, en la posición del cursor3D. Sólo tenemos que pinchar sobre la ventana 3D ¡y el objeto se irá allí! Por supuesto, hay que enganchar el script al objeto bajo el evento Redraw. Podemos notar que sólo se redibujará cuando saquemos la flecha de la ventana. Esto es porque no podemos usar la orden Redraw() (ver nota de más arriba).

import Blender

curs=Blender.Window.GetCursorPos()
ob=Blender.link

ob.setLocation(curs)


3. ¿Ya está?
Pues sí, ya está. Qué esperabas. Ahora te toca aprender algo de Python y darte cuenta de lo divertida que puede ser la ventana de texto (sigggh...)
V.13,1,4 - © 2003 Carlos López
Escríbeme y dime algo... ¡tú puedes hacerlo!
Gracias a todos los reporteros de fallos que hacen que esto se vaya corrigiendo ;-)