Maya:ScriptNode弹出菜单,错误"无效指令"

时间:2017-01-17 13:58:43

标签: python python-2.7 maya

我正在编写一个GUI和脚本,在场景中选择特定对象时执行。我之前没有遇到任何问题,但现在我... ...

当我选择我的对象时,我创建的一个scriptJob说启动该程序......此时,它并没有。进一步研究一下,我试着测试scriptNode,结果是:

// Error:  //
// Error: Line 0.0: invalid directive //

现在,我最初因为流浪而出现这个问题&#34 ;;"在我的评论中。我删除了我能找到的每个分号......它工作了一次然后停止工作。

=============================================== ==========================

另外一个补充......我已经删除了我的脚本嵌入的所有注释,现在它正在调用我的类作为语法错误。见下文:

// Error: class x2m_info: //
// Error: Line 9.15: Syntax error //

我还应该包括正常运行脚本 DOES 使其正常工作。这是严格运行它作为scriptNode和scriptJob。

============= 以下是尝试复制 ==============

# Below is a saved py file, its mother file is similar and run in Maya
# Let us say it is saved in this dir, "D:\\USER\\JAMES\\" as "coolscript.py"
import modules # a list of modules, os, sys, subprocess, etc.
class numberOne: # Interpret this as the x2m_info class I specified above
    def about_info(self, x):
        # Does stuff
        if x==1:
            print("Does stuff, like display information: %s" % x)
        else:
            print("Does stuff, like display contact info: %s" % x)
    # Has a few more similar functions

class something:
     def func1(self, x):
         numberOne().about_info(1)
     def func2(self):
         numberOne().about_info(2)
def main():
    something().func1(1)
    something().func1(2)
import maya.cmds as cmds
# Portion in Maya that takes this and embeds it
embedThisFile = "D:\\USER\\JAMES\\coolscript.py"
embeddedStr   = open(embedThisfile, "r")
embed         = embeddedStr.read()
cmds.scriptNode(name="WhereToEmbed", beforeScript=embed, scriptType=1, sourceType="python")

scriptToVar   = cmds.scriptNode("WhereToEmbed", query=1, beforeScript=1)
scriptJobName = cmds.scriptJob(conditionTrue=("SomethingSelected",
                               "if (cmds.ls(selected=1)[0]) == 'pCube1':\
                               exec('%s'); main()" % (scriptToVar)),
                               killWithScene=1, protected=1)

2 个答案:

答案 0 :(得分:2)

你的方法在Maya完全合法。

将mel代码翻译成Pymel

我们大多数人通过监视脚本编辑器来学习Maya命令。它在Maya中打印命令。将mel代码翻译成python时有一定的顺序。首先让我们看看mel command sample for scriptJob。您可以在页面的最底部找到示例代码。请参阅此示例代码行:

//create a job that deletes things when they are seleted
int $jobNum = `scriptJob -ct "SomethingSelected" "delete" -protected`;

-ct flag是conditionTrue的简写。

{flag} -ct {space} {first parameter} "SomethingSelected" {space}
              {second parameter-this is the command to execute} "delete". 

因此,当您将此命令转换为pymel时,我们必须遵循以下顺序:

cmds.command(flag_1=paramaters,flag_2=paramaters,.......,flag_n=paramaters)

当您必须传递多个标志时,必须将它们放入数组,列表或元组中。他们必须遵循正确的顺序。通常,对象名称是第一个参数。

cmds.command(flag=[parameter_1,parameter_1,....,parameter_n])

所以在你的情况下:

scriptJobName = cmds.scriptJob(conditionTrue=["SomethingSelected",
    "if (cmds.ls(selected=1)[0]) == 'pCube1':exec('%s'); main()" 
    % (scriptToVar)], killWithScene=1, protected=1,)

conditionTrue = [condition,yourScript]

但是,如果您放置的条件都正确,则可以帮助更改在scriptJob内部运行代码的方式。主要是:

exec('%s')

应该是:

exec('''%s''')

计算正在嵌入的代码中的任何注释,换行符,返回值或分号...三重引号充当注释块,这反过来有助于处理整个代码。

在示例代码中,语法错误是Maya看不到要为条件执行的代码。 无效指令是Maya无法处理代码并在某个时刻挂起,因为它试图将命令作为指令处理(MEL标识为“标志”)。

这一切都是通过错误嵌套引号来解释的。虽然你做的是合法和可行的,如果你有评论(“#”),分号(“;”),新行和返回(分别是“\ n”,“\ r”),它是更好地提供块注释...单/双引号可能与代码中已有的信息冲突,并且会错误地拆分代码。

这可以解决您的问题。

有关pyMel中scriptJobs的更多信息,请参阅以下内容:

see the sample pymel code for scriptJob

答案 1 :(得分:0)

你可能过度复杂化你的情况,你可以简单地注入一个事件消息并处理它。这是一个例子

<强> runInsideMaya.py

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<强> whatIsSelected.py

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
import runpy
def testMod(*args, **kwargs):
    getCurrentSel = cmds.ls(sl=True)
    if getCurrentSel:
        if getCurrentSel[0] == "pSphere2":
            fileToInclude = "/tmp/whatIsSelected.py"
            runpy.run_path(fileToInclude, run_name='__main__')

idx = OpenMaya.MEventMessage.addEventCallback("SelectionChanged", testMod)

#when ever you finish doing your stuff
#OpenMaya.MMessage.removeCallback(idx)

因此,当有选择更改时,它将触发事件,如果选择是pSphere2,它将调用外部脚本。也可以尽可能远离scriptsjobs。