首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mel to Python困难

Mel to Python困难
EN

Stack Overflow用户
提问于 2016-11-02 13:10:30
回答 1查看 708关注 0票数 1

我一直在跟踪有关数字教程的脚本编写教程,在一些视频中,导师制作了一个工具,使用MEL将伽马校正节点添加到任何选定的着色器中。为了学习,我想尝试用Python重写代码,但我很难将MEL代码的一部分转换为Python。

到目前为止,我的代码是:

代码语言:javascript
复制
import maya.cmds as cmds

selMat = cmds.ls(sl=True, mat=True)

if len(selMat) < 1:
    cmds.warning('Select at least one Maya or Mental Ray Shader to apply gamma correct node to.')

for mat in selMat:

    gammaCorrect_util = cmds.shadingNode('gammaCorrect', asUtility=True)
    rename_gamma = cmds.rename(gammaCorrect_util, ('gamma_' + mat))
    cmds.setAttr((rename_gamma + '.gammaX'), 0.45)
    cmds.setAttr((rename_gamma + '.gammaY'), 0.45)
    cmds.setAttr((rename_gamma + '.gammaZ'), 0.45)

    if cmds.attributeQuery('color', mat): # << error here

        connection_to_mat = cmds.listConnections(mat + '.color')
        if len(connection_to_mat) == 1:

            cmds.connectAttr ((connection_to_mat + '.outColor'), (rename_gamma + '.value'), f=True)
            cmds.connectAttr ((rename_gamma + '.outValue'), (mat + '.color'), f=True)

当我运行这个程序时,我会得到以下错误:

错误:太多对象或values.Traceback (最近一次调用):File "",第17行,在TypeError中:太多对象或值。

我认为MEL代码的问题是:

代码语言:javascript
复制
if(`attributeExists "color" $mat`){
    string $connection_to_mat[] = `listConnections($mat + ".color")`;
    if(size($connection_to_mat) == 1){
        connectAttr -f ($connection_to_mat[0] + ".outColor") ($rename_gamma + ".value");
        connectAttr -f ($rename_gamma + ".outValue") ($mat + ".color");

我不知道如何在Python中转换和使用"attributeQuery“命令,而不是MEL中的"attributeExists”,导师还定义了预置的变体"$connection_to_mat[]“,但这在python中行不通。

EN

回答 1

Stack Overflow用户

发布于 2016-11-04 23:11:17

attributeQuery只接受一个未命名的参数,即属性。您必须使用节点标志指定节点,与MEL版本相同。

代码语言:javascript
复制
cmds.attributeQuery('color', n=mat, exists=True)

listConnections返回一个数组。您需要检查是否有一些连接,如果有,请使用第一个连接:connection_to_mat[0]

顺便说一句,如果指定要使用插头,则不必将字符串与".outColor“连接起来。

代码语言:javascript
复制
cmds.listConnections(mat + '.color', p=True)
// result ["someNode.outColor"]

这样做更好,因为传入属性有可能以不同的名称命名,或者是复合的子属性。例子:someNode.colors.outColor1.不管它是什么,你都可以把它喂给connectAttr

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40380818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档