0

我对 MEL 很陌生,当我在探索这个 MEL 脚本时,我发现用户写了一些我完全不明白的行。然而我很想知道这个人为什么这样做..

无论如何,有人可以解释一下为什么下面的代码首先表示一个空的 MEL 然后它继续调用 Python 吗?把Python放进去不是更容易吗?

我还尝试禁用命令和sourceType,并且脚本也可以正常工作,只是我不明白在这种情况下的目的commandsourceType做什么......

-command ""
-sourceType "mel"
-actionIsSubstitute 0
-commandRepeatable 1
("shelfBtn_"  + $parent + "_AOV");

python("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+"shelfBtn_" + $parent + "_AOV"+"')"); 

顺便说一句,$parent源自:

global proc apkg2dnc(string $parent)

然后我尝试将代码更改为以下代码,它的工作方式与上面的一样,但是...

-command ("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+"shelfBtn_" + $parent + "_AOV"+"')")
-sourceType "python"

当我尝试删除括号时,我收到了语法错误消息,指示+它遇到的第一个加号。确实尝试;在行尾添加,它仍然给出语法错误,这次表明在行首

-command "import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('" + "shelfBtn_" + $parent + "_AOV" + "')"
-sourceType "python"

那么,括号在 MEL 中的读取方式是否起重要作用?

4

1 回答 1

4

您的示例格式错误。一般来说,你不能像你正在做的那样从开关中删除代码,因为代码失去了意义。开关如:

-command ""

指的是调用实际 mel 命令之前的行(不要与-command 开关混淆)。在这种情况下,我猜整个命令实际上是:

shelfButton 
    -command ""
    -sourceType "mel"
    -actionIsSubstitute 0
    -commandRepeatable 1
    ("shelfBtn_"  + $parent + "_AOV");

但很难知道。如果您省略被调用的命令,则代码将失去所有意义,并且由于没有任何意义,因此大多数情况下都无法以这种方式理解。它就像一个没有主语、谓语和上下文的句子。

有了这个澄清,我们实际上可以回答这个问题。为什么要放一个空命令?它有点多余,是的,​​但它仍然有意义。原因是他不知道用什么填充按钮。您可以省略命令源类型标志不应该有所作为。(省略源类型最终会出现微妙的错误)

下一个命令进行绑定:

python(...yada yada ... "('"+"shelfBtn_" + $parent + "_AOV"+"')"); 

不,我不知道aovMenu真正做了什么,但意图很明确,因为他正在传递按钮的名称。aovMenu 命令中的任何内容都在更改按钮的命令。如果您直接将它放入-command开关,这最终看起来会起作用(因为第一次按下按钮会填充按钮)。但这将是微妙的错误,尽管如此。

这是 Maya 编程中非常常见的模式。您所做的是预先生成按钮以了解其最终名称,以便您可以将相互依赖的两个实体绑定到该名称。

继续调用Python?把Python放进去不是更容易吗?

实际上,代码并非完全相同。这种方式可能更容易,取决于谁在打电话。您仍然需要引导按钮,然后调用 aovMenu 函数。它实际上并没有任何不同的形式调用其他人制作的函数。

问题是代码有点糟糕,出现细微错误的可能性很小。是否用 python 编写并不重要,重要的是 Maya 的行为方式。您实际上无法知道该按钮将被调用:

("shelfBtn_"  + $parent + "_AOV")

因为如果该名称存在,maya 将对其进行重命名,或者更糟糕的是,将其命名为与其他名称相同的名称,现在您必须使用完整路径名,否则出错的可能性为 50%。这样做的正确方法是:

$sButton = `shelfButton 
                -actionIsSubstitute 0
                -commandRepeatable 1
                 ("shelfBtn_"  + $parent + "_AOV")`;

python("import aovsFunction as aovs; aovs.MenuFuncs.aovMenu('"+$sButton+"')"); 
于 2014-03-21T08:43:06.637 回答