blender python增加一个整数

时间:2018-04-06 10:12:33

标签: python integer increment blender

我很确定这已经得到了解答,但我似乎无法找到它。 我想要的是Blender的python脚本,它创建一个包含按钮的自定义选项卡。按下该按钮时,它会打印一个整数的值并使其递增,这样当您再次按下该按钮时,它会显示一个递增的值。除了增量部分外,一切似乎都有效。

以下是我目前使用的代码:

===

import bpy

from bpy.props import (IntProperty,)
from bpy.types import (Panel, Operator, AddonPreferences, PropertyGroup,)

def main(context): 
    my_number += 1
    print(str(my_number))

class MySettings(PropertyGroup):

    my_number = IntProperty(
        name="Int property",
        description="This is an integer.",
        default = 1
        )

class AddOne(bpy.types.Operator):
    """This is an operator"""
    bl_idname = "op.add_one"
    bl_label = "Increment by 1"

    def execute(self, context):
        main(context)
        return {'FINISHED'}

class CreatePanel(bpy.types.Panel):

    bl_label = "Render Setup Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'NODE_EDITOR'
    bl_region_type = 'TOOLS'
    bl_category = "Increment by 1 Tab"

    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.operator("op.add_one")

def register():
    bpy.utils.register_class(AddOne)
    bpy.utils.register_class(MySettings)
    bpy.utils.register_class(CreatePanel)

def unregister():
    bpy.utils.unregister_class(AddOne)  
    bpy.utils.unregister_class(MySettings) 
    bpy.utils.unregister_class(CreatePanel)

if __name__ == "__main__":
    register()

===

然而,当我按下按钮'增加1'时,我收到以下错误:

"本地变量' my_number'在分配之前引用"

本练习的目的只是创建一个整数变量,存储它,然后递增它的值并打印出来。

编辑:我添加了实际的代码,而不是它的图像。

2 个答案:

答案 0 :(得分:0)

一般来说,这个问题"本地变量' my_number'在分配之前引用" 是在代码中包含' my_number' 变量并且您没有在代码顶部或在使用该变量之前初始化该变量时一件事。

声明my_number=0,然后对my_number变量进行计算。

答案 1 :(得分:0)

变量my_number在类MySettings中定义 - 它只能通过该类访问,无论是在同样属于类的方法内部(self.my_number)或者直接作为属性的一部分属性(settings_instance.my_number)。

您需要在运算符和面板之外找到一个存储持久变量的位置。将custom property添加到objectscene类型是常见选项。当您在节点编辑器中显示面板时,可能需要将其添加到material以使其特定于材质,而不是全局到场景。您可以在插件register()中定义这些属性,并在unregister()中删除它们。

def register():
    bpy.types.Scene.my_settings = bpy.props.PointerProperty(type=MySettings)

def unregister():
    del bpy.types.Scene.my_settings

然后在您的运算符(或main()函数)和面板中,您可以通过context参数访问该变量。

context.scene.my_settings.my_number += 1

将它们放在您的示例中,并带有标签以显示值 -

import bpy

from bpy.props import (IntProperty,)
from bpy.types import (Panel, Operator, AddonPreferences, PropertyGroup,)

def main(context):
    context.scene.my_settings.my_number += 1
    print(str(context.scene.my_settings.my_number))

class MySettings(PropertyGroup):

    my_number = IntProperty(
        name="Int property",
        description="This is an integer.",
        default = 1
        )

class AddOne(Operator):
    """This is an operator"""
    bl_idname = "op.add_one"
    bl_label = "Increment by 1"

    def execute(self, context):
        main(context)
        return {'FINISHED'}

class CreatePanel(Panel):

    bl_label = "Render Setup Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'NODE_EDITOR'
    bl_region_type = 'TOOLS'
    bl_category = "Increment by 1 Tab"

    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.operator("op.add_one")
        row = layout.row()
        row.label(text='Value is: '+str(context.scene.my_settings.my_number))

def register():
    bpy.utils.register_class(AddOne)
    bpy.utils.register_class(MySettings)
    bpy.utils.register_class(CreatePanel)
    bpy.types.Scene.my_settings = bpy.props.PointerProperty(type=MySettings)

def unregister():
    bpy.utils.unregister_class(AddOne)
    bpy.utils.unregister_class(MySettings)
    bpy.utils.unregister_class(CreatePanel)
    del bpy.types.Scene.my_settings

if __name__ == "__main__":
    register()

你会发现blender.stackexchange是一个更好的地方,可以请求blender特定的python帮助。