Blender 3D加载项脚本加载失败

时间:2013-11-30 15:34:03

标签: python api blender bpy

标题

我制作了附加脚本。

但是在blender UI中加载失败。

错误消息是'_RestrictContext'对象没有属性'scene'。

但是这个脚本在文本编辑器的混合器中运行良好。

为什么不加载这个附加组件?

bl_info = {
    "name": "Add Cube",
    "author": "jsh",
    "version": (1, 0),
    "blender": (2, 68, 0),
    "location": "View3D > Tool Shelf > Text make",
    "description": "Adds a new Mesh Object",
    "warning": "",
    "wiki_url": "",
    "tracker_url": "http://togetherall.infomaster.co.kr",
    "category": "Object"}



import bpy
from bpy.props import *

#
#    Store properties in the active scene
#
def initSceneProperties(scn):
    bpy.types.Scene.MyInt = IntProperty(
        name = "Integer", 
        description = "Enter an integer")
    scn['MyInt'] = 17

    bpy.types.Scene.MyFloat = FloatProperty(
        name = "Float", 
        description = "Enter a float",
        default = 33.33,
        min = -100,
        max = 100)

    bpy.types.Scene.MyBool = BoolProperty(
        name = "Boolean", 
        description = "True or False?")
    scn['MyBool'] = True

    bpy.types.Scene.MyEnum = EnumProperty(
        items = [('Eine', 'Un', 'One'), 
                 ('Zwei', 'Deux', 'Two'),
                 ('Drei', 'Trois', 'Three')],
        name = "Ziffer")
    scn['MyEnum'] = 2

    bpy.types.Scene.MyString = StringProperty(
        name = "String2")
    scn['MyString'] = "Lorem ipsum dolor sit amet"
    return

initSceneProperties(bpy.context.scene)

#
#    Menu in UI region
#
class UIPanel(bpy.types.Panel):
    bl_label = "Make Text"
    bl_space_type = "VIEW_3D"
    #bl_region_type = "UI"
    bl_region_type = "TOOL_PROPS"


    def draw(self, context):
        layout = self.layout
        scn = context.scene
        layout.prop(scn, 'MyInt', icon='BLENDER', toggle=True)
        layout.prop(scn, 'MyFloat')
        layout.prop(scn, 'MyBool')
        layout.prop(scn, 'MyEnum')
        layout.prop(scn, 'MyString')
        layout.operator("idname_must.be_all_lowercase_and_contain_one_dot")

#
#    The button prints the values of the properites in the console.
#

class OBJECT_OT_PrintPropsButton(bpy.types.Operator):
    bl_idname = "idname_must.be_all_lowercase_and_contain_one_dot"
    bl_label = "make"

    def execute(self, context):
        bpy.ops.mesh.primitive_cube_add()       
        return{'FINISHED'}    

def printProp(label, key, scn):
    try:
        val = scn[key]
    except:
        val = 'Undefined'
    #print("%s %s" % (key, val))
    return val



def register():
    bpy.utils.register_class(UIPanel)
    bpy.utils.register_class(OBJECT_OT_PrintPropsButton)

def unregister():
    bpy.utils.unregister_class(UIPanel)
    bpy.utils.unregister_class(OBJECT_OT_PrintPropsButton)



if __name__ == "__main__":
    register()

1 个答案:

答案 0 :(得分:1)

Blender在插件的register / unregsiter阶段使用所谓的RestrictContext。这意味着,您不允许对上下文执行某些操作,因为内容可能尚未准备就绪。

在您的情况下,您在全局模块范围内执行initSceneProperties(bpy.context.scene),这意味着它将在加载该模块后立即执行。例如,在运算符的execute()方法中移动该初始化代码,并在首次运行运算符时执行,或者在有意义的任何其他位置执行此操作(尽早,尽可能早)。

有关如何执行此操作的示例,请参阅RestrictContext上的文档。