2014-10-26 51 views
0

我想弄清楚如何註冊一個ui創建事件。我想要實現的是在renderViewWindow打開時運行腳本。 Arvid瑪雅窗口UI創建事件?

+0

我不確定如何完全按照要求進行操作,但如果您在渲染開始時嘗試運行腳本,可以考慮使用渲染設置中的預渲染梅爾? [這是一個相關的帖子](http://stackoverflow.com/questions/21488519/maya-querying-previous-render-information/21488609#21488609),可能是有用的 – mhlester 2014-10-26 21:06:21

+0

沒有,不會工作,因爲即使renderView是openend並沒有呈現我想要一個腳本運行。或者,例如,如果我想在scriptEditor打開時運行腳本,我希望發生一些事情。 – arvidurs 2014-10-26 23:35:24

回答

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),而不是在cmds.lsUI(窗口= TRUE)檢查self.window_name。

+0

感謝您的好代碼!我工作非常好。 因爲它始終稱爲CPU使用率始終以20%的速度運行。這可能太多了。但它是使用__call__方法的好方法。我仍然必須弄清楚它是如何工作的^^ – arvidurs 2014-10-27 19:32:40

+0

很高興幫助!如果您覺得它有用,請接受答案。謝謝你,歡呼! – kartikg3 2014-10-27 19:34:21