【问题标题】:Loop doesn't work, 3-lines python code循环不起作用,3行python代码
【发布时间】:2016-09-02 10:52:45
【问题描述】:

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

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

我简化了(3 行代码)以便于解决问题。

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

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

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

我在这里做错了什么??

谢谢

【问题讨论】:

  • 我修正了缩进,但如果缩进是你执行它的方式,请告诉我。
  • 是的@eandersson 没错,我曾经这样执行它,谢谢,但是,我真的不明白为什么这会在脚本编辑器中产生问题:s,谢谢编辑:)
  • 你可能想对x做一些操作。我不知道 Blender,所以我不能建议如何在这里做任何你想做的事情。
  • 给定一袋苹果,你会做for apple in bag: eat bag。你可能想要for apple in bag: eat applex - 一个随机名称 - 依次指向对象中的每个对象,但您不x 进行任何操作。
  • 在编写 1 行代码之前,您可能需要更好地学习 Python 和 blender ......或者甚至在这里提问(参见 How much research effort is expected of Stack Overflow users?)。

标签: python python-2.7 blender blender-2.76


【解决方案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
    ...

他的 cmets 解释得很好,但我会更进一步。如您所知,Blender 缺少内置的多对象编辑,so you have selected objects and one active object。如果您尝试从 python 或 Blender 的 gui 本身设置它的值,active 对象是您可以编辑的对象。所以虽然我们每次写的略有不同,但效果是一样的。我们使用for active in bpy.context.selected_objects 遍历所有选定 对象,然后我们设置 活动对象为循环中的下一个遍历all 使用bpy.context.scene.objects.active = active 选择的对象。结果,我们在循环中所做的任何事情都会为选择中的每个对象完成一次并且我们所做的任何操作所讨论的对象都会完成所有的对象。如果我们只使用第一行并将我们的代码放在for 循环中会发生什么?

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

我们在循环中所做的任何事情都会对选择中的每个对象执行一次但是我们对进行的任何操作都只会在有问题的对象上完成活动对象,但次数与选定对象一样多。这就是为什么我们需要在循环中设置活动对象。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那是一种魅力^_^,这就是我喜欢stackoverflow的原因,因为像你这样的人^_^,我知道我必须更改活动对象但不知道怎么样,非常非常非常感谢兄弟,你拯救了一天:D
    • sambler:如果您还告诉 OP 您在哪里发现了搅拌机操作员的工作原理,这将是一个更好的答案。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的帮助兄弟,但不幸的是它做了同样的事情....感谢您的帮助,我真的很感激:)
    • 对于覆盖,您需要设置 active_object 而不是 selected_objects。不幸的是,在此运算符中使用覆盖似乎不起作用。
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多