循环不起作用,3 行 python 代码
Loop doesn't work, 3-lines python code
这个问题是关于 blender,python 脚本
我在这方面是全新的,所以请原谅任何stupid/newbie question/comment。
我让它变得简单(3 行代码)以便于解决问题。
我需要的是在循环函数中为每个对象添加新 uv 贴图的代码。
但是这段代码只是将多个新的 UV 贴图添加到一个对象。
import bpy
for x in bpy.context.selected_objects:
bpy.ops.mesh.uv_texture_add()
我这是怎么了??
谢谢
注意:我对blender不是很熟悉
似乎 bpy.ops
操作取决于 bpy.context
的状态。每个操作也可以覆盖上下文。
我假设 uv_texture_add()
一次只能处理一个对象?
尝试这样的事情:
import bpy
for x in bpy.context.selected_objects:
override = { "selected_objects": x }
bpy.ops.mesh.uv_texture_add(override)
这应该 运行 操作就像一次只选择一个对象一样。
来源:
https://www.blender.org/api/blender_python_api_2_63_17/bpy.ops.html#overriding-context
uv_texture_add
运算符仅适用于当前 活动对象 。您可以通过设置 scene.objects.active
来更改活动对象
import bpy
for x in bpy.context.selected_objects:
bpy.context.scene.objects.active = x
bpy.ops.mesh.uv_texture_add()
和Sambler说的一样,我一直用:
for active in bpy.context.selected_objects:
bpy.context.scene.objects.active = active
...
我在为 Blender 编程时使用的这两行代码最多(当然 import bpy
除外)。
我想我是在这里第一次学到这个的,如果你想要一个关于它是如何工作的很好的介绍:
https://cgcookiemarkets.com/2014/12/11/writing-first-blender-script/
在他使用的文章中:
# Create a list of all the selected objects
selected = bpy.context.selected_objects
# Iterate through all selected objects
for obj in selected:
bpy.context.scene.objects.active = obj
...
他的评论解释得很好,但我会更进一步。如您所知,Blender 缺少内置的多对象编辑,so you have selected objects and one active object。 active 对象是您可以编辑的,如果您尝试从 python 或 Blender 的 gui 本身设置它的值。所以虽然我们每次写的略有不同,但效果是一样的。我们使用 for active in bpy.context.selected_objects
遍历所有 selected 对象,然后我们 set 活动对象成为迭代循环中的下一个对象在 所有 中使用 bpy.context.scene.objects.active = active
选择的对象。因此,无论我们在循环中做什么,都会为选择中的每个对象完成一次 and 我们在 上对所涉及的对象执行任何操作在所有对象上完成。如果我们只使用第一行并将我们的代码放在 for
循环中会发生什么?
for active in bpy.context.selected_objects:
...
我们在循环中所做的任何事情都会为选择中的每个对象完成一次但是我们所做的任何操作在有问题的对象上仅在活动对象上完成 ,但与选定对象的数量一样多。这就是为什么我们需要在循环中设置活动对象。
这个问题是关于 blender,python 脚本
我在这方面是全新的,所以请原谅任何stupid/newbie question/comment。
我让它变得简单(3 行代码)以便于解决问题。
我需要的是在循环函数中为每个对象添加新 uv 贴图的代码。
但是这段代码只是将多个新的 UV 贴图添加到一个对象。
import bpy
for x in bpy.context.selected_objects:
bpy.ops.mesh.uv_texture_add()
我这是怎么了??
谢谢
注意:我对blender不是很熟悉
似乎 bpy.ops
操作取决于 bpy.context
的状态。每个操作也可以覆盖上下文。
我假设 uv_texture_add()
一次只能处理一个对象?
尝试这样的事情:
import bpy
for x in bpy.context.selected_objects:
override = { "selected_objects": x }
bpy.ops.mesh.uv_texture_add(override)
这应该 运行 操作就像一次只选择一个对象一样。
来源:
https://www.blender.org/api/blender_python_api_2_63_17/bpy.ops.html#overriding-context
uv_texture_add
运算符仅适用于当前 活动对象 。您可以通过设置 scene.objects.active
import bpy
for x in bpy.context.selected_objects:
bpy.context.scene.objects.active = x
bpy.ops.mesh.uv_texture_add()
和Sambler说的一样,我一直用:
for active in bpy.context.selected_objects:
bpy.context.scene.objects.active = active
...
我在为 Blender 编程时使用的这两行代码最多(当然 import bpy
除外)。
我想我是在这里第一次学到这个的,如果你想要一个关于它是如何工作的很好的介绍:
https://cgcookiemarkets.com/2014/12/11/writing-first-blender-script/
在他使用的文章中:
# Create a list of all the selected objects
selected = bpy.context.selected_objects
# Iterate through all selected objects
for obj in selected:
bpy.context.scene.objects.active = obj
...
他的评论解释得很好,但我会更进一步。如您所知,Blender 缺少内置的多对象编辑,so you have selected objects and one active object。 active 对象是您可以编辑的,如果您尝试从 python 或 Blender 的 gui 本身设置它的值。所以虽然我们每次写的略有不同,但效果是一样的。我们使用 for active in bpy.context.selected_objects
遍历所有 selected 对象,然后我们 set 活动对象成为迭代循环中的下一个对象在 所有 中使用 bpy.context.scene.objects.active = active
选择的对象。因此,无论我们在循环中做什么,都会为选择中的每个对象完成一次 and 我们在 上对所涉及的对象执行任何操作在所有对象上完成。如果我们只使用第一行并将我们的代码放在 for
循环中会发生什么?
for active in bpy.context.selected_objects:
...
我们在循环中所做的任何事情都会为选择中的每个对象完成一次但是我们所做的任何操作在有问题的对象上仅在活动对象上完成 ,但与选定对象的数量一样多。这就是为什么我们需要在循环中设置活动对象。