2014-10-26 1 views
0

Я пытаюсь выяснить, как зарегистрировать событие создания ui. То, что я пытаюсь достичь, - запустить скрипт при открытии renderViewWindow. ArvidПользовательский интерфейс Maya Window создает событие?

+0

Я не уверен, как делать именно то, что вы просите, но если вы пытаетесь запустить скрипт при запуске, возможно, подумайте о том, чтобы использовать Pre Render Mel из настроек Render? [Вот связанный пост] (http://stackoverflow.com/questions/21488519/maya-querying-previous-render-information/21488609#21488609), который может быть полезен – mhlester

+0

Нет, что не будет работать, потому что даже когда рендеринг рендеринга и не отображается, мне нужен сценарий для запуска. Или, например, если я хочу запустить скрипт при открытии сценария, я хочу, чтобы что-то произошло. – arvidurs

ответ

2

Один из способов сделать это - с помощью команды scriptJob. В Python, вы можете сделать это, используя что-то вроде:

import maya.cmds as cmds 
import pymel.core as pm 

class WindowWatcher(): 
    """ A class to watch for a particular window in Maya """ 

    def __init__(self, window_name, on_open_callback, on_close_callback=None): 
     self.window_name = window_name 
     self.on_open_callback = on_open_callback 
     self.on_close_callback = on_close_callback 
     self.window_opened = False  

    def check_for_window_open(self):   
     if not self.window_opened: 
      if self.window_name in cmds.lsUI(windows=True): 
       self.on_open_callback.__call__() 
       self.window_opened = True 
     else: 
      if not self.window_name in cmds.lsUI(windows=True): 
       self.window_opened = False 
       if self.on_close_callback: 
        self.on_close_callback.__call__() 


if __name__ == "__main__": 
    # demo 

    render_window_name = "renderViewWindow" 
    def on_open_render_window(arg1, arg2): 
     # your on_window_open code here 
     print "Render Window opened!" 
     print "Arg1: %s Arg2: %s" % (arg1, arg2) 

    script_editor_name = "scriptEditorPanel1Window" 
    def on_open_script_editor(): 
     # your on_window_open code here 
     print "Script Editor opened!" 

    render_window_watcher = WindowWatcher(render_window_name, 
              pm.windows.Callback(on_open_render_window, "Hello", "World") 
             ) 
    script_editor_watcher = WindowWatcher(script_editor_name, on_open_script_editor) 

    cmds.scriptJob(event=["idle", 
          pm.windows.Callback(render_window_watcher.check_for_window_open)]) 
    cmds.scriptJob(event=["idle", 
          pm.windows.Callback(script_editor_watcher.check_for_window_open)]) 

Будьте осторожны, хотя, используя «простой» событие не всегда рекомендуется, так как метод будет вызываться каждый раз, Майя простаивают. Это следует использовать с осторожностью.

[Изменить] Вы можете попробовать проверить maya.OpenMayaUI.MQtUtil.findWindow (self.window_name) вместо проверки self.window_name в cmds.lsUI (windows = True).

+0

Спасибо за хороший код! Я работаю очень хорошо. Поскольку его постоянное использование процессора постоянно работает на 20%. То, наверное, слишком много. Но это отличный способ использовать метод __call__. Мне все еще нужно выяснить, как это работает. ^^ – arvidurs

+0

Рад, что это помогает! Примите ответ, если считаете, что это полезно. Спасибо и ура! – kartikg3