1818modules = None
1919ordered_classes = None
2020
21+
2122def init ():
2223 global modules
2324 global ordered_classes
2425
2526 modules = get_all_submodules (Path (__file__ ).parent )
2627 ordered_classes = get_ordered_classes_to_register (modules )
2728
29+
2830def register ():
2931 for cls in ordered_classes :
3032 bpy .utils .register_class (cls )
@@ -35,6 +37,7 @@ def register():
3537 if hasattr (module , "register" ):
3638 module .register ()
3739
40+
3841def unregister ():
3942 for cls in reversed (ordered_classes ):
4043 bpy .utils .unregister_class (cls )
@@ -49,13 +52,16 @@ def unregister():
4952# Import modules
5053#################################################
5154
55+
5256def get_all_submodules (directory ):
5357 return list (iter_submodules (directory , __package__ ))
5458
59+
5560def iter_submodules (path , package_name ):
5661 for name in sorted (iter_submodule_names (path )):
5762 yield importlib .import_module ("." + name , package_name )
5863
64+
5965def iter_submodule_names (path , root = "" ):
6066 for _ , module_name , is_package in pkgutil .iter_modules ([str (path )]):
6167 if is_package :
@@ -69,29 +75,34 @@ def iter_submodule_names(path, root=""):
6975# Find classes to register
7076#################################################
7177
78+
7279def get_ordered_classes_to_register (modules ):
7380 return toposort (get_register_deps_dict (modules ))
7481
82+
7583def get_register_deps_dict (modules ):
7684 my_classes = set (iter_my_classes (modules ))
77- my_classes_by_idname = {cls .bl_idname : cls for cls in my_classes if hasattr (cls , "bl_idname" )}
85+ my_classes_by_idname = {cls .bl_idname : cls for cls in my_classes if hasattr (cls , "bl_idname" )}
7886
7987 deps_dict = {}
8088 for cls in my_classes :
8189 deps_dict [cls ] = set (iter_my_register_deps (cls , my_classes , my_classes_by_idname ))
8290 return deps_dict
8391
92+
8493def iter_my_register_deps (cls , my_classes , my_classes_by_idname ):
8594 yield from iter_my_deps_from_annotations (cls , my_classes )
8695 yield from iter_my_deps_from_parent_id (cls , my_classes_by_idname )
8796
97+
8898def iter_my_deps_from_annotations (cls , my_classes ):
8999 for value in typing .get_type_hints (cls , {}, {}).values ():
90100 dependency = get_dependency_from_annotation (value )
91101 if dependency is not None :
92102 if dependency in my_classes :
93103 yield dependency
94104
105+
95106def get_dependency_from_annotation (value ):
96107 if blender_version >= (2 , 93 ):
97108 if isinstance (value , bpy .props ._PropertyDeferred ):
@@ -102,6 +113,7 @@ def get_dependency_from_annotation(value):
102113 return value [1 ]["type" ]
103114 return None
104115
116+
105117def iter_my_deps_from_parent_id (cls , my_classes_by_idname ):
106118 if issubclass (cls , bpy .types .Panel ):
107119 parent_idname = getattr (cls , "bl_parent_id" , None )
@@ -110,38 +122,54 @@ def iter_my_deps_from_parent_id(cls, my_classes_by_idname):
110122 if parent_cls is not None :
111123 yield parent_cls
112124
125+
113126def iter_my_classes (modules ):
114127 base_types = get_register_base_types ()
115128 for cls in get_classes_in_modules (modules ):
116129 if any (issubclass (cls , base ) for base in base_types ):
117130 if not getattr (cls , "is_registered" , False ):
118131 yield cls
119132
133+
120134def get_classes_in_modules (modules ):
121135 classes = set ()
122136 for module in modules :
123137 for cls in iter_classes_in_module (module ):
124138 classes .add (cls )
125139 return classes
126140
141+
127142def iter_classes_in_module (module ):
128143 for value in module .__dict__ .values ():
129144 if inspect .isclass (value ):
130145 yield value
131146
147+
132148def get_register_base_types ():
133- return set (getattr (bpy .types , name ) for name in [
134- "Panel" , "Operator" , "PropertyGroup" ,
135- "AddonPreferences" , "Header" , "Menu" ,
136- "Node" , "NodeSocket" , "NodeTree" ,
137- "UIList" , "RenderEngine" ,
138- "Gizmo" , "GizmoGroup" ,
139- ])
149+ return set (
150+ getattr (bpy .types , name )
151+ for name in [
152+ "Panel" ,
153+ "Operator" ,
154+ "PropertyGroup" ,
155+ "AddonPreferences" ,
156+ "Header" ,
157+ "Menu" ,
158+ "Node" ,
159+ "NodeSocket" ,
160+ "NodeTree" ,
161+ "UIList" ,
162+ "RenderEngine" ,
163+ "Gizmo" ,
164+ "GizmoGroup" ,
165+ ]
166+ )
140167
141168
142169# Find order to register to solve dependencies
143170#################################################
144171
172+
145173def toposort (deps_dict ):
146174 sorted_list = []
147175 sorted_values = set ()
@@ -153,5 +181,5 @@ def toposort(deps_dict):
153181 sorted_values .add (value )
154182 else :
155183 unsorted .append (value )
156- deps_dict = {value : deps_dict [value ] - sorted_values for value in unsorted }
184+ deps_dict = {value : deps_dict [value ] - sorted_values for value in unsorted }
157185 return sorted_list
0 commit comments