Rigify - saving pbone custom properties to metarig #104695

Merged
Alexander Gavrilov merged 6 commits from Andrej730/blender-addons:rigify_custom_props into main 2023-09-25 21:52:59 +02:00
Showing only changes of commit 48c2e622aa - Show all commits

View File

@ -295,6 +295,7 @@ def write_metarig(obj: ArmatureObject, layers=False, func_name="create",
"""
code = [
"import bpy\n",
"from rna_prop_ui import rna_idprop_ui_create\n",
"from mathutils import Color\n\n",
]
@ -412,6 +413,36 @@ def write_metarig(obj: ArmatureObject, layers=False, func_name="create",
code.append(" except AttributeError:")
code.append(" pass")
# Custom properties
custom_properties = [
custom_property for custom_property in pbone.keys()

Iterate over items() to get both key and value.

Iterate over `items()` to get both key and value.

resolved in 3677cc4549

resolved in 3677cc454907e82731ac2360be5846d988e48e8c
if custom_property not in pbone.bl_rna.properties.keys()
and type(pbone[custom_property]) in (float, int)
]
if custom_properties:
code.append(' # custom properties')
for custom_property in custom_properties:
props_data = pbone.id_properties_ui(custom_property).as_dict()
code.append(f" rna_idprop_ui_create(")
code.append(f" pbone, ")
code.append(f" '{custom_property}', ")
code.append(f" default={props_data['default']}, ")

What if the default isn't equal to the current value? This code doesn't preserve the value anywhere.

What if the default isn't equal to the current value? This code doesn't preserve the value anywhere.

resolved in 3677cc4549

resolved in 3677cc454907e82731ac2360be5846d988e48e8c

I'd quote default with repr too. Also, get rid of trailing spaces.

I'd quote default with repr too. Also, get rid of trailing spaces.

resolved in 076763507e

resolved in 076763507e82ff209f546aba4b2ab03061254d9d
if 'min' in props_data:
code.append(f" min={props_data['min']}, ")
if 'max' in props_data:
code.append(f" max={props_data['max']}, ")
if 'soft_min' in props_data:
code.append(f" soft_min={props_data['soft_min']}, ")
if 'soft_max' in props_data:
code.append(f" soft_max={props_data['soft_max']}, ")
if 'description' in props_data:
code.append(f" description='{props_data['description']}'")

Rather than doing '{foo}', use {repr(foo)}. Manual quoting could be barely tolerated for property names, but for the description it is simply unacceptable.

Rather than doing `'{foo}'`, use `{repr(foo)}`. Manual quoting could be barely tolerated for property names, but for the description it is simply unacceptable.

that's really neat thing about repr, didn't know it can be used that way!
resolved in e2b63e1a4b

that's really neat thing about `repr`, didn't know it can be used that way! resolved in e2b63e1a4b07ffa8ca59eef5b4b2be17189f49ff
code.append(f" )")
if 'precision' in props_data:
code.append(f" pbone.id_properties_ui('{custom_property}').update(precision={props_data['precision']})")
# Constraints

This is still not using repr. Also, step and precision should now be supported directly by rna_idprop_ui_create, I fixed that recently.

This is still not using repr. Also, step and precision should now be supported directly by `rna_idprop_ui_create`, I fixed that recently.

Resolved in ca78100418

Resolved in ca78100418069ed45b340504ffcb55a03327627e
for con in pbone.constraints:

If current_value is actually equal to default, this would be redundant.

If current_value is actually equal to default, this would be redundant.

resolved in 076763507e

resolved in 076763507e82ff209f546aba4b2ab03061254d9d
code.append(" con = pbone.constraints.new(%r)" % con.type)