繁体   English   中英

如果对象存在,则在Maya Python中添加新的对象名称

[英]if object exists add a new object name in 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次迭代以创建螺旋DNA链。 我想使名称相对,以便如果对象存在,它将基于已经存在的对象创建一个新对象(例如strandLName 20 ++)。 如果我可以对位置执行相同操作,以使每次运行脚本时该链连续增长,那将是很好的。

您必须设置命名约定:

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)

在maya中创建对象时,在名称后附加#将自动增加名称:

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']

但是,maya不会让您在层次结构的相同级别上拥有两个具有相同名称的项目,因此它可能会决定更改您的编号方案,以避免名称冲突。 运行上面的代码两次将生成更多名为example_11example_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_1top_node_2但他们都会有一个名为儿童child1通过child10 我已经手动增加了名称,因为我敢肯定top_node_#下不会发生冲突, 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM