我正在编写一个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)
答案 0 :(得分:2)
你的方法在Maya完全合法。
我们大多数人通过监视脚本编辑器来学习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的更多信息,请参阅以下内容:
答案 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。