2

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)

1 Answers1

2
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)
DrWeeny
  • 2,487
  • 1
  • 14
  • 17
  • finally some maya developers who adopted `"".format()` :D – user1767754 Dec 18 '17 at 17:16
  • ahah, I've taken this habbits just in case maya will switch to python 3.0 and now, I've found it more readable now. – DrWeeny Dec 18 '17 at 21:07
  • Thank you very much for your kind explanation. But what if I want to set additional other attributes along with it? How can I create multiple attrs in for loop? – user8972552 Jan 21 '18 at 22:40