【问题标题】:How do I increment a duplicate value (.001 to .002) in a loop如何在循环中增加重复值(.001 到 .002)
【发布时间】:2018-12-11 17:16:54
【问题描述】:

我正在尝试编写一个 Blender python 脚本来复制一个对象,然后更新约束,以便 icosphere.002Cube.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)])

【问题讨论】:

  • 而不是 00” + str(i) 使用 %3d” % i

标签: python loops duplicates blender


【解决方案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-strings,参见 PEP 498):

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

【讨论】:

  • 谢谢@hyst329。它完美地工作。再次感谢您。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2010-10-27
    • 2021-10-01
    • 2015-06-28
    • 2019-08-24
    • 2013-10-24
    • 2018-10-18
    相关资源
    最近更新 更多