Search code examples
pythonattributesmayaculling

Set attributes to a group as well?


guys. I wrote this simple script to set the backface culling to the selected objects. But I can't figure it out how to apply this to the selected group as well?

import maya.cmds as cmds

sel = cmds.ls(sl = True)
for i in range(len(sel)):
    cmds.setAttr((sel[i] + '.backfaceCulling'), 0)

Solution

  • import maya.cmds as cmds
    # dag flag is used to find everything below (like shapes)
    # so we specify we want only tansform nodes
    sel = cmds.ls(sl = True,  dag=True, type='transform')
    for i in sel:
        # we create a string attr for the current object 'i' because we will
        # use it multiple times
        attr = '{0}.backfaceCulling'.format(i)
        # We check if this transform node has an attribute backfaceCulling
        if cmds.ls(attr):
            # if yes, let's set the Attr
            cmds.setAttr(attr, 0)
    

    EDIT --- One Example for multiple attributes :

    import maya.cmds as cmds
    # dag flag is used to find everything below (like shapes)
    # so we specify we want only tansform nodes
    sel = cmds.ls(sl = True,  dag=True, type='transform')
    # Multiple choices for multiple attr to change :
    # attrs = ['backfaceCulling', 'visibility']
    # OR if you have different values
    # attrs =  [['backfaceCulling', 0], 
    #           ['visibility', 1]]
    # OR better go with dictionnaries if you have multiple values :
    attr_dic = {'backfaceCulling' : 0, 
                'visibility': 1}
    # you may add type if you need to
    # attr_dic = {'translate' : (0,1,3), 
    #             'visibility': 1,
    #             'type_translate' : 'double3',
    #             'backfaceCulling':1}
    
    
    for a in attr_dic.keys():
        # keys return : backfaceCulling and visibility
        fullAttr = ['{0}.{1}'.format(i, a) for i in sel if cmds.ls('{0}.{1}'.format(i, a)) if cmds.ls('{0}.{1}'.format(i, a))]
        # This list comprehension return :['pSphere1.visibility','pSphere2.visibility','pSphere3.visibility','pSphere4.visibility','pSphere5.visibility']
        # syntax of list comprehension : [i for i in list if condition], it is used instead of normal for loop because it is really fast
        for attr in fullAttr:
            #for each obj, set value
            cmds.setAttr(attr, attr_dic[a])
            # if you are using type :
            # if not attr_dic.get('type_{0}'.format(a)):
            #     cmds.setAttr(attr, attr_dic[a])
            # else:
            #     t = attr_dic['type_{0}'.format(a)]
            #     cmds.setAttr(attr, *attr_dic[a], type=t)