2012-06-22 77 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。