2014-01-16 3 views

ответ

1

В общем, нет. Однако в Python я был в состоянии создать что-то, что работает очень хорошо:

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 

Я не знаю, что накладные расходы, но он работает только на холостом ходу в любом случае, так что это, вероятно, не имеет большого значения.

Большая часть этого может быть выполнена в Мел (но, как обычно, не так элегантно ...). Самое большое препятствие - это время. В Меле вам придется разобрать звонок system time.

Edit: Имея это Python, вы можете вызвать ваш код Мел внутри питона timed_function()

2

Установка Mel будет

scriptJob -e "idle" "yourScriptHere()"; 

Однако это трудно, чтобы получить время в секундах от Мел-система («время/т») даст вам время на минуту, но не второе на окнах. В системе Unix («дата + \»% H:% M:% S \ "") вы получите часы, минуты и секунды.

Основным недостатком scriptJob является то, что незанятые события не будут обрабатываться, когда пользователь или сценарий будет работать - если либо графический интерфейс, либо скрипт что-то долго не будет вызывать в течение этого периода события.

Вы можете сделать это в Python с потоками, а также:

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() 

Нити гораздо более мощным и гибким - и большая боль в приклад. Они также страдают от того же ограничения, что и случайное событие scriptJob; если Майя занята, они не будут стрелять.

+0

Вы уверены, что функция Python не будет аннулировать майю, пока она не вернется полностью? Кроме того, я бы вообще не рекомендовал 'idleEvent' * *. [Doc] (http://download.autodesk.com/global/docs/maya2013/en_us/Commands/scriptJob.html) правильно говорит. * Используйте idleEvents с осторожностью. * У этого есть плохие побочные эффекты, из которых один из них является пустой редактор атрибутов, чистый сланец! Вы попадаете в ногу, используя его. Хотя вы предлагаете «простоя», я не уверен, что все иначе. –

+0

Пользовательский интерфейс Maya работает на одном потоке, поэтому его всегда будет блокировать код, который работает в потоке пользовательского интерфейса (mel или Python). Однако с потоками python вы можете запускать длинные фоновые процессы _without_ blocking, кроме случаев доставки результата (вызовы executeDeferred и evalDeferredInMainThreadWithResult вызывают этот бит выполнения в основной поток). К сожалению, большинство сценарных манипуляций также входят в поток пользовательского интерфейса. Idle является «безопасным» в том смысле, что он работает, но вы просто хотите запускать очень легкий код в режиме ожидания, или вы сделаете программу очень медленной. – theodox

Смежные вопросы