Blender:Python脚本失败(创建简单操作符)
我正在自学Python,并在Blender这个软件里尝试用脚本创建一个简单的操作。下面是我的脚本,它的目的是选择场景中的四个(点)灯,并改变它们的能量(简单来说,就是让灯开和关)。但是当我尝试运行这个脚本时,出现了“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()
1 个回答
1
第一个问题是缩进(不确定这是否在编辑时改变了)——register和unregister的缩进让它们看起来像是类的一部分,但其实它们不应该这样。把它们的缩进去掉,这样它们就变成模块函数了。这样调用register()就能正常工作,你的类就可以通过 bpy.ops.object.lights_operator()
来使用。
主要的问题是能量(energy)并不是一个对象的属性,当对象是灯光时,你可以在数据部分找到能量属性。
if light1.data.energy==0.0:
light1.data.energy = 0.8
else:
light1.data.energy = 0.0
你还可以做一些其他的改进——
在poll函数中,你可以更具体一些。与其只是检查是否有东西被选中,不如检查它是否接近你想要的东西。
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()