[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 00:48:24 CET 2011
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. @@
More information about the Bf-blender-cvs
mailing list