1

这个问题是关于搅拌机,python 脚本

我对此完全陌生,所以请原谅我有任何愚蠢/新手的问题/评论。

我使它变得简单(3行代码)以轻松解决问题。

我需要的是一个代码,它为循环函数中的每个对象添加一个新的 uv 贴图。

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

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

我在这里做什么错了??

谢谢

4

3 回答 3

2

与 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 缺少内置的多对象编辑,因此您选择了对象和一个活动对象。如果您尝试从 python 或 Blender 的 gui 本身设置其值,则活动对象是您可以编辑的。所以虽然我们每次写的略有不同,但效果是一样的。我们使用 遍历所有选定对象for active in bpy.context.selected_objects,然后活动对象设置为循环中的下一个对象,该循环遍历所有使用 选定的对象bpy.context.scene.objects.active = active。结果,我们在循环中所做的任何事情都会为选择中的每个对象完成一次并且我们相关对象所做的任何操作都会在所有对象上完成。如果我们只使用第一行并将我们的代码放入for循环中会发生什么?

for active in bpy.context.selected_objects:
    ...

无论我们在循环中做什么,都会对选择中的每个对象执行一次,我们相关对象执行的任何操作都只会在活动对象上执行,但次数与选定对象一样多。这就是为什么我们需要在循环中设置活动对象。

于 2016-07-29T19:17:15.290 回答
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()
于 2016-05-08T02:48:41.807 回答
0

注意:我对搅拌机不是很熟悉

似乎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

于 2016-05-07T13:59:33.337 回答