Атрибут добавления числового составного числа в Maya (не API)

Я искал в Интернете решение, но безрезультатно. В настоящее время я пытаюсь добавить составной атрибут, основанный на индексе (например, «object.attribute [0], object.attribute [1], object.attribute [2] и т. Д.»), Аналогичный тому, как атрибуты vertex и uv Просматривая документацию, кажется, что нет четкого способа добиться этого.

Попытки: Как я определяю родителя: cmds.addAttr(nodeType, ln=theParent, nc=x, at='compound')

-Обычное использование составного флага в addAttr.

-Использование цикла for с форматированием строки:

for i in range(x): 
    cmds.addAttr(ln='object.attribute[%s]' %i, p=theParent)

-Eval:

for i in range(x):
    mel.eval("addAttr -ln attribute["+str(i)+"] -p theParent;")

При форматировании строки я сталкиваюсь с этой ошибкой.

# Traceback (most recent call last):
#   File "<maya console>", line 2, in <module>
# RuntimeError: Error occurred during execution of MEL script
# line 1: Long name 'attribute[0]' contains invalid characters. //

Этот составной атрибут в конечном итоге будет содержать произвольное количество типов данных Int32Array.

Я мог бы создать свой собственный узел и создать необходимые атрибуты через API, но я не хочу создавать никаких дополнительных зависимостей.

Прошу прощения за любые дыры в моем вопросе или если что-то неясно. Пожалуйста, спросите, и я смогу объяснить дальше.

Спасибо.


person Christopher Magno    schedule 10.03.2015    source источник


Ответы (1)


Установите родительский атрибут как мультиатрибут, используя флаг -m:

 cmds.addAttr("polyCube1", ln = "example", at="compound", nc = 2, m=True)
 cmds.addAttr("polyCube1", ln = "atx", at="float", p="example")
 cmds.addAttr("polyCube1", ln = "aty", at="float", p="example")

Это делает polyCube1.compound двухчастным атрибутом (как UV - двухчастным), а также мультиатрибутом. Вы можете добавлять пары, индексируя свой setAttr или соединения:

 cmds.setAttr("polyCube1.example[0].atx", 1)
 cmds.setAttr("polyCube1.example[0].aty", 1)
 cmds.setAttr("polyCube1.example[1].atx", 2)
 cmds.setAttr("polyCube1.example[1].aty", 2)

 print cmds.getAttr("polyCube1.example[1].aty")
 # 2.0
person theodox    schedule 10.03.2015
comment
Ах, спасибо вам огромное за быстрый ответ! У меня было ощущение, что это прямо у меня под носом. Я замазал флаг, думая, что он не имеет отношения к делу. Однако у меня есть еще один вопрос. Как бы вы инициализировали атрибут через сам индекс, вместо того, чтобы быть дочерним? Спасибо еще раз! - person Christopher Magno; 11.03.2015
comment
В этом примере атрибуты инициализируются одним экземпляром атрибута; чтобы добавить больше, вы устанавливаете Attr в нужный вам индекс. Если атрибут, который вы добавляете, представляет собой простую числовую группировку, например float3 или double3, вам не нужно делать его составным - вы можете просто использовать флаг m. Если вы сделаете это таким образом, вы не можете редактировать или подключаться к частям (например, x, y или z) по отдельности - вам нужно получить и установить как группу - person theodox; 11.03.2015
comment
Ах, теперь я понимаю. Большое спасибо. - person Christopher Magno; 11.03.2015