【问题标题】:Maya Python Script Job Attribute ChangeMaya Python 脚本作业属性更改
【发布时间】:2022-10-17 11:29:47
【问题描述】:

我试图让一个布尔属性(A)来改变另一个(B)。要控制的(B)已经有一个脚本作业运行它,所以我无法创建一个设置驱动键、直接连接或表达式来控制它,所以我正在尝试另一个脚本作业,因为运行脚本函数本身就可以达到预期的效果。我只是不知道如何将该脚本与我想通过 (A) 驱动的属性更改 (B) 联系起来。

这被放置在设置为打开 gui 触发器的脚本节点中(据我了解,在 Maya 打开时加载)。 Here's a 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])

【问题讨论】:

    标签: python jobs maya


    【解决方案1】:

    每次 Maya 加载场景时都会执行您的脚本节点,而不是在启动时执行,至少文档是这么说的。因此,每次加载场景时,都会创建一个新的 scriptJob。

    您的脚本应该显示一条错误消息,因为 togglePicker() 函数在没有参数的情况下被调用,但它需要一个参数。即使它有效,它也不起作用..您目前所做的如下: 只要您打开MoverMain_Cntrl.Picker 属性,就会调用togglePicker() 函数并将其打开,即使您将其关闭。不使用pickerAttr变量。所以你应该看看你的程序逻辑。

    您可以通过使用这样的偏函数来解决 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)])
    

    【讨论】:

    • 谢谢@haggikrey,我在场景中试过了,很遗憾,它没有用。我确实让下面这个 mel 脚本工作,但它没有考虑命名空间,我不知道如何在 mel 中编写命名空间附加逻辑以使其工作,以防万一钻机被引用。任何想法:scriptJob -killWithScene -ac MoverMain_Cntrl.picker asPicker;
    • 我想我知道可能会发生什么,因为我的脚本需要一个选择来确定命名空间,如果它在场景打开时运行,那么就没有任何选择。所以我认为这在启动时完全失败,因为没有选择任何内容。所以我想我不确定如何使这个脚本在一般的命名空间中工作,或者是否有某种方法可以做通配符之类的事情来获取具有或不具有命名空间的相同属性的所有内容。
    【解决方案2】:

    我让它工作了! (之前我已经将脚本节点切换到 MEL,因此我可以测试 cmets 中提到的 mel 命令是否有效,但是当我意识到我在 cmets 中也提到的选择问题时,我忘记了切换回 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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多