[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34765] trunk/blender/release/scripts: patch [#25809] Auto-Registration as utility function.
Doug Hammond
doughammond at hamsterfight.co.uk
Fri Feb 11 01:09:57 CET 2011
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
>
More information about the Bf-committers
mailing list