我在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()
答案 0 :(得分:0)
第一个问题是缩进(不确定这是否随着编辑而改变) - 注册和取消注册是缩进的,这使得它们成为他们不应该成为的类的一部分,取消它们以使它们成为模块函数。这将调用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()