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

How do I increment a duplicate value (.001 to .002) in a loop

我正在尝试编写一个 Blender python 脚本来复制对象然后更新约束,以便 icosphere.002 具有与 Cube.002 相同的旋转 循环需要重复 421 次。然而,当涉及到第 10 个循环时,该值变为 .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)])

您可以使用 ["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-strings,见 PEP 498):

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

由于您在复制对象时没有对对象执行任何操作,因此您不需要使用的大部分默认选项。复制对象后它将成为活动对象,因此您可以从 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)]