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

时间:2017-02-18 10:24:42

标签: python maya

尝试创建我创建的脚本可以多次运行。如果我运行它,但第二次得到:

 <environment names="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/underscore/underscore.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/lib/datatables/media/js/jquery.dataTables.min.js"></script>
        <script src="~/lib/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
        <script src="~/lib/bootstrap-timepicker/js/bootstrap-timepicker.js"></script>
        <script src="~/lib/moment/moment.js"></script>
        <script src="~/lib/moment-range/lib/moment-range.js"></script>
        <script src="~/lib/fullcalendar/dist/fullcalendar.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
</environment>

<environment names="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
        <link rel="stylesheet" href="~/lib/datatables/media/css/jquery.dataTables.min.css" />
        <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/timepicker/1.3.5/jquery.timepicker.min.css">
        <link rel="stylesheet" href="~/lib/fullcalendar/dist/fullcalendar.css" />
</environment>

这是我的剧本

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>

我有3个已经分组的对象,然后该组再次迭代19次以创建螺旋DNA链。我想使名称相对,以便如果对象存在,它将基于已存在的内容创建一个新对象(例如strandLName 20 ++)。如果我能对位置做同样的事情会很好,这样每次运行脚本时链都会不断增长。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

在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,但他们都会生成名为child1child10的子项。我已经手动增加了名称,因为我确定在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)