使用多个defs“采购”python脚本 - MAYA

时间:2016-10-28 04:19:11

标签: python maya

所以我一直在做很多研究,但找不到合适的答案。我对python很新,很抱歉,如果这是一个简单的问题。

所以,基本上,我正在创建一个具有按钮的UI,该按钮应该从另一个.py文件调用一个函数。到目前为止我所做的是将文件的文件夹附加到sys.path并将.py文件作为其他内容导入。例如,假设我正在导入myTools.py:

import myTools as mt

现在我可以通过mt.mainFunction()或mt的任何内容成功访问myTools中的所有函数。前缀。

现在我的问题:

当我直接运行mt.myFunction()时它工作得很好。问题是mainFunction()是另一个在不同时间调用不同函数的UI。所有这些函数都在myTools文件中..但是Maya不会找到它们,因为当它们在mainFunction()中被调用时,它们没有mt前缀。 我的意思是,我可以在userSetup.py上运行那些defs,但它是一个非常大的代码,我想以最干净的方式做到这一点:)

有什么想法吗?

提前致谢!

编辑: 所以我才意识到只有一个功能不起作用。我收到这个错误: # Error: NameError: file <maya console> line 1: name 'annotationToLocator' is not defined #

由于这个错误,我认为我的main函数在模块上找不到任何其他功能。

我声明此函数的实际代码:

jobNum = cmds.scriptJob(e=['SelectionChanged', 'annotationToLocator()'])

def annotationToLocator ():
selList = cmds.ls(sl=True)
for item in selList:
    if '_ANN' in str(item):
        cmds.select(item,d=True)
        newItem = str(item).replace('_ANN', '_LOC')
        cmds.select(newItem,add=True)

关于这个的一些奇怪的事情: 1)当我直接运行代码时它非常有效。

2)我正在导入userSetup文件中的模块..我不仅在尝试实际运行调用此函数的函数时,而且在Maya启动时也收到错误。

我尝试评论scriptjob行,现在它工作正常,但显然现在我没有运行scriptjob。我认为模块和scriptjobs有些问题吗?!

对不起,我知道我离开了原来的问题路径! :)

2 个答案:

答案 0 :(得分:0)

这听起来像典型的python行为,应该可以正常工作。每个模块都有自己的全局范围,该模块中定义的每个函数都可以访问该范围中定义的所有内容。

因此在myTools模块中,每个函数都可以通过名称相互访问,并且主模块中定义的每个函数都可以访问mt模块对象,并可以获取函数的属性

答案 1 :(得分:0)

您的问题源于对函数使用字符串引用。虽然这有效,但只有 才能运行,如果它们通过字符串调用是在全局python范围内 - 这通常意味着它只能在监听器中工作。

执行任何maya回调的更好方法是将函数作为函数对象直接传递给回调,而不是作为字符串:

  import mymodule
  cmds.scriptJob(e=('somethingSelected', mymodule.fancyfunction))

请注意mymodule.fancyfunction传递没有parens :您告诉Maya“使用此功能”。如果您以mymodule.fancyfunction()的身份执行此操作,则会告诉Maya使用调用函数的结果,而不是函数本身。