【问题标题】:Blender: Python script fail (creating simple operator)Blender:Python 脚本失败(创建简单运算符)
【发布时间】:2014-07-13 02:21:59
【问题描述】:

我正在 Blender 中自学 Python,并尝试使用脚本创建一个简单的运算符。脚本如下 - 它的目的是在场景中选择四个(聚光灯)灯并改变它们的能量(基本上是打开和关闭灯)。但是当我尝试运行脚本时,我收到“Python 脚本失败”错误消息。谁能看出代码有什么问题?

import bpy


def main(context):
    for ob in context.scene.objects:
        print(ob)

class LightsOperator(bpy.types.Operator):

    bl_idname = "object.lights_operator"
    bl_label = "Headlight Operator"

    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        light1 = bpy.data.objects['headlight1']
        light2 = bpy.data.objects['headlight2']
        light3 = bpy.data.objects['headlight3']
        light4 = bpy.data.objects['headlight4']

        if light1.energy==0.0:
            light1.energy = 0.8
        else:
            light1.energy = 0.0

        if light2.energy==0.0:
            light2.energy = 0.8
        else:
            light2.energy = 0.0

        if light3.energy==0.0:
            light3.energy = 0.8
        else:
            light3.energy = 0.0

        if light4.energy==0.0:
            light4.energy = 0.8
        else:
            light4.energy = 0.0

        return {'FINISHED'}

    def register():
        bpy.utils.register_class(LightsOperator)


    def unregister():
        bpy.utils.unregister_class(LightsOperator)

if __name__ == "__main__":
 register()

 # test call
 bpy.ops.object.lights_operator()

【问题讨论】:

  • 这是实际的缩进吗?
  • 我也推荐你在this dedicated StackExchange site上发布关于搅拌机的问题
  • 我建议在搅拌机专业 python 之外学习 python ...搅拌机 python 可能会使用一些被认为不符合 Python 或违反直觉的东西。
  • 我在你的问题中修正了缩进......如果这真的是你的缩进,我会认真考虑这是罪魁祸首
  • Joran 我复制了一个带有您精确缩进的新版本,但它仍然无法正常工作。

标签: python python-3.x blender


【解决方案1】:

第一个问题是缩进(不确定这是否随着编辑而改变)- register 和 unregister 是缩进的,这使它们成为它们不应该成为的类的一部分,取消缩进以使它们成为模块功能。这将使 register() 的调用正常工作,以便您的课程可以作为bpy.ops.object.lights_operator()使用

主要问题是能量不是物体的属性,当物体是光时,你会在数据下找到能量属性。

if light1.data.energy==0.0:
    light1.data.energy = 0.8
else:
    light1.data.energy = 0.0

您可以进行的其他一些改进 -

在投票功能中,您可以更具体。不要只选择某些东西,而是检查它是否接近您想要的。

return context.active_object.type == 'LAMP'

您可以使用循环和测试来为每个对象使用相同的代码,而不是为每个对象重新键入相同的代码。这可能会给你留下这个更短的脚本 -

import bpy

class LightsOperator(bpy.types.Operator):
    bl_idname = "object.lights_operator"
    bl_label = "Headlight Operator"

    @classmethod
    def poll(cls, context):
        return context.active_object.type == 'LAMP'

    def execute(self, context):
        for object in bpy.data.objects:
            # object.name[:9] will give us the first 9 characters of the name
            if object.type == 'LAMP' and object.name[:9] == 'headlight':
                if object.data.energy == 0.0:
                    object.data.energy = 0.8
                else:
                    object.data.energy = 0.0
        return {'FINISHED'}

def register():
    bpy.utils.register_class(LightsOperator)


def unregister():
    bpy.utils.unregister_class(LightsOperator)

if __name__ == "__main__":
    register()

# test call
bpy.ops.object.lights_operator()

【讨论】:

  • 我相信新的投票功能已经修复了它!谢谢sambler!
猜你喜欢
  • 2014-01-13
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2012-11-13
  • 2016-03-29
  • 2019-06-26
相关资源
最近更新 更多