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.
This commit is contained in:
2011-02-10 23:48:22 +00:00
parent 46bb5643b7
commit 4612034cf4
62 changed files with 189 additions and 202 deletions

View File

@@ -363,6 +363,8 @@ class RENDER_PT_network_output(NeedValidAddress, NetRenderButtonsPanel, bpy.type
draw = properties_render.RENDER_PT_output.draw
def addProperties():
class NetRenderSettings(bpy.types.IDPropertyGroup):
pass
@@ -372,7 +374,10 @@ class NetRenderSlave(bpy.types.IDPropertyGroup):
class NetRenderJob(bpy.types.IDPropertyGroup):
pass
def addProperties():
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")

View File

@@ -100,9 +100,6 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
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 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
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 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
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 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
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 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
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 @@ def addon_enable(module_name, default_set=True):
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 @@ def addon_enable(module_name, default_set=True):
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 @@ def addon_enable(module_name, default_set=True):
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 @@ def addon_disable(module_name, default_set=True):
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 @@ def user_resource(type, path="", create=False):
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)

View File

@@ -550,85 +550,33 @@ class Text(bpy_types.ID):
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):
@@ -685,7 +633,7 @@ class Macro(StructRNA, metaclass=OrderedMeta):
return ops.macro_define(self, opname)
class IDPropertyGroup(StructRNA, metaclass=RNAMetaRegister):
class IDPropertyGroup(StructRNA, metaclass=RNAMetaIDProp):
__slots__ = ()

View File

@@ -701,4 +701,8 @@ if __name__ == "__main__":
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)

View File

@@ -78,13 +78,12 @@ class DiscontFilterOp(bpy.types.Operator):
main(context)
return {'FINISHED'}
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -195,11 +195,11 @@ class ProjectApply(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -173,11 +173,11 @@ class MeshMirrorUV(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -175,13 +175,11 @@ class BakeAction(bpy.types.Operator):
def register():
pass
# bpy.types.INFO_MT_mesh_add.append(menu_func)
bpy.utils.register_module(__name__)
def unregister():
pass
# bpy.types.INFO_MT_mesh_add.remove(menu_func)
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -565,11 +565,11 @@ class ClearAllRestrictRender(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -287,11 +287,14 @@ def menu_func(self, context):
def register():
bpy.utils.register_module(__name__)
bpy.types.VIEW3D_MT_transform.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.VIEW3D_MT_transform.remove(menu_func)
if __name__ == "__main__":
register()

View File

@@ -154,11 +154,14 @@ def menu_func(self, context):
def register():
bpy.utils.register_module(__name__)
bpy.types.VIEW3D_MT_transform.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.VIEW3D_MT_transform.remove(menu_func)
if __name__ == "__main__":
register()

View File

@@ -354,11 +354,11 @@ class WM_MT_operator_presets(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -147,11 +147,11 @@ class PlayRenderedAnim(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -135,11 +135,11 @@ class SequencerDeinterlaceSelectedMovies(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":

View File

@@ -369,10 +369,12 @@ def menu_func(self, context):
def register():
bpy.utils.register_module(__name__)
bpy.types.IMAGE_MT_uvs.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.IMAGE_MT_uvs.remove(menu_func)
if __name__ == "__main__":

View File

@@ -251,11 +251,14 @@ menu_func = (lambda self, context: self.layout.operator(FollowActiveQuads.bl_idn
def register():
bpy.utils.register_module(__name__)
bpy.types.VIEW3D_MT_uv_map.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.VIEW3D_MT_uv_map.remove(menu_func)
if __name__ == "__main__":
register()

View File

@@ -1130,10 +1130,12 @@ menu_func = (lambda self, context: self.layout.operator(SmartProject.bl_idname,
def register():
bpy.utils.register_module(__name__)
bpy.types.VIEW3D_MT_uv_map.append(menu_func)
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.VIEW3D_MT_uv_map.remove(menu_func)
if __name__ == "__main__":

View File

@@ -180,11 +180,11 @@ class VertexPaintDirt(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -816,11 +816,11 @@ class WM_OT_sysinfo(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -94,12 +94,13 @@ class OnionSkinButtonsPanel():
# NOTE:
# The specialised panel types are derived in their respective UI modules
# dont register these classes since they are only helpers.
def register():
pass
pass # bpy.utils.register_module(__name__)
def unregister():
pass
pass # bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -289,11 +289,11 @@ class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Pa
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -370,11 +370,11 @@ class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -139,11 +139,11 @@ class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.P
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -396,11 +396,11 @@ class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Pan
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -44,11 +44,11 @@ class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -394,11 +394,11 @@ class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -89,11 +89,11 @@ class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Pa
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -355,11 +355,11 @@ class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -119,11 +119,11 @@ class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.P
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -701,11 +701,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -510,11 +510,11 @@ class WORLD_PT_game_physics(WorldButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -896,11 +896,11 @@ class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Pa
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -343,11 +343,11 @@ class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel, bpy.types.Panel)
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -749,11 +749,11 @@ class BONE_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -1158,11 +1158,11 @@ class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, bpy.types.Pa
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -217,11 +217,11 @@ class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -279,11 +279,11 @@ def basic_force_field_falloff_ui(self, context, field):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -217,11 +217,11 @@ class PHYSICS_PT_collision(PhysicButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -282,11 +282,11 @@ class PHYSICS_PT_domain_particles(PhysicButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -205,11 +205,11 @@ class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -262,11 +262,11 @@ class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -675,11 +675,11 @@ class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -311,11 +311,11 @@ class ANIM_OT_keying_set_export(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -1024,11 +1024,11 @@ class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Pane
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -268,11 +268,11 @@ class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -163,11 +163,11 @@ class ConsoleLanguage(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -355,11 +355,11 @@ class DOPESHEET_MT_gpencil_frame(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -75,11 +75,11 @@ class FILEBROWSER_HT_header(bpy.types.Header):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -242,11 +242,11 @@ class GRAPH_MT_key_transform(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -727,11 +727,11 @@ class IMAGE_PT_paint_curve(BrushButtonsPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -404,11 +404,11 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -90,11 +90,11 @@ class LOGIC_MT_view(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -188,11 +188,11 @@ class NLA_MT_edit_transform(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -197,11 +197,11 @@ class NODE_PT_properties(bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -118,11 +118,11 @@ class OUTLINER_MT_edit_datablocks(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -831,11 +831,11 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -295,11 +295,11 @@ class TEXT_MT_toolbox(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -200,11 +200,11 @@ class TIME_MT_autokey(bpy.types.Menu):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -1276,11 +1276,11 @@ class WM_OT_addon_expand(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -787,11 +787,11 @@ class WM_OT_keyconfig_remove(bpy.types.Operator):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -2306,11 +2306,11 @@ class VIEW3D_PT_context_properties(bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@@ -1302,11 +1302,11 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, bpy.types.Panel):
def register():
pass
bpy.utils.register_module(__name__)
def unregister():
pass
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()