2016-08-05 3 views
0

Я все еще выясняю, как Python и Maya работают вместе, поэтому простите невежество с моей стороны. Так что я пытаюсь изменить атрибуты списка соединений в майе, используя петлю следующим образом:setAttr из списка в майя python

for p in jointList: cmd.getAttr(p, 'radius', .5)

и я получаю эту ошибку:

Invalid argument 1, '[u'joint1']'. Expected arguments of type ( list, )

Я понятия не имею, что я делаю неправильно.

+0

Я не знаком с Майей, но мне кажется, что хотя бы один из ваших аргументов не является списком Python. https://stackoverflow.com/documentation/python/209/list#t=201608050111401102648 Похоже, что вы можете передавать «радиус» в виде строки. –

ответ

3

Если вы работаете с pyMel вам нужно указать имя и атр узел, чтобы получить или установить.

для GetAttr:

for p in jointList: 
    val = cmd.getAttr('%s.radius' % (p)) 

для SetAttr:

for p in jointList: 
    cmd.setAttr('%s.radius' % (p), .5) 
1

Вам необходимо указать как узел, так и канал в качестве первого аргумента, например, «joint1.radius».

установить радиус до .5 на всех суставах, ваш код будет:

for p in jointList: 
    cmd.setAttr(p + '.radius', .5) 
-1
# lets have a look on the valid/available attributes 
# and change some attributes 

# create list based on your selection 
item_list = cmds.ls(selection=True) 
for item in item_list: 
    # iterate all keyable and unlocked attributes 
    for key in cmds.listAttr(item, keyable = True, unlocked=True): 
     # get attr 
     value = cmds.getAttr("{0}.{1}".format(item, key)) 
     print "{0}:{1}".format(key, value) 

# lets set some attributes 
attr_id = "radius" 
attr_value = 5 
for item in item_list: 
    # check object exists 
    if cmds.objExists(item): 
     # check object type 
     if cmds.objectType(item, isType="transform"): 
      # check objects attr exists 
      if cmds.attributeQuery(attr_id, node = item, exists=True): 
      print "set Attr" 
      cmds.setAttr("{0}.{1}".format(item,attr_id), attr_value) 
+0

Добро пожаловать в переполнение стека! Хотя этот фрагмент кода может решить вопрос, в том числе [объяснение] (http://meta.stackexchange.com/q/114762/305455), действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, так как это уменьшает читаемость кода и объяснений! – jmattheis

+0

Нет необходимости в понимании списка и отсутствии объяснений. –

+0

thx ребята за отзыв, я редактирую код –

1

Переход из примеров в документации:

http://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/CommandsPython/getAttr.html

http://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/CommandsPython/setAttr.html

Вам нужно указать имя и атрибут объекта как строку, когда вы передадите его в функцию getAttr().

например.

translate = cmds.getAttr('pSphere1.translate') 

возвращает значение атрибута для перевода на pSphere1

или

jointList = cmds.ls(type='joint')  
for joint in jointList: 
     jointRadius = cmds.getAttr('{}.radius'.format(joint)) 
     #Do something with the jointRadius below 

И если вы хотите, чтобы установить его

newJointRadius = 20 

jointList = cmds.ls(type='joint') 
for joint in jointList: 
    cmds.setAttr('{}.radius'.format(joint), newJointRadius)