尝试创建我创建的脚本可以多次运行。如果我运行它,但第二次得到:
<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 ++)。如果我能对位置做同样的事情会很好,这样每次运行脚本时链都会不断增长。
答案 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_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)