timer - Cómo ejecutar un procedimiento Maya MEL a intervalos regulares
intervals (2)
En general, no. Sin embargo, en Python pude crear algo que funciona bastante bien:
import time
def createTimer(seconds, function, *args, **kwargs):
def isItTime():
now = time.time()
if now - isItTime.then > seconds:
isItTime.then = now # swap the order of these two lines ...
function(*args, **kwargs) # ... to wait before restarting timer
isItTime.then = time.time() # set this to zero if you want it to fire once immediately
cmds.scriptJob(event=("idle", isItTime))
def timed_function():
print "Hello Laurent Crivello"
createTimer(3, timed_function) # any additional arguments are passed to the function every x seconds
No sé cuál es la sobrecarga, pero de todos modos funciona de manera inactiva, así que probablemente no sea un gran problema.
La mayoría de esto se puede hacer en Mel (pero, como siempre, no tan elegantemente ...). El mayor obstáculo es ganar tiempo. En Mel, tendrías que analizar una llamada de system time
.
Editar: Manteniendo este Python, puedes llamar a tu código Mel desde python timed_function()
Me gustaría que se ejecutara uno de mis procedimientos Maya MEL cada x segundos. Hay alguna forma de hacer eso ?
La configuración de mel sería
scriptJob -e "idle" "yourScriptHere()";
Sin embargo, es difícil obtener el tiempo en segundos de Mel - system ("time / t") que le dará tiempo al minuto pero no al segundo en Windows. En el sistema Unix ("date + /"% H:% M:% S / "") obtendría horas, minutos y segundos.
El principal inconveniente de scriptJob aquí es que los eventos inactivos no se procesarán cuando el usuario o un script estén en funcionamiento: si la GUI o un script hace algo largo, no se generarán eventos activados durante ese período.
Puedes hacer esto en Python con hilos también:
import threading
import time
import maya.utils as utils
def example(interval, ):
global run_timer = True
def your_function_goes_here():
print "hello"
while run_timer:
time.sleep(interval)
utils.executeDeferred(your_function_goes_here)
# always use executeDeferred or evalDeferredInMainThreadWithResult if you''re running a thread in Maya!
t = threading.Thread(None, target = example, args = (1,) )
t.start()
Los hilos son mucho más potentes y flexibles, y un gran dolor en el trasero. También sufren la misma limitación que el evento scriptJob inactivo; si Maya está ocupada, no dispararán.