循环不起作用,3行python代码

时间:2016-05-07 11:40:18

标签: python python-2.7 blender blender-2.76

这个问题是关于blender,python脚本

我在这方面是全新的,所以请原谅我有任何愚蠢/新手的问题/评论。

我做得很简单(3行代码),以便轻松解决问题。

我需要的是一个为循环函数中的每个对象添加新的uv映射的代码。

但是这个代码只是将一个新的UV贴图添加到一个对象中。

import bpy
for x in bpy.context.selected_objects:
    bpy.ops.mesh.uv_texture_add()

我在这里做错了什么?

由于

3 个答案:

答案 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()