Maya Python 脚本作业属性更改
Maya Python Script Job Attribute Change
我正在尝试获取一个布尔属性 (A) 来更改另一个 (B)。要控制的 (B) 已经有一个脚本作业 运行 它,所以我无法创建一个集驱动键、直接连接或表达式来控制它,所以我正在尝试另一个脚本作业,因为运行 脚本函数本身就达到了预期的效果。我只是不知道如何将该脚本绑定到 运行 我想通过 (A) 驱动它的属性更改 (B)。
这被放置在设置为打开 gui 触发器的脚本节点中(据我所知,当 maya 打开时加载)。screenshot
我在这里错过了什么?
import maya.cmds as cmds
def togglePicker(pickerAttr):
cmds.setAttr(pickerAttr, not 0)
nameSpace = cmds.ls(sl=True)[0].rpartition(':')[0]
if len(nameSpace) > 0:
pickerAttr = nameSpace + ':Main.picker'
myPickerAttr = nameSpace + ':MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,togglePicker])
你的脚本节点在每次 maya 加载场景时执行,而不是在它启动时执行,至少文档是这么说的。所以每次加载场景时,都会创建一个新的 scriptJob。
您的脚本应该显示一条错误消息,因为 togglePicker() 函数是在没有参数的情况下调用的,但它需要一个参数。即使它有效,它也不会起作用..你现在做的是:
一旦打开 MoverMain_Cntrl.Picker
属性,就会调用 togglePicker()
函数并将其打开,即使您将其关闭也是如此。未使用 pickerAttr
变量。所以你应该看看你的程序逻辑。
你可以像这样使用partial函数解决agrument问题:
import maya.cmds as cmds
from functools import partial
def togglePicker(pickerAttr):
cmds.setAttr(pickerAttr, not 0)
nameSpace = cmds.ls(sl=True)[0].rpartition(':')[0]
if len(nameSpace) > 0:
pickerAttr = nameSpace + ':Main.picker'
myPickerAttr = nameSpace + ':MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,partial(togglePicker, pickerAttr)])
我成功了! (之前我已经切换到 MEL 的脚本节点,所以我可以测试评论中提到的 mel 命令确实有效,但是当我意识到我在评论中也提到的选择问题时,我忘记切换回 python ).
所以这是有效的方法,我知道我必须手动更改命名空间名称以防场景文件名发生变化:
import maya.cmds as cmds
def togglePicker():
cmds.setAttr(pickerAttr, not 0)
if cmds.namespace(exists='ExtremeBallRig_v008'):
pickerAttr = 'ExtremeBallRig_v008:Main.picker'
myPickerAttr = 'ExtremeBallRig_v008:MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,togglePicker])
我正在尝试获取一个布尔属性 (A) 来更改另一个 (B)。要控制的 (B) 已经有一个脚本作业 运行 它,所以我无法创建一个集驱动键、直接连接或表达式来控制它,所以我正在尝试另一个脚本作业,因为运行 脚本函数本身就达到了预期的效果。我只是不知道如何将该脚本绑定到 运行 我想通过 (A) 驱动它的属性更改 (B)。
这被放置在设置为打开 gui 触发器的脚本节点中(据我所知,当 maya 打开时加载)。screenshot
我在这里错过了什么?
import maya.cmds as cmds
def togglePicker(pickerAttr):
cmds.setAttr(pickerAttr, not 0)
nameSpace = cmds.ls(sl=True)[0].rpartition(':')[0]
if len(nameSpace) > 0:
pickerAttr = nameSpace + ':Main.picker'
myPickerAttr = nameSpace + ':MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,togglePicker])
你的脚本节点在每次 maya 加载场景时执行,而不是在它启动时执行,至少文档是这么说的。所以每次加载场景时,都会创建一个新的 scriptJob。
您的脚本应该显示一条错误消息,因为 togglePicker() 函数是在没有参数的情况下调用的,但它需要一个参数。即使它有效,它也不会起作用..你现在做的是:
一旦打开 MoverMain_Cntrl.Picker
属性,就会调用 togglePicker()
函数并将其打开,即使您将其关闭也是如此。未使用 pickerAttr
变量。所以你应该看看你的程序逻辑。
你可以像这样使用partial函数解决agrument问题:
import maya.cmds as cmds
from functools import partial
def togglePicker(pickerAttr):
cmds.setAttr(pickerAttr, not 0)
nameSpace = cmds.ls(sl=True)[0].rpartition(':')[0]
if len(nameSpace) > 0:
pickerAttr = nameSpace + ':Main.picker'
myPickerAttr = nameSpace + ':MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,partial(togglePicker, pickerAttr)])
我成功了! (之前我已经切换到 MEL 的脚本节点,所以我可以测试评论中提到的 mel 命令确实有效,但是当我意识到我在评论中也提到的选择问题时,我忘记切换回 python ).
所以这是有效的方法,我知道我必须手动更改命名空间名称以防场景文件名发生变化:
import maya.cmds as cmds
def togglePicker():
cmds.setAttr(pickerAttr, not 0)
if cmds.namespace(exists='ExtremeBallRig_v008'):
pickerAttr = 'ExtremeBallRig_v008:Main.picker'
myPickerAttr = 'ExtremeBallRig_v008:MoverMain_Cntrl.Picker'
else:
pickerAttr = 'Main.picker'
myPickerAttr = 'MoverMain_Cntrl.Picker'
cmds.scriptJob(attributeChange=[myPickerAttr,togglePicker])