[Bf-extensions-cvs] [26606316] master: Rigify: move drivers together with constraints and code improvement.

Alexander Gavrilov noreply at git.blender.org
Mon Jan 4 10:30:59 CET 2021


Commit: 2660631657c4b38e4ee9653c6395988bb9ca8313
Author: Alexander Gavrilov
Date:   Mon Jan 4 11:48:24 2021 +0300
Branches: master
https://developer.blender.org/rBA2660631657c4b38e4ee9653c6395988bb9ca8313

Rigify: move drivers together with constraints and code improvement.

===================================================================

M	rigify/rigs/basic/pivot.py
M	rigify/rigs/basic/raw_copy.py
M	rigify/rigs/basic/super_copy.py
M	rigify/utils/bones.py
M	rigify/utils/mechanism.py

===================================================================

diff --git a/rigify/rigs/basic/pivot.py b/rigify/rigs/basic/pivot.py
index 963d1fbe..0301790f 100644
--- a/rigify/rigs/basic/pivot.py
+++ b/rigify/rigs/basic/pivot.py
@@ -24,7 +24,6 @@ from ...base_rig import BaseRig
 
 from ...utils.naming import make_derived_name
 from ...utils.bones import set_bone_widget_transform
-from ...utils.mechanism import copy_custom_properties_with_ui
 from ...utils.widgets import layout_widget_dropdown, create_registered_widget
 from ...utils.widgets_basic import create_pivot_widget
 from ...utils.switch_parent import SwitchParentBuilder
@@ -119,9 +118,7 @@ class Rig(BaseRig):
         ctrl = self.bones.ctrl
         main_ctl = ctrl.master if self.make_control else ctrl.pivot
 
-        self.copy_bone_properties(org, main_ctl, props=False)
-
-        copy_custom_properties_with_ui(self, org, main_ctl)
+        self.copy_bone_properties(org, main_ctl, ui_controls=True)
 
 
     def rig_bones(self):
diff --git a/rigify/rigs/basic/raw_copy.py b/rigify/rigs/basic/raw_copy.py
index 2ebbe133..e562038c 100644
--- a/rigify/rigs/basic/raw_copy.py
+++ b/rigify/rigs/basic/raw_copy.py
@@ -21,7 +21,7 @@
 import bpy
 
 from ...utils.naming import strip_org, strip_prefix, choose_derived_bone, is_control_bone
-from ...utils.mechanism import copy_custom_properties_with_ui
+from ...utils.mechanism import copy_custom_properties_with_ui, move_all_constraints
 from ...utils.widgets import layout_widget_dropdown, create_registered_widget
 
 from ...base_rig import BaseRig
@@ -66,13 +66,7 @@ class RelinkConstraintsMixin:
 
     def relink_move_constraints(self, from_bone, to_bone, *, prefix=''):
         if self.params.relink_constraints:
-            src = self.get_bone(from_bone).constraints
-            dest = self.get_bone(to_bone).constraints
-
-            for con in list(src):
-                if con.name.startswith(prefix):
-                    dest.copy(con)
-                    src.remove(con)
+            move_all_constraints(self.obj, from_bone, to_bone, prefix=prefix)
 
 
     def relink_bone_parent(self, bone_name):
diff --git a/rigify/rigs/basic/super_copy.py b/rigify/rigs/basic/super_copy.py
index 19047579..e2f70842 100644
--- a/rigify/rigs/basic/super_copy.py
+++ b/rigify/rigs/basic/super_copy.py
@@ -23,7 +23,6 @@ import bpy
 from ...base_rig import BaseRig
 
 from ...utils.naming import strip_org, make_deformer_name
-from ...utils.mechanism import copy_custom_properties_with_ui
 from ...utils.widgets import layout_widget_dropdown, create_registered_widget
 from ...utils.widgets_basic import create_bone_widget
 
@@ -78,9 +77,7 @@ class Rig(BaseRig, RelinkConstraintsMixin):
         bones = self.bones
 
         if self.make_control:
-            self.copy_bone_properties(bones.org, bones.ctrl, props=False)
-
-            copy_custom_properties_with_ui(self, bones.org, bones.ctrl)
+            self.copy_bone_properties(bones.org, bones.ctrl)
 
 
     def rig_bones(self):
diff --git a/rigify/utils/bones.py b/rigify/utils/bones.py
index 0142922c..7f178481 100644
--- a/rigify/utils/bones.py
+++ b/rigify/utils/bones.py
@@ -24,7 +24,7 @@ from mathutils import Vector, Matrix, Color
 from rna_prop_ui import rna_idprop_ui_prop_get
 
 from .errors import MetarigError
-from .naming import get_name, make_derived_name
+from .naming import get_name, make_derived_name, is_control_bone
 from .misc import pairwise
 
 #=======================
@@ -391,9 +391,19 @@ class BoneUtilityMixin(object):
         self.register_new_bone(name, bone_name)
         return name
 
-    def copy_bone_properties(self, src_name, tgt_name, **kwargs):
+    def copy_bone_properties(self, src_name, tgt_name, *, props=True, ui_controls=None, **kwargs):
         """Copy pose-mode properties of the bone."""
-        copy_bone_properties(self.obj, src_name, tgt_name, **kwargs)
+        if props:
+            if ui_controls is None and is_control_bone(tgt_name) and hasattr(self, 'script'):
+                ui_controls = [tgt_name]
+            elif ui_controls is True:
+                ui_controls = self.bones.flatten('ctrl')
+
+        copy_bone_properties(self.obj, src_name, tgt_name, props=props and not ui_controls, **kwargs)
+
+        if props and ui_controls:
+            from .mechanism import copy_custom_properties_with_ui
+            copy_custom_properties_with_ui(self, src_name, tgt_name, ui_controls=ui_controls)
 
     def rename_bone(self, old_name, new_name):
         """Rename the bone, returning the actual new name."""
diff --git a/rigify/utils/mechanism.py b/rigify/utils/mechanism.py
index 80ca4d29..234caaaf 100644
--- a/rigify/utils/mechanism.py
+++ b/rigify/utils/mechanism.py
@@ -337,6 +337,48 @@ def driver_var_transform(target, bone=None, *, type='LOC_X', space='WORLD', rota
     return { 'type': 'TRANSFORMS', 'targets': [ target_map ] }
 
 
+#=============================================
+# Constraint management
+#=============================================
+
+def move_constraint(source, target, con):
+    """
+    Move a constraint from one owner to another, together with drivers.
+    """
+
+    assert source.constraints[con.name] == con
+
+    if isinstance(target, str):
+        target = con.id_data.pose.bones[target]
+
+    con_tgt = target.constraints.copy(con)
+
+    if target.id_data == con.id_data:
+        adt = con.id_data.animation_data
+        if adt:
+            prefix = con.path_from_id()
+            new_prefix = con_tgt.path_from_id()
+            for fcu in adt.drivers:
+                if fcu.data_path.startswith(prefix):
+                    fcu.data_path = new_prefix + fcu.data_path[len(prefix):]
+
+    source.constraints.remove(con)
+
+def move_all_constraints(obj, source, target, *, prefix=''):
+    """
+    Move all constraints with the specified name prefix from one bone to another.
+    """
+
+    if isinstance(source, str):
+        source = obj.pose.bones[source]
+    if isinstance(target, str):
+        target = obj.pose.bones[target]
+
+    for con in list(source.constraints):
+        if con.name.startswith(prefix):
+            move_constraint(source, target, con)
+
+
 #=============================================
 # Custom property management
 #=============================================



More information about the Bf-extensions-cvs mailing list