我正在尝试设置一个接口来调用某个文件夹中当前版本的scipts
我正在附加我的个人脚本文件夹,并尝试按其指示导入它。 无论何时按下按钮,都会显示以下错误消息:
我尝试了许多可能的导入技术。但错误不断出现
我将附加接口脚本和要调用的scipt之一
接口:
import maya.cmds as mc
import sys
import os
import importlib
FolderContent = []
SysPath = 'C:/Users/[Username]/Documents/maya/2019/scripts/Personal'
sys.path.append(SysPath)
print sys.path
for file in os.listdir(SysPath):
if file.endswith(".py"):
FolderContent.append(file)
def UI(FolderContent):
x = 0
if mc.window("Run_Script", ex = True):
mc.deleteUI("Run_Script")
popUp = mc.window("Run_Script")
mc.gridLayout(nc = 1, ch = 30, cw = 300)
for i in FolderContent:
ScriptName = FolderContent[x]
mc.button(label = FolderContent[x], command = 'callFunc(\'%s\')' % (ScriptName), bgc = (0.25, 0.25, 0.25))
x += 1
mc.button(label = 'Cancel', command = 'close()', bgc = (0.92, 0.4, 0.4))
mc.window(popUp, e = True, s = False, h = 50, w = 100)
mc.showWindow()
UI(FolderContent)
def callFunc(ScriptName):
ScriptName = ScriptName[0:-3]
mymodule = importlib.import_module(ScriptName)
def close():
mc.deleteUI("Run_Script")
要调用的脚本示例:
import maya.cmds as mc
mc.select(hi = True)
BaseChain = mc.ls(sl = True)
ChainLength = len(BaseChain) - 1
###################################################################################
if mc.window("SetVariables", ex = True):
mc.deleteUI("SetVariables")
popUp = mc.window("SetVariables")
mc.gridLayout(nc = 2, ch = 30, cw = 200)
mc.text(label = "Side")
mc.textField("side")
mc.text(label = "Limb")
mc.textField("limb")
mc.text(label = "FK-Amount")
mc.textField("amount", fi = ChainLength)
cmd = 'setVars()'
close = 'closeWindow()'
mc.button(label = "OK", command = cmd, bgc = (0.2, 0.92, 0.75))
mc.button(label = "Cancel", command = close, bgc = (0.92, 0.4, 0.4))
mc.window(popUp, e = True, s = False, h = 50, w = 100)
mc.showWindow()
###################################################################################
def createChains(side, limb, amount):
mc.select(hi = True)
BndChain = mc.ls(sl = True)
x = 0
for i in BndChain:
mc.rename(BndChain[x], side + '_' + limb + '_BND_Chain_0' + str(x + 1))
x += 1
BndChain = mc.ls(sl = True)
ChainLength = len(BndChain)
mc.duplicate( n = side + '_' + limb + '_FK_Chain_01')
FkChain = mc.ls(sl = True)
mc.duplicate( n = side + '_' + limb + '_IK_Chain_01')
IkChain = mc.ls(sl = True)
parentChains(ChainLength, FkChain, IkChain, BndChain, side, limb, amount)
###################################################################################
def parentChains(ChainLength, FkChain, IkChain, BndChain, side, limb, amount):
x = 0
while x < ChainLength:
mc.select(FkChain[x])
mc.select(IkChain[x], add = True)
mc.select(BndChain[x], add = True)
mc.parentConstraint(mo = False)
x += 1
FKChainCtrl(ChainLength, FkChain, IkChain, BndChain, side, limb, amount)
###################################################################################
def FKChainCtrl(ChainLength, FkChain, IkChain, BndChain, side, limb, amount):
listLength = len(FkChain)
invertedNumber = listLength - int(amount)
doFK = listLength - invertedNumber
x = 0
Fk_ctrls = []
while x < doFK:
queryObj = FkChain[x]
currCtrl = mc.circle(n = side + '_' + limb + '_' + 'FK' + '_' + 'CTRL' + '_01', nr = [1, 0, 0], sw = 180)[0]
mc.curveRGBColor('translate.X', 1, 0, 1)
Fk_ctrls.append(currCtrl)
mc.parentConstraint(queryObj, currCtrl, mo = False)
mc.select(cl = True)
mc.select(queryObj)
mc.select(currCtrl, add = True)
mc.RemoveConstraintTarget()
mc.select(cl = True)
mc.select(currCtrl)
sel = mc.ls(sl = True)[0]
mc.FreezeTransformations(sel)
mc.parentConstraint(currCtrl, queryObj, mo = True)
if(x > 0):
mc.parent(Fk_ctrls[-1], Fk_ctrls[-2])
x += 1
mc.hide(FkChain)
IKChainCtrl(IkChain, BndChain, side, limb)
###################################################################################
def IKChainCtrl(IkChain, BndChain, side, limb):
currHandle = mc.ikHandle(n = side + '_' + limb + '_IkHandle', sj = IkChain[0], ee = IkChain[-1])[0]
mc.hide()
currHandlePos = mc.xform(currHandle, q = True, t = True, ws = True)
currCtrl = mc.circle(n = currHandle + '_CTRL', nr = [1, 0, 0], r = 1.5)
# currCtrl = mc.curve(n = currHandle + '_CTRL', d = 1, p = [(-0.75, 0, 0), (-0.75, 0, 2.5), (-2.5, 0, 2.5), (0, 0, 6.25), (2.5, 0, 2.5), (0.75, 0, 2.5), (0.75, 0, 0), (0.75, 0, -2.5), (2.5, 0, -2.5), (0, 0, -6.25), (-2.5, 0, -2.5), (-0.75, 0, -2.5), (-0.75, 0, 0)])
# mc.setAttr(currCtrl + '.overrideEnabled', 1)
# mc.setAttr(currCtrl + '.overrideColor', 21)
mc.select(IkChain[-2])
mc.select(currCtrl, add = True)
mc.parentConstraint(mo = False)
mc.select(IkChain[-2])
mc.select(currCtrl, add = True)
sel = mc.ls(sl = True)
mc.select(sel[0:-1], r = True)
mc.RemoveConstraintTarget()
mc.xform(currCtrl, t = [currHandlePos[0], currHandlePos[1], currHandlePos[2]])
mc.select(currCtrl, r = True)
mc.FreezeTransformations()
# mc.select('makeNurbCircle3', d = True)
mc.duplicate()
mc.parentConstraint(currCtrl, currHandle, mo = True)
mc.rename(side + '_' + limb + '_IkHandle_CTRL1', side + '_' + limb + '_Switch')
mc.xform(s = [1.5, 1.5, 1.5])
SwitchCtrl = mc.ls(sl = True)
mc.pointConstraint(BndChain[-1], SwitchCtrl)
currCtrl = mc.ls(sl = True)[0]
mc.hide(IkChain)
AddSwitchAttributes(currCtrl, side, limb)
###################################################################################
def AddSwitchAttributes(currCtrl, side, limb):
mc.addAttr(currCtrl, sn = 'FK', nn = 'FK', min = 0, max = 1, dv = 0, k = True, h = True)
mc.addAttr(currCtrl, sn = 'IK', nn = 'IK', min = 0, max = 1, dv = 1, k = True, h = True)
mc.addAttr(currCtrl, sn = 'Switch', nn = 'FK|IK Switch', min = 0, max = 1, dv = 1, k = True)
mc.connectAttr(side + '_' + limb + '_Switch.FK', side + '_' + limb + '_FK_CTRL_01.visibility')
mc.connectAttr(side + '_' + limb + '_Switch.IK', side + '_' + limb + '_IkHandle_CTRL.visibility')
i = 1
while i < ChainLength + 2:
mc.setDrivenKeyframe(side + '_' + limb + '_BND_Chain_0' + str(i) + '_parentConstraint1.' + side + '_' + limb + '_IK_Chain_0' + str(i) + 'W1', cd = side + '_' + limb + '_Switch.Switch', v = 1.0)
mc.setDrivenKeyframe(side + '_' + limb + '_BND_Chain_0' + str(i) + '_parentConstraint1.' + side + '_' + limb + '_FK_Chain_0' + str(i) + 'W0', cd = side + '_' + limb + '_Switch.Switch', v = 0.0)
i += 1
mc.setDrivenKeyframe(side + '_' + limb + '_Switch.IK', cd = side + '_' + limb + '_Switch.Switch', v = 1.0)
mc.setDrivenKeyframe(side + '_' + limb + '_Switch.FK', cd = side + '_' + limb + '_Switch.Switch', v = 0.0)
mc.setAttr(side + '_' + limb + '_Switch.Switch', 0)
y = 1
while y < ChainLength + 2:
mc.setDrivenKeyframe(side + '_' + limb + '_BND_Chain_0' + str(y) + '_parentConstraint1.' + side + '_' + limb + '_IK_Chain_0' + str(y) + 'W1', cd = side + '_' + limb + '_Switch.Switch', v = 0.0)
mc.setDrivenKeyframe(side + '_' + limb + '_BND_Chain_0' + str(y) + '_parentConstraint1.' + side + '_' + limb + '_FK_Chain_0' + str(y) + 'W0', cd = side + '_' + limb + '_Switch.Switch', v = 1.0)
y += 1
mc.setDrivenKeyframe(side + '_' + limb + '_Switch.IK', cd = side + '_' + limb + '_Switch.Switch', v = 0.0)
mc.setDrivenKeyframe(side + '_' + limb + '_Switch.FK', cd = side + '_' + limb + '_Switch.Switch', v = 1.0)
mc.setAttr(side + '_' + limb + '_Switch.Switch', 1)
mc.select(cl = True)
###################################################################################
def setVars():
side = mc.textField("side", q = True, tx = True)
limb = mc.textField("limb", q = True, tx = True)
amount = mc.textField("amount", q = True, tx = True)
createChains(side, limb, amount)
closeWindow()
###################################################################################
def closeWindow():
mc.deleteUI("SetVariables")
谢谢你的帮助
抱歉耽搁了各位,但我很高兴地报告,这是现在工作! 事实证明,问题确实是,我没有在执行UI之前导入脚本
这就是此时的动态用户界面:
通过在调用UI之前执行此操作,在各个SRIPT中使用字符串甚至不是问题:
我觉得有点粗糙
我刚开始做这样的事情(可能是4周),所以非常感谢改进
非常感谢你的大力帮助! 干杯
没有尝试。。。我想原因是您使用字符串“setVars()”作为命令名。如果从主模块调用它,则没有setVars(),而是一个名为WhatEverYourModuelNameIs.setVars()的函数
您可以尝试以下方式导入所有内容:
什么不是真正好的解决方案,或者您可以尝试直接使用函数对象作为按钮的参数:
好的,我现在试过了,但有一些问题。我想你是直接在maya中执行主脚本的吧?因为如果我把它放入一个模块并加载它,我会得到一个类似的错误,即找不到“close()”,也找不到“callFunc()”。两者都有相同的原因,不使用字符串很容易解决
在主脚本中,可以使用与上述相同的过程替换按钮命令中的“close()”:
由于button命令会自动添加一个参数,因此close()命令将有一个默认参数,类似于close(dummyArg)
callFunc()有点复杂,因为您使用了一个参数。这可以通过部分解决,例如:
按钮调用将向调用中添加另一个布尔值,这样callFunc将接收另一个参数,可以通过向callFunc定义中添加另一个参数(如callFunc(脚本名,值))来捕获该参数。 这样,函数对象就不用字符串了。但是现在你有另一个问题,因为如果你第一次加载模块,你会得到一个错误
这是因为函数在使用时还没有定义,所以必须将函数定义放在UI定义函数之前。 现在,如果您的脚本被导入,您将遇到与字符串定义的函数类似的问题,但是它们可以用与主模块相同的方法解决
相关问题 更多 >
编程相关推荐