timer intervals maya mel

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.