这个问题是关于blender,python脚本
我在这方面是全新的,所以请原谅我有任何愚蠢/新手的问题/评论。
我做得很简单(3行代码),以便轻松解决问题。
我需要的是一个为循环函数中的每个对象添加新的uv映射的代码。
但是这个代码只是将一个新的UV贴图添加到一个对象中。
import bpy
for x in bpy.context.selected_objects:
bpy.ops.mesh.uv_texture_add()
我在这里做错了什么?
由于
答案 0 :(得分:1)
与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。如果您尝试从python或Blender的gui本身设置其值,则可以编辑活动对象。因此,虽然我们每次写的都略有不同,但效果是一样的。我们使用for active in bpy.context.selected_objects
遍历所有选定的对象,然后我们设置活动对象成为循环中的下一个迭代所有< / strong>使用bpy.context.scene.objects.active = active
选择的对象。因此,无论我们在循环中做什么,都会为选择中的每个对象完成一次,我们在 上执行的任何操作都会在所有对象上完成对象。如果我们只使用第一行并将我们的代码放在for
循环中,会发生什么?
for active in bpy.context.selected_objects:
...
无论我们在循环中做什么,都会为选择中的每个对象完成一次但是我们在 上的任何操作所讨论的对象仅在上完成活动对象,但与所选对象一样多次。这就是我们需要在循环中设置活动对象的原因。
答案 1 :(得分:0)
注意:我不熟悉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
答案 2 :(得分:0)
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()