[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34765] trunk/blender/release/scripts: patch [#25809] Auto-Registration as utility function.

Campbell Barton ideasman42 at gmail.com
Fri Feb 11 02:15:21 CET 2011


Hi Doug, I should have been more clear that I'll be updating addons next.

In most cases 'bpy.utils.register_module' /
'bpy.utils.unregister_module' just need adding.
example from OBJ i/o (menu registration functions we're already there).

def register():
    bpy.utils.register_module(__name__)

    bpy.types.INFO_MT_file_import.append(menu_func_import)
    bpy.types.INFO_MT_file_export.append(menu_func_export)


def unregister():
    bpy.utils.unregister_module(__name__)

    bpy.types.INFO_MT_file_import.remove(menu_func_import)
    bpy.types.INFO_MT_file_export.remove(menu_func_export)

On Fri, Feb 11, 2011 at 12:09 AM, Doug Hammond
<doughammond at hamsterfight.co.uk> wrote:
> HEY!!
>
> How about letting addon developers know how this new opt-in implementation
> is supposed to work before ploughing ahead and seriously breaking
> everything, again.
>
> I'm not arguing here about whether this is better or not - but as it stands
> now I've no idea now how to initalise my addon !
>
> Yours sincerely annoyed, again,
> Doug.
>
>
> On 10 February 2011 23:48, Campbell Barton <ideasman42 at gmail.com> wrote:
>
>> Revision: 34765
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34765
>> Author:   campbellbarton
>> Date:     2011-02-10 23:48:22 +0000 (Thu, 10 Feb 2011)
>> Log Message:
>> -----------
>> patch [#25809] Auto-Registration as utility function.
>> This removes auto-registration, committed by Martin r30961.
>> Realize this is a contentious topic but Brecht and myself both would rather
>> opt-in registration.
>>
>> TODO:
>> - addons need updating.
>> - class list will be modified to use weakrefs (should have been done for
>> existing system too).
>> - will move bpy.types.(un)register functions into
>> bpy.utils.(un)register_class, currently including these functions in a type
>> list is internally ugly, scripts which loop over types also need to check
>> for these.
>>
>> Revision Links:
>> --------------
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=30961
>>
>> Modified Paths:
>> --------------
>>    trunk/blender/release/scripts/io/netrender/ui.py
>>    trunk/blender/release/scripts/modules/bpy/utils.py
>>    trunk/blender/release/scripts/modules/bpy_types.py
>>    trunk/blender/release/scripts/op/animsys_update.py
>>    trunk/blender/release/scripts/op/fcurve_euler_filter.py
>>    trunk/blender/release/scripts/op/image.py
>>    trunk/blender/release/scripts/op/mesh.py
>>    trunk/blender/release/scripts/op/nla.py
>>    trunk/blender/release/scripts/op/object.py
>>    trunk/blender/release/scripts/op/object_align.py
>>    trunk/blender/release/scripts/op/object_randomize_transform.py
>>    trunk/blender/release/scripts/op/presets.py
>>    trunk/blender/release/scripts/op/screen_play_rendered_anim.py
>>    trunk/blender/release/scripts/op/sequencer.py
>>    trunk/blender/release/scripts/op/uv.py
>>    trunk/blender/release/scripts/op/uvcalc_follow_active.py
>>    trunk/blender/release/scripts/op/uvcalc_smart_project.py
>>    trunk/blender/release/scripts/op/vertexpaint_dirt.py
>>    trunk/blender/release/scripts/op/wm.py
>>    trunk/blender/release/scripts/ui/properties_animviz.py
>>    trunk/blender/release/scripts/ui/properties_data_armature.py
>>    trunk/blender/release/scripts/ui/properties_data_bone.py
>>    trunk/blender/release/scripts/ui/properties_data_camera.py
>>    trunk/blender/release/scripts/ui/properties_data_curve.py
>>    trunk/blender/release/scripts/ui/properties_data_empty.py
>>    trunk/blender/release/scripts/ui/properties_data_lamp.py
>>    trunk/blender/release/scripts/ui/properties_data_lattice.py
>>    trunk/blender/release/scripts/ui/properties_data_mesh.py
>>    trunk/blender/release/scripts/ui/properties_data_metaball.py
>>    trunk/blender/release/scripts/ui/properties_data_modifier.py
>>    trunk/blender/release/scripts/ui/properties_game.py
>>    trunk/blender/release/scripts/ui/properties_material.py
>>    trunk/blender/release/scripts/ui/properties_object.py
>>    trunk/blender/release/scripts/ui/properties_object_constraint.py
>>    trunk/blender/release/scripts/ui/properties_particle.py
>>    trunk/blender/release/scripts/ui/properties_physics_cloth.py
>>    trunk/blender/release/scripts/ui/properties_physics_common.py
>>    trunk/blender/release/scripts/ui/properties_physics_field.py
>>    trunk/blender/release/scripts/ui/properties_physics_fluid.py
>>    trunk/blender/release/scripts/ui/properties_physics_smoke.py
>>    trunk/blender/release/scripts/ui/properties_physics_softbody.py
>>    trunk/blender/release/scripts/ui/properties_render.py
>>    trunk/blender/release/scripts/ui/properties_scene.py
>>    trunk/blender/release/scripts/ui/properties_texture.py
>>    trunk/blender/release/scripts/ui/properties_world.py
>>    trunk/blender/release/scripts/ui/space_console.py
>>    trunk/blender/release/scripts/ui/space_dopesheet.py
>>    trunk/blender/release/scripts/ui/space_filebrowser.py
>>    trunk/blender/release/scripts/ui/space_graph.py
>>    trunk/blender/release/scripts/ui/space_image.py
>>    trunk/blender/release/scripts/ui/space_info.py
>>    trunk/blender/release/scripts/ui/space_logic.py
>>    trunk/blender/release/scripts/ui/space_nla.py
>>    trunk/blender/release/scripts/ui/space_node.py
>>    trunk/blender/release/scripts/ui/space_outliner.py
>>    trunk/blender/release/scripts/ui/space_sequencer.py
>>    trunk/blender/release/scripts/ui/space_text.py
>>    trunk/blender/release/scripts/ui/space_time.py
>>    trunk/blender/release/scripts/ui/space_userpref.py
>>    trunk/blender/release/scripts/ui/space_userpref_keymap.py
>>    trunk/blender/release/scripts/ui/space_view3d.py
>>    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
>>
>> Modified: trunk/blender/release/scripts/io/netrender/ui.py
>> ===================================================================
>> --- trunk/blender/release/scripts/io/netrender/ui.py    2011-02-10 20:54:02
>> UTC (rev 34764)
>> +++ trunk/blender/release/scripts/io/netrender/ui.py    2011-02-10 23:48:22
>> UTC (rev 34765)
>> @@ -363,16 +363,21 @@
>>
>>     draw = properties_render.RENDER_PT_output.draw
>>
>> -class NetRenderSettings(bpy.types.IDPropertyGroup):
>> -    pass
>>
>> -class NetRenderSlave(bpy.types.IDPropertyGroup):
>> -    pass
>> +def addProperties():
>> +    class NetRenderSettings(bpy.types.IDPropertyGroup):
>> +        pass
>>
>> -class NetRenderJob(bpy.types.IDPropertyGroup):
>> -    pass
>> +    class NetRenderSlave(bpy.types.IDPropertyGroup):
>> +        pass
>>
>> -def addProperties():
>> +    class NetRenderJob(bpy.types.IDPropertyGroup):
>> +        pass
>> +
>> +    bpy.types.register(NetRenderSettings)
>> +    bpy.types.register(NetRenderSlave)
>> +    bpy.types.register(NetRenderJob)
>> +
>>     from bpy.props import PointerProperty, StringProperty, BoolProperty,
>> EnumProperty, IntProperty, CollectionProperty
>>     bpy.types.Scene.network_render =
>> PointerProperty(type=NetRenderSettings, name="Network Render",
>> description="Network Render Settings")
>>
>>
>> Modified: trunk/blender/release/scripts/modules/bpy/utils.py
>> ===================================================================
>> --- trunk/blender/release/scripts/modules/bpy/utils.py  2011-02-10 20:54:02
>> UTC (rev 34764)
>> +++ trunk/blender/release/scripts/modules/bpy/utils.py  2011-02-10 23:48:22
>> UTC (rev 34765)
>> @@ -100,9 +100,6 @@
>>     import traceback
>>     import time
>>
>> -    # must be set back to True on exits
>> -    _bpy_types._register_immediate = False
>> -
>>     t_main = time.time()
>>
>>     loaded_modules = set()
>> @@ -112,7 +109,6 @@
>>
>>     if reload_scripts:
>>         _bpy_types.TypeMap.clear()
>> -        _bpy_types.PropertiesMap.clear()
>>
>>         # just unload, dont change user defaults, this means we can sync to
>> reload.
>>         # note that they will only actually reload of the modification time
>> changes.
>> @@ -121,7 +117,6 @@
>>             addon_disable(module_name, default_set=False)
>>
>>     def register_module_call(mod):
>> -        _bpy_types._register_module(mod.__name__)
>>         register = getattr(mod, "register", None)
>>         if register:
>>             try:
>> @@ -132,7 +127,6 @@
>>             print("\nWarning! '%s' has no register function, this is now a
>> requirement for registerable scripts." % mod.__file__)
>>
>>     def unregister_module_call(mod):
>> -        _bpy_types._unregister_module(mod.__name__)
>>         unregister = getattr(mod, "unregister", None)
>>         if unregister:
>>             try:
>> @@ -199,8 +193,6 @@
>>                 for mod in modules_from_path(path, loaded_modules):
>>                     test_register(mod)
>>
>> -    _bpy_types._register_immediate = True
>> -
>>     # deal with addons seperately
>>     addon_reset_all(reload_scripts)
>>
>> @@ -367,12 +359,9 @@
>>     import bpy_types as _bpy_types
>>     import imp
>>
>> -    _bpy_types._register_immediate = False
>> -
>>     def handle_error():
>>         import traceback
>>         traceback.print_exc()
>> -        _bpy_types._register_immediate = True
>>
>>     # reload if the mtime changes
>>     mod = sys.modules.get(module_name)
>> @@ -402,19 +391,13 @@
>>         return None
>>
>>     # 2) try register collected modules
>> -    try:
>> -        _bpy_types._register_module(module_name)
>> -    except:
>> -        handle_error()
>> -        del sys.modules[module_name]
>> -        return None
>> +    # removed, addons need to handle own registration now.
>>
>>     # 3) try run the modules register function
>>     try:
>>         mod.register()
>>     except:
>>         handle_error()
>> -        _bpy_types._unregister_module(module_name)
>>         del sys.modules[module_name]
>>         return None
>>
>> @@ -426,8 +409,6 @@
>>             ext = _bpy.context.user_preferences.addons.new()
>>             ext.module = module_name
>>
>> -    _bpy_types._register_immediate = True
>> -
>>     mod.__addon_enabled__ = True
>>
>>     if _bpy.app.debug:
>> @@ -454,7 +435,6 @@
>>         mod.__addon_enabled__ = False
>>
>>         try:
>> -            _bpy_types._unregister_module(module_name, free=False)  # dont
>> free because we may want to enable again.
>>             mod.unregister()
>>         except:
>>             traceback.print_exc()
>> @@ -594,3 +574,42 @@
>>                 target_path = ""
>>
>>     return target_path
>> +
>> +
>> +_register_types = _bpy.types.Panel, _bpy.types.Operator, _bpy.types.Menu,
>> _bpy.types.Header, _bpy.types.RenderEngine
>> +
>> +
>> +def register_module(module):
>> +    import traceback
>> +    total = 0
>> +    register = _bpy.types.register
>> +    for cls, path, line in _bpy_types.TypeMap.get(module, ()):
>> +        if not "bl_rna" in cls.__dict__:
>> +            total += 1
>> +            try:
>> +                register(cls)
>> +            except:
>> +                print("bpy.utils.register_module(): failed to registering
>> class '%s.%s'" % (cls.__module__, cls.__name__))
>> +                print("\t", path, "line", line)
>> +                traceback.print_exc()
>> +
>> +    if total == 0:
>> +        raise Exception("register_module(%r): defines no classes" %
>> module)
>> +
>> +
>> +def unregister_module(module):
>> +    import traceback
>> +    unregister = _bpy.types.unregister
>> +    total = 0
>> +    for cls, path, line in _bpy_types.TypeMap.get(module, ()):
>> +        if "bl_rna" in cls.__dict__:
>> +            total += 1
>> +            try:
>> +                unregister(cls)
>> +            except:
>> +                print("bpy.utils.unregister_module(): failed to
>> unregistering class '%s.%s'" % (cls.__module__, cls.__name__))
>> +                print("\t", path, "line", line)
>> +                traceback.print_exc()
>> +
>> +    if total == 0:
>> +        raise Exception("unregister_module(%r): defines no classes" %
>> module)
>>
>> Modified: trunk/blender/release/scripts/modules/bpy_types.py
>> ===================================================================
>> --- trunk/blender/release/scripts/modules/bpy_types.py  2011-02-10 20:54:02
>> UTC (rev 34764)
>> +++ trunk/blender/release/scripts/modules/bpy_types.py  2011-02-10 23:48:22
>> UTC (rev 34765)
>> @@ -550,87 +550,35 @@
>>         import bpy
>>         return tuple(obj for obj in bpy.data.objects if self in [cont.text
>> for cont in obj.game.controllers if cont.type == 'PYTHON'])
>>
>> -import collections
>> -
>> +# values are module: [(cls, path, line), ...]
>>  TypeMap = {}
>> -# Properties (IDPropertyGroup) are different from types because they need
>> to be registered
>> -# before adding sub properties to them, so they are registered on
>> definition
>> -# and unregistered on unload
>> -PropertiesMap = {}
>>
>> -# Using our own loading function we set this to false
>> -# so when running a script directly in the text editor
>> -# registers moduals instantly.
>> -_register_immediate = True
>>
>> -
>> -def _unregister_module(module, free=True):
>> -    for t in TypeMap.get(module, ()):
>> -        try:
>> -            bpy_types.unregister(t)
>> -        except:
>> -            import traceback
>> -            print("bpy.utils._unregister_module(): Module '%s' failed to
>> unregister class '%s.%s'" % (module, t.__module__, t.__name__))
>> -            traceback.print_exc()
>> -
>> -    if free == True and module in TypeMap:
>> -        del TypeMap[module]
>> -
>> -    for t in PropertiesMap.get(module, ()):
>> -        try:
>> -            bpy_types.unregister(t)
>> -        except:
>> -            import traceback
>> -            print("bpy.utils._unload_module(): Module '%s' failed to
>> unregister class '%s.%s'" % (module, t.__module__, t.__name__))
>> -            traceback.print_exc()
>> -
>> -    if free == True and module in PropertiesMap:
>> -        del PropertiesMap[module]
>> -
>> -
>> -def _register_module(module):
>> -    for t in TypeMap.get(module, ()):
>> -        try:
>> -            bpy_types.register(t)
>> -        except:
>> -            import traceback
>> -            import sys
>> -            print("bpy.utils._register_module(): '%s' failed to register
>> class '%s.%s'" % (sys.modules[module].__file__, t.__module__, t.__name__))
>> -            traceback.print_exc()
>> -
>> -
>>  class RNAMeta(type):
>> -    @classmethod
>> -    def _register_immediate(cls):
>> -        return _register_immediate
>> -
>>     def __new__(cls, name, bases, classdict, **args):
>> +        import traceback
>>         result = type.__new__(cls, name, bases, classdict)
>>         if bases and bases[0] != StructRNA:
>>             module = result.__module__
>>
>> -            ClassMap = TypeMap
>> -
>> -            # Register right away if needed
>> -            if cls._register_immediate():
>> -                bpy_types.register(result)
>> -                ClassMap = PropertiesMap
>> -
>>             # first part of packages only
>>             if "." in module:
>>                 module = module[:module.index(".")]
>>
>> -            ClassMap.setdefault(module, []).append(result)
>> +            sf = traceback.extract_stack(limit=2)[0]
>>
>> +            TypeMap.setdefault(module, []).append((result, sf[0], sf[1]))
>> +
>>         return result
>>
>>
>> -class RNAMetaRegister(RNAMeta, StructMetaIDProp):
>> -    @classmethod
>> -    def _register_immediate(cls):
>> -        return True
>> +import collections
>>
>>
>> +class RNAMetaIDProp(RNAMeta, StructMetaIDProp):
>> +    pass
>> +
>> +
>>  class OrderedMeta(RNAMeta):
>>
>>     def __init__(cls, name, bases, attributes):
>> @@ -685,7 +633,7 @@
>>         return ops.macro_define(self, opname)
>>
>>
>> -class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister):
>> +class IDPropertyGroup(StructRNA, metaclass=RNAMetaIDProp):
>>         __slots__ = ()
>>
>>
>>
>> Modified: trunk/blender/release/scripts/op/animsys_update.py
>> ===================================================================
>> --- trunk/blender/release/scripts/op/animsys_update.py  2011-02-10 20:54:02
>> UTC (rev 34764)
>> +++ trunk/blender/release/scripts/op/animsys_update.py  2011-02-10 23:48:22
>> UTC (rev 34765)
>> @@ -701,4 +701,8 @@
>>
>>
>>  def register():
>> -    pass
>> +    bpy.utils.register_module(__name__)
>> +
>> +
>> +def unregister():
>> +    bpy.utils.unregister_module(__name__)
>>
>> Modified: trunk/blender/release/scripts/op/fcurve_euler_filter.py
>> ===================================================================
>> --- trunk/blender/release/scripts/op/fcurve_euler_filter.py     2011-02-10
>> 20:54:02 UTC (rev 34764)
>> +++ trunk/blender/release/scripts/op/fcurve_euler_filter.py     2011-02-10
>> 23:48:22 UTC (rev 34765)
>> @@ -78,13 +78,12 @@
>>         main(context)
>>         return {'FINISHED'}
>>
>> -
>>  def register():
>> -    pass
>> +    bpy.utils.register_module(__name__)
>>
>>
>>  def unregister():
>> -    pass
>> +    bpy.utils.unregister_module(__name__)
>>
>>  if __name__ == "__main__":
>>     register()
>>
>> Modified: trunk/blender/release/scripts/op/image.py
>> ===================================================================
>> --- trunk/blender/release/scripts/op/image.py   2011-02-10 20:54:02 UTC
>> (rev 34764)
>>
>> @@ Diff output truncated at 10240 characters. @@
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



-- 
- Campbell


More information about the Bf-committers mailing list