如何在循环中递增重复值(.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)]
我正在尝试编写一个 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)]