2012-06-22 109 views
0

我在Maya中使用python,一個3D動畫包。我喜歡運行一個定義(A),但是在這個定義中,我需要另一個定義(B),它需要有效的對象選擇。這個腳本會一直持續下去直到創建一個(在def B中),並且我想用def B的返回值繼續我的腳本(def A)。我如何告訴def A等待直到返回有效的返回值def B?如何讓Python等待輸入?

這麼簡短的問題:我如何讓python等待有效的返回值被接收?

我希望有道理,並提前感謝您的時間。

Ç

例如:

def commandA() : 
    result = commandB() 
    ### Wait for a value here ### 
    if result == "OMG its a valid selection" : 
     do_another_commandC() 

def commandB() : 
    # This command is kept running until a desired type of selection is made 
    maya.mel.eval("scriptjob \"making a valid selection\" -type polygon") 
    if selection == "polygon" : 
     return "OMG its a valid selection" 
    else : 
     commandB() 

我需要在###線的功能有些事情要等到收到期望的回報,然後繼續上休息。目前該功能只是運行一切而已。

謝謝

+1

什麼是「定義」? – BrenBarn

+0

@BrenBarn可能是一個函數... – glglgl

+1

請顯示您已有的代碼,您知道的文檔的鏈接等。我想幫助但沒有Maya經驗。此外,從您的問題中可以看出您的工作方式以及您所處的困境。 – KobeJohn

回答

0

你可以只使用一個while循環:

def commandA() : 
    result = "" 
    while (result != "OMG its a valid selection") 
     # perhaps put a 0.1s sleep in here 
     result = commandB() 
    do_another_command() 

我注意到,

在你的代碼selection實際上並沒有被賦予值(至少不是在你給我們的代碼中),它不應該是:

selection = maya.mel.eval("scriptjob \"making a valid selection\" -type polygon")


此外,有沒有你爲什麼遞歸調用commandB理由嗎?這可能最終會使用不必要的資源,特別是如果有人反覆做出錯誤的選擇。 這個怎麼樣?

def commandA() : 
    result = "" 
    while (result != "polygon") 
     # perhaps put a 0.1s sleep in here (depending on the behavior of the maya command) 
     result = commandB() 
    do_another_command() 

def commandB() : 
    # This command retrieves the selection 
    selection = maya.mel.eval("scriptjob \"making a valid selection\" -type polygon") 
    return selection 
+0

主動等待聽起來不像要走的路。 – AoeAoe

+0

看看OP的代碼,它們遞歸地調用commandB來運行'maya.mel.eval(「scriptjob \」做一個有效的選擇\「類型多邊形」)'讓我認爲主動等待是不可避免的,除非maya命令以某種方式修改。另外,由於maya命令可能是阻塞的,while循環不會運行得非常快。 – stanri

+0

我設置在maya中的scriptjob將使用戶無法在maya中執行任何其他操作,直到做出所需的選擇。通過點擊3d視口中的對象來完成選擇,以便事件不會立即發生,可能會在1秒到5分鐘之間發生。所有我想要的是一旦正確選擇,返回的值傳遞給commandA並繼續運行腳本的其餘部分 – cloud68

0

如果commandB()的範圍僅限於commandA(),則可以考慮使用封閉件(what is a closure?

或簡單地嵌套Python函數(http://effbot.org/zone/closure。 HTM,http://www.devshed.com/c/a/Python/Nested-Functions-in-Python/

在你的代碼的任何部分考慮「結果= commandB()」語句,

的interpretter應該等到事情是從commandB(返回),並分配給造成的,進行下一前行e xecuted。