diff --git a/rigify/ui.py b/rigify/ui.py index 7f59e4b422616ff8d12de260952fecb000bbf196..005aed800be44c3b5a55413c05a55748e7005a4f 100644 --- a/rigify/ui.py +++ b/rigify/ui.py @@ -725,7 +725,7 @@ def rigify_report_exception(operator, exception): message.reverse() # XXX - stupid! menu's are upside down! - operator.report({'INFO'}, '\n'.join(message)) + operator.report({'ERROR'}, '\n'.join(message)) class LayerInit(bpy.types.Operator): @@ -761,6 +761,13 @@ class Generate(bpy.types.Operator): traceback.print_exc() rigify_report_exception(self, rig_exception) + except Exception as rig_exception: + import traceback + traceback.print_exc() + + self.report({'ERROR'}, 'Generation has thrown an exception: ' + str(rig_exception)) + finally: + bpy.ops.object.mode_set(mode='OBJECT') return {'FINISHED'} diff --git a/rigify/utils/switch_parent.py b/rigify/utils/switch_parent.py index d43e08303837d1ba8554d9b09a8366963112136e..b536048da700f514c3cc3e56820c4b73ff69d1e4 100644 --- a/rigify/utils/switch_parent.py +++ b/rigify/utils/switch_parent.py @@ -13,7 +13,8 @@ from .misc import map_list, map_apply, force_lazy from ..base_rig import * from ..base_generate import GeneratorPlugin -from itertools import count, repeat +from collections import defaultdict +from itertools import count, repeat, chain def _rig_is_child(rig, parent): @@ -40,7 +41,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): self.child_list = [] self.global_parents = [] - self.local_parents = [] + self.local_parents = defaultdict(list) self.child_map = {} self.frozen = False @@ -77,7 +78,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): if is_global: self.global_parents.append(entry) else: - self.local_parents.append(entry) + self.local_parents[id(rig)].append(entry) def build_child(self, rig, bone, *, use_parent_mch=True, **options): @@ -171,16 +172,28 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): child[name] = value + def get_rig_parent_candidates(self, rig): + candidates = [] + + # Build a list in parent hierarchy order + while rig: + candidates.append(self.local_parents[id(rig)]) + rig = rig.rigify_parent + + candidates.append(self.global_parents) + + return list(chain.from_iterable(reversed(candidates))) + def generate_bones(self): self.frozen = True - self.parent_list = self.global_parents + self.local_parents + self.parent_list = self.global_parents + list(chain.from_iterable(self.local_parents.values())) # Link children to parents for child in self.child_list: child_rig = child['context_rig'] or child['rig'] parents = [] - for parent in self.parent_list: + for parent in self.get_rig_parent_candidates(child_rig): if parent['rig'] is child_rig: if parent['exclude_self'] or child['exclude_self']: continue