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



标题

我制作了附加脚本。

然而,在搅拌机UI中加载失败。

错误消息为"_RestrictContext"对象没有属性"scene"。

但这个脚本在文本编辑器的blender中运行得非常好。

为什么不加载此加载项?

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()

Blender在插件的注册/卸载阶段使用所谓的RestrictContext。这意味着,不允许对上下文执行某些操作,因为内容可能还没有准备好。

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

有关如何做到这一点的示例,请参阅RestrictContext上的文档。

相关内容

  • 没有找到相关文章

最新更新