[Bf-extensions-cvs] [7e8663fc] master: Rigify: add a few utilities for working with existing custom properties.

Alexander Gavrilov noreply at git.blender.org
Thu Jul 2 16:38:34 CEST 2020


Commit: 7e8663fcbcadbf0095a046d931ead6a817528508
Author: Alexander Gavrilov
Date:   Thu Jul 2 17:37:13 2020 +0300
Branches: master
https://developer.blender.org/rBA7e8663fcbcadbf0095a046d931ead6a817528508

Rigify: add a few utilities for working with existing custom properties.

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

M	rigify/utils/mechanism.py

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

diff --git a/rigify/utils/mechanism.py b/rigify/utils/mechanism.py
index 33c098dc..3e7b2990 100644
--- a/rigify/utils/mechanism.py
+++ b/rigify/utils/mechanism.py
@@ -19,8 +19,10 @@
 # <pep8 compliant>
 
 import bpy
+import re
 
-from rna_prop_ui import rna_idprop_ui_create
+from rna_prop_ui import rna_idprop_ui_create, rna_idprop_ui_prop_get
+from rna_prop_ui import rna_idprop_quote_path as quote_property
 
 #=============================================
 # Constraint creation utilities
@@ -143,14 +145,21 @@ def _init_driver_target(drv_target, var_info, target_id):
             if isinstance(subtarget, str):
                 subtarget = target_id.pose.bones[subtarget]
 
+            if subtarget == target_id:
+                path = ''
+            else:
+                path = subtarget.path_from_id()
+
             # Use ".foo" type path items verbatim, otherwise quote
-            path = subtarget.path_from_id()
             for item in refs:
                 if isinstance(item, str):
-                    path += item if item[0] == '.' else '["'+item+'"]'
+                    path += item if item[0] == '.' else quote_property(item)
                 else:
                     path += '[%r]' % (item)
 
+            if path[0] == '.':
+                path = path[1:]
+
         drv_target.id = target_id
         drv_target.data_path = path
 
@@ -298,6 +307,91 @@ def driver_var_transform(target, bone=None, *, type='LOC_X', space='WORLD', rota
     return { 'type': 'TRANSFORMS', 'targets': [ target_map ] }
 
 
+#=============================================
+# Custom property management
+#=============================================
+
+def deactivate_custom_properties(obj, *, reset=True):
+    """Disable drivers on custom properties and reset values to default."""
+
+    prefix = '["'
+
+    if obj != obj.id_data:
+        prefix = obj.path_from_id() + prefix
+
+    adt = obj.id_data.animation_data
+    if adt:
+        for fcu in adt.drivers:
+            if fcu.data_path.startswith(prefix):
+                fcu.mute = True
+
+    if reset:
+        for key, value in obj.items():
+            valtype = type(value)
+            if valtype in {int, float}:
+                info = rna_idprop_ui_prop_get(obj, key, False) or {}
+                obj[key] = valtype(info.get("default", 0))
+
+
+def reactivate_custom_properties(obj):
+    """Re-enable drivers on custom properties."""
+
+    prefix = '["'
+
+    if obj != obj.id_data:
+        prefix = obj.path_from_id() + prefix
+
+    adt = obj.id_data.animation_data
+    if adt:
+        for fcu in adt.drivers:
+            if fcu.data_path.startswith(prefix):
+                fcu.mute = False
+
+
+def copy_custom_properties(src, dest, *, prefix='', dest_prefix='', link_driver=False):
+    """Copy custom properties with filtering by prefix. Optionally link using drivers."""
+    res = []
+
+    for key, value in src.items():
+        if key.startswith(prefix):
+            new_key = dest_prefix + key[len(prefix):]
+
+            dest[new_key] = value
+
+            info = rna_idprop_ui_prop_get(src, key, False)
+            if info:
+                info2 = rna_idprop_ui_prop_get(dest, new_key, True)
+                for ki, vi in info.items():
+                    info2[ki] = vi
+
+            if link_driver:
+                make_driver(src, quote_property(key), variables=[(dest.id_data, dest, new_key)])
+
+            res.append((key, new_key, value, info))
+
+    return res
+
+
+def copy_custom_properties_with_ui(rig, src, dest_bone, *, ui_controls=None, **options):
+    """Copy custom properties, and create rig UI for them."""
+    if isinstance(src, str):
+        src = rig.get_bone(src)
+
+    bone = rig.get_bone(dest_bone)
+    mapping = copy_custom_properties(src, bone, **options)
+
+    if mapping:
+        panel = rig.script.panel_with_selected_check(rig, ui_controls or rig.bones.ctrl.flatten())
+
+        for key,new_key,value,info in mapping:
+            name = re.sub(r'[_.-]', ' ', new_key).title()
+            slider = type(value) is float and info and info.get("min", None) == 0 and info.get("max", None) == 1
+
+            panel.custom_prop(dest_bone, new_key, text=name, slider=slider)
+
+    return mapping
+
+
 #=============================================
 # Utility mixin
 #=============================================



More information about the Bf-extensions-cvs mailing list