2017-02-18 15 views
0

Попытка создать созданный мной сценарий будет работать несколько раз. Если я запускаю его, когда он работает, но второй раз я получаю:Если объект существует, добавьте новое имя объекта в Maya Python

Error: setAttr: Not enough data was provided. The last 0 items will be skipped. 
Traceback (most recent call last): 
    File "<maya console>", line 8, in <module> 

Вот мой сценарий

import maya.cmds as mc 

#Create and place Spiral DNA elements 
for x in range (0,20): 
    strandLName = "strandL" +str(x) 
    nucleoName = "nucleo" +str(x) 
    strandRName = "strandR" +str(x) 
    strandL,strandHistory = mc.polySphere(name=strandLName, ch=1) 
    nucleo,nucleoHistory = mc.polyCylinder(name=nucleoName, ch=1) 
    mc.setAttr(nucleoName + '.translateX', 5) 
    mc.setAttr(nucleoName + '.rotateZ', -90) 
    mc.setAttr(nucleoName + '.scaleX', 0.5) 
    mc.setAttr(nucleoName + '.scaleY', 5) 
    mc.setAttr(nucleoName + '.scaleZ', 0.5) 
    strandR,strandHistory = mc.polySphere(name=strandRName, ch=1) 
    mc.setAttr(strandRName + '.translateX', 10) 
    mc.select(deselect=1) 

    #create empty group 
    grp = mc.group(n=strandLName + 'NULL', em=1) 
    mc.select(deselect=1) 

    #Parent Elements to Group 
    nucleotide = mc.parent(strandL, nucleo, strandR, grp)[0] 

    #Move and rotate groups 
    mc.setAttr(grp + '.translateX', -5.5) 
    mc.xform(grp, cp=1) 
    mc.setAttr(grp + ".translateY", x * 2) 
    mc.setAttr(grp + ".ry", 15 * x) 
    mc.select(deselect=1) 

У меня есть 3 объекта, которые были сгруппированы и что группа затем итеративно еще 19 раз для создания спиральной ДНК-нити. Я хотел бы сделать имена относительными, чтобы, если объект существует, он создаст новый объект, основанный на том, что уже существует (пример strandLName 20 ++). Было бы здорово, если бы я мог сделать то же самое с позицией, чтобы нить непрерывно возрастала каждый раз при запуске скрипта.

ответ

0

При создании объекта в майе, добавляя # к имени будет автоматически увеличивать имя:

examples = [cmds.createNode('transform', n='example_#') for x in range(10)] 
print examples 
[u'example_1', u'example_2', u'example_3', u'example_4', u'example_5', u'example_6', u'example_7', u'example_8', u'example_9', u'example_10'] 

Однако майа не будет пусть у вас есть два элемента на одном уровне иерархии с тем же именем, поэтому он может решить изменить схему нумерации, чтобы избежать конфликтов имен. Выполнение вышеуказанного кода в два раза приведет к генерации большего количества преобразований с именем example_11 через example_20.

Чтобы избежать конфликтов имен вы можете использовать пространство имен или верхнюю группу уровня:

topnode = cmds.createNode('transform', n= 'top_node_#') 
# calling createNode with 'p=' makes the new items as children 
for n in range(10): 
    cmds.createNode('transform', n= 'child%i' % n, p=topnode) 

Запуск этого дважды будет производить top_node_1 и top_node_2, но они оба имеют детей имени child1 через child10. Я вручную увеличил имена, потому что я уверен, что не будет никаких столкновений под top_node_#, но это только надежно, если вы точно знаете, что ничто на одном уровне иерархии не будет иметь одинаковое имя.

Итак, для вашего примера вы хотите создать группы верхнего уровня с суффиксом #, чтобы они могли предсказуемо получать суффиксы, а затем вручную увеличивать имена дочерних элементов по мере их создания. В вашем случае у вас не будет возможности создавать узлы непосредственно под вашей группой верхнего уровня - вам придется переименовывать их после создания и воспитания. Вы также можете значительно упростить код, используя команду xform вместо непосредственно устанавливающих атрибутов

import maya.cmds as cmds 

def dna_strand(number_of_pairs): 

    top_level = cmds.createNode('transform', n='dna_#') 

    for n in range(number_of_pairs): 
     left, _ = cmds.polySphere() 
     cmds.xform(t = (-5, 0,0)) 
     right,_ = cmds.polySphere() 
     cmds.xform(t = (5, 0,0)) 
     nucleo,_ = cmds.polyCylinder(h = 10, r=.5) 
     cmds.xform(nucleo, ro=(0,0,90)) 
     group = cmds.group(left, right, nucleo) 

     # now these are under the group, naming is deterministic 
     cmds.rename(left, 'strandL%i' % n) 
     cmds.rename(right, 'strandR%i' % n) 
     cmds.rename(nucleo, 'nucleo%i' % n) 
     cmds.xform(group, t=(0,n * 2,0), ro = (0, 15 * n, 0)) 
     cmds.parent(group, top_level, r=True) 

     # group is under `dna_x` so again you can manually rename 
     cmds.rename(group, "basepair%i" % n) 
0

Вы должны установить соглашения об именовании:

import maya.cmds as mc 

class Counter: 
    iter = 0 
    def __init__(self): 
     Counter.iter += 1 

iter = Counter().iter 

name = "dna_{0:03d}_{{}}".format(iter) 

rootDna = mc.group(n=name.format('grp'), em=1) 
#Create and place Spiral DNA elements 
for x in range (0,20): 

    strandLName = name.format("strandL" +str(x)) 
    nucleoName = name.format("nucleo" +str(x)) 
    strandRName = name.format("strandR" +str(x)) 
    strandL,strandHistory = mc.polySphere(name=strandLName, ch=1) 
    nucleo,nucleoHistory = mc.polyCylinder(name=nucleoName, ch=1) 
    mc.setAttr(nucleoName + '.translateX', 5) 
    mc.setAttr(nucleoName + '.rotateZ', -90) 
    mc.setAttr(nucleoName + '.scaleX', 0.5) 
    mc.setAttr(nucleoName + '.scaleY', 5) 
    mc.setAttr(nucleoName + '.scaleZ', 0.5) 
    strandR,strandHistory = mc.polySphere(name=strandRName, ch=1) 
    mc.setAttr(strandRName + '.translateX', 10) 
    mc.select(deselect=1) 

    #create empty group 
    grp = mc.group(n=strandLName + 'NULL', em=1) 
    mc.select(deselect=1) 

    #Parent Elements to Group 
    nucleotide = mc.parent(strandL, nucleo, strandR, grp)[0] 

    #Move and rotate groups 
    mc.setAttr(grp + '.translateX', -5.5) 
    mc.xform(grp, cp=1) 
    mc.setAttr(grp + ".translateY", x * 2) 
    mc.setAttr(grp + ".ry", 15 * x) 
    mc.select(deselect=1) 

    mc.parent(grp, rootDna)