如何在循环中递增重复值(.001至.002)

时间:2018-07-03 11:42:38

标签: python loops duplicates blender

我正在尝试编写一个Blender python脚本,该脚本复制一个对象,然后更新约束,以使icosphere.002具有与Cube.002相同的旋转度 该循环需要重复421次。然而,当涉及到第十个循环时,该值变为.0010。但是,如果我将对象约束从Cube.00更改为Cube.,它将尝试寻找Cube.1

import bpy

for i in range(1, 421):
    bpy.ops.object.duplicate_move_linked(
            OBJECT_OT_duplicate={"linked": True, "mode": 'TRANSLATION'},
            TRANSFORM_OT_translate={
                "value": (0, 0, 0),
                "constraint_axis": (False, False, False),
                "constraint_orientation": 'GLOBAL',
                "mirror": False,
                "proportional": 'DISABLED',
                "proportional_edit_falloff": 'SMOOTH',
                "proportional_size": 1,
                "snap": False,
                "snap_target": 'CLOSEST',
                "snap_point": (0, 0, 0),
                "snap_align": False,
                "snap_normal": (0, 0, 0),
                "gpencil_strokes": False,
                "texture_space": False,
                "remove_on_cancel": False,
                "release_confirm": False,
                "use_accurate": False
            })
    bpy.context.object.constraints["Copy Rotation"].target = (
        bpy.data.objects["Cube.00" + str(i)])

2 个答案:

答案 0 :(得分:1)

您可以使用["Cube.{0:03}".format(i)],它将填充必要数量的零(在这种情况下为3),例如:

>>> "Cube.{0:03}".format(1)
'Cube.001'
>>> "Cube.{0:03}".format(12)
'Cube.012'
>>> "Cube.{0:03}".format(123)
'Cube.123'

在Python 3.6及更高版本中,您可以这样做(f字符串,请参见PEP 498):

f"Cube.{i:03}" # where i is your index variable

答案 1 :(得分:0)

由于在复制对象时您没有对它们做任何事情,因此您不需要使用大多数默认选项。复制对象后,它将成为活动对象,因此您可以从bpy.context.object.name[-3:]获得其数字后缀。

import bpy

cntxt = bpy.context
objlist = bpy.data.objects

for i in range(420):
    bpy.ops.object.duplicate(linked=True)
    suffix = cntxt.object.name[-3:]
    cntxt.object.constraints['Copy Rotation'].target = objlist['Cube.'+suffix]

您可以命名第一个对象Cube.000,以使后缀始终可用。

还要注意的是运算符add extra overhead,因此特别是对于长循环而言,最好直接使用数据。请注意,创建项目直接为您提供了创建的项目,而运算符使您仅依赖上下文,这意味着您将更少地依赖命名,而更多地依赖于所创建的确切项目。

import bpy

scn = bpy.context.scene
objlist = bpy.data.objects
obj = objlist['Icosphere.000']

for i in range(420):
    new_obj = obj.copy()
    new_obj.data = obj.data.copy()
    scn.objects.link(new_obj)
    cr = new_obj.constraints.new('COPY_ROTATION')
    cr.target = objlist['Cube.{0:03}'.format(i)]